文档首页> 技术教程> vmstat 与 iostat:分清 CPU 瓶颈还是 IO 瓶颈

vmstat 与 iostat:分清 CPU 瓶颈还是 IO 瓶颈

发布时间:2026-08-22 14:16        更新时间:2026-08-23 10:54
CPU 满、load 高,到底是 CPU 真不够用,还是磁盘把整台机器拖住了?vmstat 和 iostat 这两个命令配合,一次就能分清。前者来自 procps 包,后者来自 sysstat 包,Ubuntu 上要装 sysstat 后 iostat 才可用。 ## vmstat:先分清方向 ``` vmstat 1 5 ``` 每秒采样一次,共 5 次。重点看 procs 和 cpu 两段。r 列是等待 CPU 的可运行进程数,持续大于核数说明 CPU 在排队,属于计算瓶颈;b 列是不可中断阻塞的进程数,通常在等磁盘或网络存储,b 持续大于 0 而 r 不高,基本可以判定瓶颈在 IO。b 列偶发一两个不算问题,持续值才有意义。cpu 段的 wa 列印证这一点:wa 长期高于两成,说明 CPU 大部分时间在等 IO 返回。swap 段的 si、so 两列也别忽略,持续不为零说明内存在和磁盘换页,内存吃紧往往是 IO 高的根源。看到 si、so 活跃,先把内存问题解决,IO 压力常常随之消掉一半。 ## iostat:定位到具体设备 ``` iostat -x 1 3 ``` -x 给出扩展统计,采三次取个平均,避免被瞬间抖动带偏。读三列就够:%util 是设备有读写请求的时间占比,接近 100% 说明设备已打满;await 是请求平均等待加处理耗时(毫秒),机械盘正常几毫秒,云盘与固态盘基线更低,冲到几十上百毫秒就是队列积压;r/s、w/s 配合 rkB/s、wkB/s,区分是"次数多的小 IO"还是"流量大的顺序写"。想给每行采样带上时间戳,vmstat 加 -t 参数。 ## 组合起来定性 vmstat 显示 b 高、wa 高,iostat 显示某块盘 %util 长期满格、await 飙升,结论就是这块盘是瓶颈,动作方向是给这块盘减负:加缓存、降写入、迁移数据。反过来 r 高、us 高而 %util 不高,就是纯计算压力,扩核或优化代码。两块盘都忙时按设备名逐块对比,别把多块盘的指标混在一起看。某块盘是否该扩容,观察高峰时段的 %util 走势,连续多日满格就该动手了。 把这两条加进排障手册,下次再有人说"服务器卡",先跑数据再下结论。