vmstat 的 IO 列判读

bi/bo 是每秒进出块设备的块数,wa 是 CPU 等待 IO 的时间比例;bi/bo 高且 wa 高通常意味着 IO 路径是瓶颈。

vmstat 的 IO 视角

vmstat(procps-ng)从 /proc 汇总系统级内存、进程、CPU 与块设备 IO 数据。与磁盘相关的三列是:bi 每秒从块设备读入的块数、bo 每秒写入的块数、wa CPU 等待 IO 完成的时间占比。它给的是整机口径,用来回答「是不是 IO 拖住了系统」,至于哪块盘、哪个进程,要靠 iostat 与 pidstat -d 下钻。

基本信息

适用平台Linux(procps-ng),部分类 Unix 亦有实现
首行含义自开机以来的平均值,只看第二行起的区间值
关键列bi 读块 / bo 写块 / wa IO 等待占比 / b 不可中断睡眠进程数
块大小默认 1024 字节,受内核与版本影响,换算前先确认
配套工具iostat -dx 看设备,pidstat -d 看进程

典型使用场景

  • 整机变慢初筛:先看 wa 与 r、b 列,判断瓶颈在 CPU、内存还是 IO
  • 批量任务排期:观察备份或压缩任务运行期间的 bo 变化,评估对在线业务的影响
  • 验证缓存效果:预热前后对比 bi 的下降幅度
  • 识别换页写盘:si/so 非零且 bo 高时,写入来自换页而不是业务
  • 宿主巡检:虚拟化与容器宿主上快速确认是否存在 IO 压力

常用命令

常用命令
vmstat 1 5                  # 1 秒间隔采 5 次,第二行起为区间值
vmstat -d 1 3               # 直接查看块设备级的读写与 IO 计数
vmstat -s | head -20        # 汇总统计:换页、中断、上下文切换
iostat -dx 1 3              # 设备级下钻,确认是哪块盘在忙

输出逐列读法

列含义异常判读
r运行队列中的可运行进程数持续大于 CPU 核数说明 CPU 排队
b不可中断睡眠的进程数持续大于 0 通常伴随 IO 或锁等待
si/so每秒换入/换出内存 KB非零说明在换页,会放大磁盘写压力
bi每秒从块设备读入的块数与 wa 同时升高指向读路径瓶颈
bo每秒写入块设备的块数日志落盘或刷盘突增时明显抬升
waCPU 等待 IO 的时间百分比持续偏高说明 CPU 长时间在等盘
wa 只在 CPU 有空闲时才会计入,多核高并发场景下会被摊薄。判断 IO 压力要结合 b 列与 iostat 的设备级数据,不能只凭 wa 下结论。

易错点

  • 把 bi/bo 当字节:它们是块数,块大小需按环境确认后再换算
  • 只看 wa 判 IO 压力,多核机器上会因摊薄而漏判
  • 系统级粒度无法定位设备与进程,异常后必须用 iostat、pidstat 下钻
  • 把首行当现状:vmstat 首行是开机以来的平均值

数据来源与参考

  • procps-ng 文档 vmstat(8)
  • sysstat 文档 iostat(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌