top 命令的load average和vmstat 的r列和b列的关系是什么?区别又是什么?

最近在复习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 是历史平均值,二者概念相关但数值不等价

因此理解这一点,对精准定位系统瓶颈至关重要。