首页/系统/Linux 内核与性能调优速查/vmstat 的 r 列:运行队列长度
CPU 与调度60 条

vmstat 的 r 列:运行队列长度

r 列是等待运行的进程数(含正在运行);持续大于逻辑核数说明 CPU 侧排队,需要结合 cs/in 列区分缺 CPU、锁竞争还是中断风暴。

r 列是什么

vmstat 输出中的 r 列是在采样瞬间处于「可运行」状态的任务数,包含正在 CPU 上执行的与已排入运行队列等待调度的,数据来自内核的运行队列统计。相比 CPU 使用率这类百分比,r 直接反映排队长度,是判断算力是否真不够的开关式指标:持续大于逻辑核数说明有任务在等 CPU,而不是在等 IO 或被限额。

基本信息

数据来源内核运行队列统计(/proc/stat 等)
采样方式vmstat [间隔 [次数]],如 vmstat 1 5
判读基准与该组可用的逻辑核数比较,而非物理核数
关联列b(阻塞)、cs(上下文切换)、in(中断)、wa(等 IO)
易错点首行是自开机以来的累计均值,不是当前值

典型使用场景

  • 判断「CPU 是否真的成为瓶颈」:配合 us/sy 看是算力不足还是锁竞争
  • 区分 CPU 饱和与切换风暴:r 高同时 cs 每秒数万次,多半是锁争用或过度唤醒
  • 定位 IO 型瓶颈:r 高但 wa 也高时,任务在等磁盘/网络,加 CPU 无用
  • 容器与虚机核对:cgroup 限额或 vCPU 超卖时,r 会明显高于实际可调度并行度
  • 容量评估:在压测中观察 r 随并发上升的拐点,估算需要多少核

采样与判读

采样与判读
nproc  # 先确认可用逻辑核数(容器内还要看 cpu.max 配额)
vmstat 1 5  # 每秒采样一次共 5 次,从第二行起才是间隔内数据
# 长时间运行更好:vmstat 1 持续观察
sar -q 1 5  # 需要历史对比时用 sar 看 runq-sz 与 ldavg
cat /sys/fs/cgroup/myapp.slice/cpu.max  # 限额 200000 100000 表示只有 2 核可用
ps -eo pid,stat,pcpu,comm --sort=-pcpu | head  # 找出真正吃掉 CPU 的进程
pidstat -w 1 5  # 怀疑切换风暴时看 cswch/nvcswch 来源

输出逐列读法

列含义正常/异常
r可运行任务数(运行中 + 排队)持续 > 可用核数即排队;偶发尖峰属正常
b不可中断睡眠任务数(多为止于 IO)持续偏高说明存储或网络阻塞严重
cs每秒上下文切换次数单核几千到一万量级常见;数万并有 r 高要查锁与唤醒
in每秒中断次数与网络/磁盘负载相关,突增常伴随中断风暴
wa等待 IO 的时间占比偏高说明瓶颈在存储侧,与 r 高同时出现时尤须注意
vmstat 不带间隔参数时只输出一行「自开机以来」的均值,容易被当成当前状态。要判断当前压力,必须用 vmstat 1 这类带间隔的采样,并忽略第一行。
r 的比较基准是该环境可用的并行度:容器里 cpu.max 限到 2 核时 r=3 已经在排队,虚机里 vCPU 被超卖也会抬高 r。核数用 nproc 与 cgroup 配额共同确认,不要直接抄宿主机的核数。

易错点

  • 拿 r 和物理核数比:开了超线程的机器应比逻辑核数,容器/虚机还要按 cgroup 配额或 vCPU 数折算,基准错了结论就反了
  • 用单次采样下结论:r 是瞬时值,瞬时尖峰不等于长期饱和,至少连续采样 5-10 次看趋势与持续时间
  • r 高 wa 高却继续加 CPU:根因在存储或网络延迟,加核只会让并发更高、排队更长
  • 把 cs 高一律当成瓶颈:上下文切换高需要区分自愿切换(等锁/IO)与非自愿切换,前者说明等待,后者说明被抢占,处理方向完全不同
  • 在容器里直接读 /proc 判断自身负载:多数情况下看到的是宿主全局数据,应与 cgroup 的 cpu.stat、cpu.pressure 交叉验证

数据来源与参考

  • procps-ng 文档 vmstat(8)
  • Linux 内核 Documentation/accounting/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌