Linux 系统负载 Load Average 的正确理解方式

6次阅读

Load Average 是活跃进程队列长度的指数加权平均,统计 R 和 D 状态进程数,非 CPU 使用率;需结合 CPU 核数归一化判断,三值斜率反映趋势,D 状态多时 Load 高但 CPU 可能很低。

Linux 系统负载 Load Average 的正确理解方式

Load Average 不是 CPU 使用率,而是“活跃进程队列长度”的指数加权平均

很多人一看到 load average: 4.2, 3.8, 3.1 就立刻查 top 看 %CPU,结果发现 CPU 才用 30%,误以为“系统没问题”。这是最典型的误解——linux 的 Load Average 统计的是:处于 R(可运行,含正在跑或等 CPU)和 D(不可中断睡眠,如磁盘 IO 等待)状态的进程总数的加权平均,不是 CPU 时间占比。

这意味着:

  • D 状态进程多(比如大量进程卡在 ps aux | grep D),Load 会飙升,但 CPU 使用率可能很低
  • 单核 CPU 上 Load = 4 表示平均有 4 个进程在争抢 1 个核,其中 3 个在排队;四核机器上 Load = 4 才是理想满载
  • Load 是指数平滑值(calc_load() 函数实现),每 5 秒采样一次,不是简单算术平均——所以它滞后、平滑,适合看趋势,不适合抓瞬时尖刺

怎么看才不误判:必须结合 CPU 核数做归一化比较

直接说“Load > 1 就危险”只对单核成立。真实服务器几乎全是多核,正确做法是用 load / $(grep -c 'model name' /proc/cpuinfo) 得到“每核平均负载”。

实操建议:

  • 运行 grep -c 'model name' /proc/cpuinfo 获取逻辑 CPU 数(注意:超线程也计入,但实际调度能力≠物理核心数)
  • 若结果是 8,那么 load average: 7.9, 7.2, 6.5 属于健康区间;而 12.0, 11.5, 11.0 就意味着每核平均排队 1.5 个进程,需排查
  • 警惕 load > 3 × CPU数:此时通常伴随明显延迟(如 ssh 登录慢、ps 命令卡顿),说明 R+D 进程严重积压

三个数值(1/5/15 分钟)的组合读法,比单看一个数重要得多

它们不是“过去 1 分钟、过去 5 分钟、过去 15 分钟”,而是三个独立的 EMA 滤波器输出,时间常数不同。关键看斜率和收敛性:

  • 1.0, 3.2, 5.8 → 负载在快速上升,可能是突发任务或资源泄漏,需立刻查 ps aux --sort=-pcpu,-pmemiostat -x 1
  • 6.1, 5.9, 5.7 → 长期高位稳定,大概率是常态过载,检查是否该扩容或优化 IO(尤其是 D 状态进程)
  • 0.2, 2.1, 4.5 → 负载在回落,说明之前的问题已缓解,不用紧急干预
  • 特别注意:1 分钟值 是典型“问题正在收尾”信号,别误当成恶化

真正要命的不是高 Load,而是高 Load + 高 D 状态进程

当 Load 高但 %wa(iowait)低、CPU idle 高,大概率是 CPU 密集型任务;但如果 %wa > 20% 且大量进程显示 D 状态,说明系统卡在存储层——这时杀进程没用,得查磁盘、RaiD、NVMe 健康度或 NFS 服务端响应。

快速定位步骤:

  • 执行 ps -eo stat,pid,comm | grep '^[[:space:]]*D' 看哪些 PID 处于 D 状态
  • cat /proc//stack 查该进程卡在哪个内核函数(常见如 wait_on_page_bit, __nvme_submit_sync_cmd
  • 对比 cat /proc/loadavg 第四个字段(当前 R 进程数)和第五个字段(当前 D 进程数),若后者持续 > 5,基本锁定 IO 瓶颈

最易被忽略的一点:某些云厂商虚拟机的“伪 D 状态”(如 Xen 的 UN 状态)不会计入 Load,但会导致类似现象——这时候 /proc/loadavg 数值反而偏低,不能全信。

text=ZqhQzanResources