广告广告位招商联系 ads@iiunion.comA5 · 728×90(移动端 320×100) · 参考价 ¥300/月了解详情 →

问答:Linux 服务器 load average 很高但 CPU 不忙,怎么排查?

Started by iiunion编辑部 · 2026-10-21 12:35 UTC · 6 views · 1 replies
I Editorial
这是运维群里最常见的问题之一:top 里 load average 到了 20+,CPU 使用率却只有 10%。本帖用问答形式整理排查思路。

问 1:load average 到底统计的是什么?
答:Linux 的 load average 统计的是处于“可运行”(R,正在运行或等待 CPU)和“不可中断睡眠”(D,通常在等待磁盘或网络存储 I/O)状态的任务数的指数加权平均(1/5/15 分钟)。所以 load 高 ≠ CPU 忙,D 状态的进程同样会推高 load。

问 2:第一步看什么?
答:先区分是 R 多还是 D 多:
1. vmstat 1:看 r 列(运行队列)和 b 列(阻塞在 I/O 上的进程),以及 wa(I/O 等待);
2. ps -eo state,pid,cmd | awk '$1=="D"' 列出 D 状态进程,看它们是谁。

问 3:D 状态进程很多,怎么继续查?
答:
1. iostat -x 1:看各磁盘的 %util、await、aqu-sz,确认是哪块盘慢;
2. 如果是 NFS/网络存储,检查挂载点是否响应(D 状态进程卡在 nfs 相关函数),网络存储故障时 load 会持续上涨;
3. cat /proc/<pid>/stack(需要 root)或 cat /proc/<pid>/wchan 看进程卡在哪个内核函数;
4. 有 PSI 的内核(4.20+)直接看 /proc/pressure/io 和 /proc/pressure/cpu,some/full 的数值能更直观地反映资源压力。

问 4:R 多但 CPU 使用率不高,可能吗?
答:可能。容器或 cgroup 设置了 CPU 配额(cpu.max),进程被限流时处于可运行状态却拿不到 CPU,这时看 cgroup 的 cpu.stat 里的 nr_throttled 和 throttled_usec。另外虚拟机上 top 的 st(steal)高,说明宿主机 CPU 被其他虚拟机占用。

问 5:load 多高才算高?
答:要和 CPU 核数一起看:持续超过核数说明有任务在排队。但对于 I/O 引起的高 load,更关键的是业务延迟是否受影响,结合 PSI 和应用指标判断,不要只盯着 load 数字。

欢迎补充你遇到过的“load 高但 CPU 闲”的奇怪原因。
I Member
补充两个实战中遇到过的冷门原因。一是内存回收:内存快耗尽时,kswapd 和直接内存回收(direct reclaim)会让大量进程卡进 D 状态,load 冲到几十但 CPU 几乎是闲的。这时 top 的 wa 可能都不高,容易误判。建议看 /proc/pressure/memory 的 some 值和 sar -B 的 pgscank/pgsteal,some 持续走高就说明系统在拼命回收内存,根因往往是某个进程在缓慢泄漏,或者 page cache 被脏页占满、回写跟不上(dirty_ratio 配得过大时会有回写风暴)。

二是坏盘:磁盘出现坏道或 RAID 降级时,单次 I/O 会触发底层的错误恢复流程,一次能卡几十秒,大量进程堆积在 D 状态,load 直接上百。特征是 iostat 的 await 飙到秒级,dmesg 里能看到 I/O error 或 SCSI error。这时候先查 dmesg 和 smartctl 确认盘的健康度,别急着加盘扩容,加盘救不了坏道。
广告广告位招商联系 ads@iiunion.comA6 · 728×90(移动端 320×100) · 参考价 ¥200/月了解详情 →
Log in or register to reply.