服务器负载很高但业务正常该如何判断
学完这篇你能按一套可执行的检查顺序,判断“负载高但业务正常”是短时尖峰、IO 阻塞、内存回收、容器争抢还是虚拟化偷取,并决定要不要处理。
第一步:先确认负载是不是真高,以及高在哪一项
这一步先看负载数值和趋势,做完你能知道它是短时尖峰还是持续偏高,以及相对几核。在终端执行:
uptime
cat /proc/loadavg
nproc
top -b -n1 | head -n 5
/proc/loadavg 三个数分别是 1、5、15 分钟平均负载。用 nproc 得到核数,负载长期高于核数才叫偏高。如果只有 1 分钟高、15 分钟低,通常是短时任务。宝塔面板 8.0.5 可在左侧菜单“监控”->“系统监控”看负载曲线;阿里云云监控在“实例详情”->“监控”->“操作系统监控”看。
注意:Linux 的 load average 不只算 CPU 运行队列,还把不可中断睡眠进程算进去,所以 CPU 空闲时负载也可能高。
第二步:看 CPU 时间都花在哪
这一步拆开 CPU 时间,做完你能区分是用户态计算、内核态、IO 等待还是虚拟化偷取。执行:
vmstat 1 5
mpstat -P ALL 1
在 vmstat 输出里看 us、sy、wa、st、id。wa 高说明 CPU 在等 IO;st 高说明宿主机把 CPU 时间分给了别的虚拟机;id 高但 load 高,重点查 D 状态进程。mpstat 来自 sysstat 12.5.4,按核看更清楚。
注意:
vmstat第一行是自启动以来的平均值,从第二行开始看。
第三步:抓不可中断睡眠进程 D
这一步找抬高负载但杀不掉的进程,做完你能定位到卡在内核里的 PID。执行:
ps -eo state,pid,ppid,wchan:32,cmd | awk '$1=="D"'
for p in $(ps -eo state,pid | awk '$1=="D"{print $2}'); do echo "== $p =="; cat /proc/$p/stack; done
wchan 会显示内核等待函数,/proc/PID/stack 需要 root。常见原因有磁盘、NFS、驱动、内核回写。
注意:D 状态进程连
kill -9也杀不掉,先解决它等待的磁盘或网络挂载。
第四步:确认磁盘和文件系统是否饱和
这一步查 IO 瓶颈,做完你能判断负载是不是磁盘拖出来的。执行:
iostat -x 1 5
iotop -oPa
df -hT
dmesg -T | tail -n 50
重点看 %util、await、r_await、w_await、aqu-sz。%util 接近 100 且 await 持续很高,说明磁盘饱和。dmesg 里出现 NFS、EXT4、XFS 报错要优先处理。
注意:业务正常可能因为读缓存或异步写挡了一阵,不等于 IO 没问题。
第五步:查内存与 swap,排除直接回收
这一步看内存压力,做完你能知道负载是否来自页回收和 swap。执行:
free -h
vmstat 1 5
pidstat -r -p ALL 1
slabtop -s c
vmstat 的 si、so 持续非 0,free 的 available 很低,说明系统在换入换出。pidstat -r 能找出缺页多的进程。
注意:swap 有占用不等于有问题,持续换入换出才是问题。
第六步:容器、虚拟化和 cgroup 限制
这一步确认负载是不是宿主机或其他容器带来的,做完你能避免误判。容器内执行:
cat /sys/fs/cgroup/cpu.max
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
docker stats --no-stream
kubectl top pod -A
cgroup v2 看 cpu.max,v1 看 cpu.cfs_quota_us。如果容器内 load 高但自身 CPU 被限制,可能是宿主机负载透传。物理机看 top 的 %st。
注意:容器里的 loadavg 有时显示宿主机数值,不一定是你的容器造成的。
第七步:按业务 SLO 决定处不处理
这一步做决策,做完你能知道该继续观察还是动手。先看错误率、P95/P99、QPS、线程池队列。若业务指标正常、负载只是短时高、D 进程少,可以保留证据后观察。若 iowait 持续大于 20%、D 进程多、swap 持续抖动、负载 15 分钟仍上升,就处理:限流、迁移实例、扩容磁盘、调整 IO 调度器、升级驱动或内核。
注意:不要为了把 load 降到 1 就重启业务,先保存
top -b -n1、vmstat 1 5、iostat -x 1 5、D 进程列表和dmesg。
小结
- 负载高不等于 CPU 忙,先看 1/5/15 分钟趋势和核数。
- 用
vmstat、mpstat区分 us、sy、wa、st、id。 - D 状态进程会抬高负载,且
kill -9无效。 - 磁盘看
%util、await,内存看si/so和 available。 - 容器和虚拟机要排除宿主机负载与 cgroup 限制。
- 业务 SLO 正常可观察,持续恶化再处理,先留证据。
原文链接:https://www.gj0.com/thread-216.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。