vmstat 深入:换页、运行队列与上下文切换
更新时间:2026-09-19。基础用法见 vmstat 速查。这篇逐项讲清每一列的性能含义和判读阈值,让一行 vmstat 输出就能区分 CPU 瓶颈、IO 瓶颈还是内存换页。
一、字段全景
bash
vmstat 1 5 # 每秒一行,共 5 次(第一行是开机以来平均,忽略)
vmstat -w 1 # 宽版,列对齐
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 20480 210000 90000 7200000 0 0 120 40 9000 21000 62 18 18 2 0二、procs:运行队列 r 与阻塞 b
- r(run queue):正在运行 + 等待 CPU 的线程数。持续 > 物理核数说明 CPU 不够用(和 runqlat 对应);偶发尖峰正常。
- b:不可中断睡眠(D 状态,通常在等 IO)的进程数。持续 >0 且 wa 高,指向磁盘/存储瓶颈;大量 D 状态叠加见平均负载的解读。
三、memory:swpd/free/buff/cache
swpd 已用 swap;free 空闲;buff/cache 缓冲/页缓存(可回收,见 free 深入)。swpd 不为 0 不必恐慌,关键看下面的 si/so 是否在动。
四、swap:si / so(最重要的内存压力信号)
| 列 | 含义(每秒 KB,老口径) |
|---|---|
| si | swap in:从交换区换入内存 |
| so | swap out:从内存换出到交换区 |
- si/so 持续为 0:即使 swpd 有值,也只是冷页曾被换出,不影响当前性能。
- si/so 持续非 0(尤其双向都大):正在发生换页抖动(thrashing),磁盘被换页占满、系统严重变慢,这是真内存不足,处理方向是减内存/扩内存/查泄漏,而不是调 CPU。
- 突发 so 可能是回收冷页;持续 si 且业务延迟高,说明热页也被换出了。
五、io:bi / bo
- bi/bo:每秒从块设备读入/写出(blocks/s,通常 1 block=512B 或 1K,按版本)。
- bo 持续高:大量写(日志/WAL/刷脏页);bi 高 + b/wa 高:读 IO 等待。
- 更细的设备级 await/util 用 iostat,分布用 biolatency。
六、system:in / cs(中断与上下文切换)
- in:每秒中断数(含时钟中断、网卡硬中断)。网卡流量大时 in 飙升要查多队列 RSS、
mpstat的软中断。 - cs(context switches):每秒上下文切换次数。
- 自愿切换(等 IO/锁)高:说明线程频繁阻塞,多为 IO/锁等待,不是 CPU 算不过来。
- 非自愿切换(时间片用完被抢占)高 + r 大:说明线程多、CPU 紧。
- 线程数远超核数、锁竞争激烈(
cs很高而 us 不高)也会让大量时间耗在切换而非干活。用 pidstat -w 可拆自愿/非自愿切换。
cs 绝对值没有统一阈值,要看与负载的关系:几万/秒在高并发网络服务里可能正常,关键是高 cs 是否伴随高 r、低吞吐和延迟上升。
七、cpu:us/sy/id/wa/st
| 列 | 含义 | 判读 |
|---|---|---|
| us | 用户态 | 高=应用计算重(CPU bound),用 perf 找热点 |
| sy | 内核态 | 过高(如 >20%~30%)说明系统调用/网络/上下文切换频繁,看是否短连接、小包、线程过多 |
| id | 空闲 | 长期接近 0 且 r 大=CPU 饱和 |
| wa | IO 等待 | 高(>10%~20%)+ b/bi 高=IO bound,CPU 在等磁盘 |
| st | 被虚拟化偷取(steal) | 云主机上持续高说明宿主机超卖/邻居吵闹,需升配/迁移 |
八、几种典型组合
bash
CPU bound: r≈核数或更高, us 高, id≈0, si/so=0, wa 低
IO bound: b>0, wa 高, bi/bo 高, id 有余, us 不高
内存换页: si/so 持续非零, swpd 涨, cs/in 上升, 整体卡顿
软中断网络: sy/in 高, 某核软中断打满(配合 mpstat), 网卡流量大
被超卖(云): st 持续高, 但自己负载不重坑
- 只看 swpd 就断定内存不足,忽略 si/so 才是活动换页信号。
- 把高 cs 一律当 CPU 瓶颈:等待 IO/锁的自愿切换不代表算力不足。
- 忽略第一行(开机以来平均),应从第二行起看实时值。
- wa 高就只怪磁盘:现代多核/虚拟化下 iowait 口径有局限,要结合 b 队列和 iostat。
- 云主机不看 st,性能抖动错怪应用。
总结
vmstat 用 procs 的 r 判断 CPU 排队、b 判断 IO 阻塞,用 swap 列持续非零的 si/so 识别真正的换页抖动(而非 swpd 静态值),用 bi/bo 和 cpu 的 wa 区分读写磁盘瓶颈,用 in/cs 判断中断与上下文切换压力,并结合 us(用户态算力)、sy(内核/系统调用)、id 和云环境的 st 偷取,把问题快速归类为 CPU bound、IO bound、内存不足或虚拟化超卖,再用 perf、iostat、pidstat、mpstat 等工具下钻确认。