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 闲”的奇怪原因。
问 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 闲”的奇怪原因。