Linux 负载高不等于 CPU 高,需结合运行队列、I/ O 等待和 D 状态进程综合判断;load 值反映单位时间运行或不可中断睡眠态进程均值,>逻辑核数即存在争用,长期> 2 倍需立即排查;D 状态进程是常见主因,可用 ps、/proc/PID/stack 定位;I/ O 瓶颈看 iostat - x 的 await、%util 与 avgqu-sz;还需排查内存不足、内核 bug 及 cgroup 限制。

Linux 系统负载过高,不等于 CPU 使用率高,需从 运行队列 、I/ O 等待、 不可中断状态进程 三方面综合判断。直接看 top 或htop里的 %CPU 容易误判,关键要看 uptime 或cat /proc/loadavg输出的三个数字(1/5/15 分钟平均负载),再结合 vmstat、iostat、ps 等工具 定位根因。
看懂 load 值到底代表什么
Load 值反映的是单位时间内处于 运行态 或不可中断睡眠态(D 状态)的平均进程数。比如单核 CPU 上 load=3,意味着平均有 3 个进程在争抢 CPU 或等待磁盘 I /O,其中 2 个大概率在排队。注意:load 高 ≠ CPU 满,可能是大量进程卡在磁盘读写、NFS 挂载、锁竞争或内核态等待中。
- load 值 > CPU 逻辑核数,说明系统存在资源争用
- load 长期高于 CPU 核心数×2,需立即排查
- 对比
uptime和mpstat -P ALL 1,若 CPU 空闲率高但 load 飙升,基本可排除纯 CPU 瓶颈
快速定位 D 状态进程(最常见诱因)
D 状态进程无法被信号中断,通常卡在内核 I / O 路径(如坏盘、NFS 超时、RAID 重建、cgroup 限制、ext4 journal 阻塞)。它们不消耗 CPU,却持续计入 load,是 load 虚高主因。
- 执行
ps aux | awk '$8 ~ /D/ {print $0}'列出所有 D 状态进程 - 重点检查其
WCHAN列(内核等待函数),常见如nfsservd、ext4_journal_start、call_rwsem_down_read_failed - 用
cat /proc/查看该进程内核调用 栈,确认卡在哪个驱动或子系统/stack
检查 I / O 延迟与存储瓶颈
即使没有 D 状态进程,高 I / O 等待(%iowait)也会推高 load。但要注意:%iowait 在现代内核中统计口径有变化,不能单独依赖它;更可靠的是看 iostat -x 1 中的await(平均 I / O 响应时间)、%util(设备忙时百分比)和avgqu-sz(平均队列长度)。
-
await > 10ms(SSD)或> 50ms(HDD)表明 I / O 响应变慢 -
%util 接近 100%且avgqu-sz 持续>4,说明设备已饱和 - 用
lsof +D /path或pidstat -d 1定位高 I / O 进程
排查其他隐蔽因素
部分场景下 load 升高与常规资源无关,需针对性验证:
- 内存严重不足:触发直接回收或 OOM Killer 前,进程频繁进入 D 状态等待内存页释放,查
free -h、cat /proc/meminfo | grep -i "oom|commit" - 内核 bug 或驱动异常 :如某些 网卡驱动 在高包量下导致软中断堆积,用
cat /proc/interrupts观察 CPU 间中断分布是否严重不均 - cgroup 资源限制 :容器或 systemd 服务配置了
CPUQuota或MemoryLimit,进程被节流后排队,查systemctl show| grep -i limit