vmstat关键指标需交叉验证:r持续≥CPU核数×1.5、b≥2且wa>20%表IO瓶颈;si/so>0才表明swap压力;sy远高于us需查系统调用;wa高时us+sy高是假象;st>5%说明宿主机资源被抢占。
vmstat 不是“看一眼就懂”的工具,关键指标容易误读,尤其在多核、高IO或内存压力场景下,直接看 us 和 id 可能完全错过瓶颈。
怎么看 r 和 b 才知道 CPU 或 IO 真的忙了
很多人只盯着 r(运行队列长度)是否大于 CPU 核数,但忽略了时间维度和上下文:
-
r值瞬时跳到 8 不代表问题,要连续观察 5~10 行,若长期 ≥ CPU 总核数 × 1.5(比如 4 核机器持续 r≥6),才说明 CPU 调度排队严重 -
b(不可中断睡眠进程数)> 0 是常态,但若b持续 ≥ 2 且wa> 20%,基本可锁定是磁盘 IO 卡住进程(如慢存储、锁表、sync 压力) - 注意:
r高 +b高 +wa低 → 更可能是大量短时系统调用(如频繁open()/close()),不是磁盘慢,而是内核路径开销大
swpd 不为 0 就一定内存不足?别急着加 RAM
swpd 显示交换区已用大小(KB),但它本身不反映压力。真正要看的是交换活动:
- 只要
si(swap in)和so(swap out)长期稳定为 0,哪怕swpd是几 GB,也只是内核预分配的“备用空间”,不影响性能 - 危险信号是:
si或so持续 > 0(尤其 > 10 KB/s),同时free极低(如 cache 被大量回收(对比前后行cache值明显下降) - 某些 Java 应用启动时会主动触发 swap 预分配,
swpd上升但无si/so,属正常行为,不用干预
为什么 us + sy > 80% 还不一定 CPU 不够
us(用户态)和 sy(内核态)加起来高,只说明 CPU 时间被占满,但不等于“需要更多 CPU”:
Kaiber
Kaiber是一个视频生成引擎,用户可以根据自己的图片或文字描述创建视频
下载
- 如果
sy占比远高于us(比如sy=65%,us=15%),重点查系统调用:用pidstat -w 1看哪些进程cswch/s(上下文切换)异常高,再结合strace -p PID定位高频调用(如epoll_wait卡死、锁争用) - 如果
wa同时很高(>30%),us+sy高其实是假象——CPU 大量时间在等 IO,实际计算能力未饱和,此时升级 CPU 无效,应查磁盘延迟或应用层批量读写逻辑 - 虚拟机环境还要看
st(steal time):若st> 5%,说明宿主机 CPU 被其他 VM 抢占,本机再优化也白搭
vmstat 的最小可靠采样间隔是多少
用 vmstat 1 看实时波动很诱人,但 1 秒间隔在多数生产环境反而失真:
- Linux 内核统计基于 tick(通常 10ms),
vmstat的采样是离散快照,间隔太短会导致噪声放大(比如单次磁盘延迟抖动拉高wa) - 推荐起始值:
vmstat 5(5 秒)观察趋势;确认有异常后再用vmstat 1 10抓 10 秒细节 - 避免
vmstat 0.5这类亚秒级——它不会提高精度,反而因频繁系统调用抬高自身sy,污染数据 - 长期监控建议用
vmstat 10 144(每 10 秒一次,共 144 次 = 24 分钟),导出后用脚本聚合分析峰值/均值,比肉眼盯屏可靠得多
真正难的不是跑出 vmstat,而是把 r、b、wa、cs 这几个数字放在同一时间轴上交叉验证——单独看任一列,都可能指向错误的方向。
