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 配额共同确认,不要直接抄宿主机的核数。