最近在复习linux系统负载问题排查,主要涉及到cpu,内存,io,网络等指标的一些习惯的linux命令,发现top命令的load average指标和vmstat指标的r列以及b列似乎有些联系,但是又搞不懂具体是什么关系,又有什么区别,于是便上网查询整理了一下,以便日后学习工作中再次用到
# 一、vmstat 的 r 列 含义
vmstat 输出示例(关注前几列):
点击查看代码
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 1 123456 123456 123456 123456 0 0 10 20 100 200 10 5 80 5 0
r(running or runnable):
表示处于运行态(running)或就绪态(runnable)的进程数,即正在使用 CPU 或等待 CPU 调度的进程数量。
✅ 不包括处于不可中断睡眠(D 状态)的进程。
b(blocked):
在较老版本的 vmstat 中,b 表示阻塞等待资源的进程数。
⚠️ 但在现代 Linux(自 procps-ng 修订后)中,b 列实际上表示的是处于不可中断睡眠状态(TASK_UNINTERRUPTIBLE)的进程数,即通常所说的"D 状态"进程(如等待磁盘 I/O)。
📌 注意:man vmstat 中对 b 的描述可能滞后,实际行为以内核和 procps 版本为准。现代 Linux 中,b ≈ D 状态进程数。
二、Load Average 的组成
Linux 的 Load Average(通过 /proc/loadavg 获取)定义为:
系统中 处于可运行状态(TASK_RUNNING) 或 不可中断睡眠状态(TASK_UNINTERRUPTIBLE) 的进程的指数加权移动平均数。
也就是说:
Load Average ≈ avg( runnable 进程数 + D状态进程数 )
这是 Linux 特有的设计(与传统 Unix 不同,后者通常只统计 runnable 进程)。
三、top 中的 Load Average
top 命令顶部显示的 load average(如 load average: 1.25, 0.98, 0.76)直接来自 /proc/loadavg,因此其含义与上述一致:
✅ 包含 runnable + D 状态进程。
四、关键对比:vmstat 的 r + b 是否等于 Load Average?
理论上:
r ≈ runnable 进程数(对应 TASK_RUNNING)
b ≈ D 状态进程数(TASK_UNINTERRUPTIBLE)
Load Average ≈ runnable + D 状态进程 的时间加权平均值
实际上:
r + b 是某一瞬间的快照值(瞬时值)
Load Average 是过去 1/5/15 分钟的平滑平均值(带指数衰减)
因此:
❌ r + b 的瞬时值 ≠ Load Average 的数值
✅ 但 r + b 的长期趋势应与 Load Average 一致。如果 load 很高,通常 r + b 也会较大。
举例说明:
假设系统有 4 个 CPU 核心:
某时刻 vmstat 显示:r=3, b=2 → 瞬时活跃任务数 = 5
但过去 1 分钟大部分时间系统很空闲,只有偶尔 spike → 1 分钟 load average 可能只有 1.0
反之:
如果持续有 6 个任务(r=4, b=2)运行几分钟 → 1 分钟 load average 会逐渐接近 6
五、总结对比表

六、实用建议
若 Load Average 高但 r 很小、b 很大 → 很可能是 I/O 瓶颈(如慢磁盘、NFS 卡住)
若 Load Average 高且 r 很大 → CPU 资源不足,需优化代码或扩容
使用 ps aux awk '$8 ~ /^D/' 查看 D 状态进程
使用 iostat -x 1 查看 I/O 利用率(%util)和等待时间(await)
✅ 结论:
综上vmstat 的 r 列不包含 D 状态进程,b 列在现代 Linux 中代表 D 状态进程数
Load Average = runnable + D 状态进程 的时间平均值
r + b 是瞬时值,Load Average 是历史平均值,二者概念相关但数值不等价
因此理解这一点,对精准定位系统瓶颈至关重要。