Ubuntu Server 运行缓慢的原因与排查
Ubuntu Server(以24.04 LTS Noble Numbat系列及后续点版本为主)在生产环境中“突然变慢”或“持续响应迟钝”是运维最常见的痛点之一。慢的表现形式多样:SSH登录卡顿、命令执行延迟、Web/API响应时间暴增、容器/数据库吞吐下降、负载平均值异常高等。
根本原因几乎总是四大资源之一(或组合)达到饱和或严重争用,导致内核调度、I/O等待或上下文切换开销爆炸。以下按发生概率从高到低排序,并给出系统化的排查思路。
一、常见根本原因分类(概率排序)
- CPU 争用或调度问题(最常见,~40%案例)
- 高负载进程/线程抢占(应用bug、爬虫、挖矿脚本)
- CPU steal 时间高(云VPS超售、noisy neighbor)
- CPU governor 为 powersave/ondemand,导致频率上不去
- 高软中断(网络洪水、irq不均衡)
- 内存压力 + Swap Thrashing(第二大杀手,~25–30%)
- 内存泄漏或 OOM 前兆(进程不断申请未释放)
- Swap 使用率飙升 → 磁盘IO爆炸 → 系统整体卡死
- zram/swapfile 配置不当,或 zram 压缩比过高
- 磁盘 I/O 瓶颈(尤其是根分区或 /var/lib/docker)
- 日志/journald 无限增长未轮转
- Docker/Podman 镜像/容器/volume 堆积
- 高写负载服务(数据库、日志服务)写满磁盘或预留空间耗尽
- 硬件问题:SSD过热节流、HDD坏道、NVMe PCIe带宽饱和
- 网络栈或中断问题(高并发场景常见)
- 网络拥塞、丢包、TCP backlog 溢出
- 高软中断(softirq)占用(网络包洪水)
- DNS 解析慢(导致服务启动/连接延迟)
- 内核/系统级问题(较少但致命)
- 内核 bug 或 mitigations 开销(Spectre/Meltdown缓解)
- cgroup v2 限制过严(容器场景)
- systemd 服务依赖死锁或启动超时
- 其他隐蔽原因
- 过热导致 CPU/GPU/SSD 降频(物理服务器常见)
- 恶意软件/后门(罕见但需警惕)
- 配置漂移(旧内核残留、snap 缓存爆炸)
二、标准排查流程(推荐顺序,5–15分钟内定位80%问题)
阶段1:快速概览(30秒–1分钟)
Bash
# 1. 整体负载与资源快照
uptime # load average 数值含义:1/5/15分钟平均运行队列长度
top # 按1查看每个核,按Shift+M 按内存排序
# 或 htop / btop(推荐安装)
# 2. 内存与Swap使用
free -h # available 才是真正可用内存
vmstat 1 5 # si/so 列 >0 表示正在Swap
# 3. 磁盘使用与inode
df -hT # 哪个分区满?
df -i # inode耗尽?
iostat -x 1 5 # %util接近100% = IO瓶颈
# 4. CPU steal(云环境必看)
mpstat 1 5 # %steal >5–10% 说明宿主机抢CPU快速判断规则:
- load average >> CPU核数 → CPU争用
- free 显示 available < 总内存10% 或 swap used >0 → 内存压力
- df 显示 / 或 /var >90% → 磁盘满
- iostat %util 高 + await >10–20ms → IO瓶颈
- mpstat %steal 高 → 云超售,考虑升级套餐
阶段2:定位罪魁祸首(2–5分钟)
Bash
# 1. 找吃CPU的进程
top / htop → 按CPU排序,看前几名
ps aux --sort=-%cpu | head -10
# 2. 找吃内存/泄漏的进程
top → Shift+M 排序
ps aux --sort=-%mem | head -10
# 3. 找IO占用狂魔
iotop -o # 只显示有IO的进程(需安装)
# 或 pidstat -d 1 查看每个进程的磁盘读写
# 4. journal 日志空间(常见元凶)
journalctl --disk-usage
du -sh /var/log/*
# 5. Docker/容器相关(如果用了容器)
docker system df
docker stats --no-stream阶段3:深入诊断特定场景
- 高 steal 时间(云VPS) → 监控一段时间,如果持续>10%,基本是宿主机超售 → 迁移实例或升级规格
- Swap Thrashing → swappiness 降到10(vm.swappiness=10),启用zram(sudo apt install zram-config)
- CPU 频率不上 → 检查 governor:cpupower frequency-info 或 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor → 服务器场景切换 performance:echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
- 日志/缓存爆炸 → journalctl --vacuum-size=500M 临时清理 → 配置 /etc/systemd/journald.conf 限制 SystemMaxUse
- 网络/中断问题 → sar -n DEV 1 5 看网络吞吐 → cat /proc/interrupts 看中断分布 → softirq 高 → 可能网络洪水或驱动问题
三、预防与长期优化建议
- 安装监控:Netdata(实时仪表盘)或 Prometheus + node_exporter(趋势+告警)
- 关键告警:CPU >90%持续5min、内存available <15%、磁盘>85%、steal>5%、swap used>0
- 定期维护:apt autoremove、journal vacuum、docker prune、snap 清理旧版本
- 云环境:避免低配共享型实例,使用burst或专用型
- 应用层优化优先:索引、缓存、连接池、异步等,通常收益远超系统调参
一句话总结排查思路:
“先看 uptime/top/free/df/iostat/mpstat 四大金刚 → 定位资源饱和类型 → 用 htop/iotop/journalctl/docker stats 深挖进程/服务 → 针对性清理/调参/扩容/迁移”
绝大多数“服务器突然变慢”都能在上述流程中找到根因,极少数才是内核/硬件深层问题。遇到卡死无法登录时,优先通过云控制台或物理KVM查看 top/mpstat。
版权声明:
作者:后浪云
链接:https://idc.net/help/442453/
文章版权归作者所有,未经允许请勿转载。
THE END
