登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux vmstat 指标与 I/O 等待的判断

来源:17golang原创

时间:2026-10-28 13:35:49 225浏览 收藏

Linux vmstat 判断 I/O 等待时,应把 wa、b 与 bi/bo 放在同一个采样窗口里观察:wa 属于 CPU 时间比例,b 是等待 I/O 的阻塞任务数,bi/bo 描述块设备吞吐。它们可以提供排查方向,却不能单独证明某块磁盘已经满载。

wa 高是继续调查 I/O 等待的线索,不是磁盘利用率;wa 低也不能排除某个请求正在等待存储。先统一统计周期,再补设备延迟和业务时延,结论才有依据。

本文以 procps-ng 提供的 vmstat 为范围,使用一个原创排查场景:接口变慢,应用 CPU 使用不高,需要判断是否值得沿存储方向继续调查。下列命令用于读者采样,没有在本文生成环境运行,也不提供虚构的终端输出。

vmstat 手册地址:https://man7.org/linux/man-pages/man8/vmstat.8.html

先限定 vmstat 能回答的问题

vmstat 适合做主机概览:看看可运行任务、阻塞任务、内存和交换活动,以及 CPU 时间分布。它能帮助区分“主要在运算”“存在等待线索”“同时有换页活动”等方向,但默认概览没有告诉你哪个设备、哪个进程、哪个文件导致了等待。

因此,面对接口变慢,可以把问题缩成两个层次:主机同一时间是否出现等待迹象,业务依赖的设备是否出现延迟或排队。第一层由 vmstat 提供线索,第二层需要设备和业务侧记录,不能直接从主机总吞吐跳到更换磁盘的决定。

vmstat 任务、CPU 时间和吞吐指标的分组关系
静态结构图:b、wa、bi/bo 属于不同统计维度,需要结合采样窗口一起解释。

用有限采样避开首行误读

# 记录本机实现与可用选项,避免套用其他版本表头。
vmstat --version
vmstat --help

# 每秒更新,使用有限次数,保留表头并附时间戳。
vmstat -w -t 1 11

默认首行中的累计速率和 CPU 时间比例反映开机以来的统计,而后续行反映采样间隔。进程和内存部分即使在首行也是瞬时信息。因此不能把首行整行都当成过去一秒,也不能把其中每个字段都称为开机均值。

读取上面的报告时,保留首行但将它与后续区间分开。若本机支持 -y,可以省略首个开机统计报告:

# 本机支持 -y 时,略过开机以来的首个报告。
vmstat -y -w -t 1 10

如果某选项不可用,就使用本机支持的基本命令,并手动区分首行,不必为了采样升级整套系统。出现字段挤在一起时,宽输出有助于读表;自动化解析则应依据实际表头,而不是写死“第几列就是 wa”。

把 wa、b 和 bi/bo 放在一起看

字段统计含义不能直接推出的结论
waCPU 时间中归入 I/O 等待的比例不是某块磁盘繁忙百分比
b等待 I/O 完成的阻塞任务数不是设备请求队列长度
bi、bo块设备读入、写出的吞吐速率不是 IOPS,也不是请求耗时
r正在运行或等待运行的任务数不等于 I/O 等待任务数
si、so交换入、交换出活动不能只凭 swpd 非零认定正在频繁换页

当前 procps-ng 手册将 bi/bo 定义为 KiB/s。-S 改变内存和交换部分的显示单位,不改变 bi/bo;在旧工具或其他实现上,应以对应手册为准。尤其不要把 bi=某个数值口头翻译成每秒相同数量的磁盘请求。

在原创场景中,如果接口时延升高期间,连续多个样本的 wa 和 b 都相对正常期抬升,可以提出“I/O 等待可能参与了变慢”的假设。如果同时有持续 si/so,则应把内存压力引起的交换活动也放入考虑。这是调查方向,不是已经证明的根因。

另一个可能情况是 bi/bo 很高,但 b 没有持续积累,业务时延也稳定。这可能只是吞吐型任务正常读写。反过来,吞吐不高而等待明显,也可能是小请求延迟、同步写或其他因素,不能因为 MB/s 没到设备标称带宽就否定存储问题。

用同一时间窗补齐设备证据

如果 Linux 主机已安装 sysstat,可以在同一观察窗口取得设备扩展统计。应在业务变慢仍发生时对齐时间,不能拿故障后的设备空闲状态去否定故障中的等待。下面命令可以在另一个采集会话中使用,本文没有实际启动它。

# 已安装 sysstat 时读取设备扩展指标,跳过首个累计报告。
iostat -x -y -t 1 10

设备侧重点看 await 及读写延迟、平均队列长度等是否偏离自身正常期,再与对应业务读写时延对齐。await 包含排队和服务时间,不能简单叫作磁盘硬件服务时间。对于并行设备、阵列和现代 SSD,%util 也不应直接当成所有场景下的性能上限判断。

如果主机使用逻辑卷、设备映射或云盘,要先把业务文件所在存储与设备统计对应起来。先确认观察对象,再讨论瓶颈;否则看到一块无关设备繁忙,也不能解释应用变慢。

主机概览、设备统计与业务时延的证据关系
静态说明图:同一时间窗口连接主机、设备和业务证据,三者共同支持或削弱 I/O 等待假设。

处理版本、虚拟机和观察误区

内核文档明确指出 iowait 统计在多核归属等方面存在限制,部分情况下累计值还可能下降。因此 wa 应作为统计线索使用,不能理解成 CPU 真正停住等待某个请求的精确计时器。其他任务能继续使用 CPU 时,某个业务请求的存储等待也可能没有表现为很高的主机 wa。

虚拟机中的 st 是被宿主侧占用的时间线索,不能并入 wa 后统一称为磁盘等待。容器里看到的 /proc 与 CPU 统计范围也需要结合运行环境确认,不能默认 vmstat 每列都只代表当前容器的配额和负载。

实际记录可以保留采样起止时间、业务是否变慢、连续区间里的 wa/b 变化、是否有交换活动、相关设备延迟,以及仍未确认的部分。没有设备级证据时,就记录“存在等待线索,设备归因未确认”,无需强行给一个确定结论。

wa 超过固定百分比就算故障吗?

没有适用于所有负载的统一阈值。应看持续时间、正常期基线和业务影响,再结合设备延迟判断。

wa 为零就可以排除 I/O 问题吗?

不能。主机统计会聚合多个 CPU 的状态,也不能代替某个请求或进程的等待分析。

swpd 非零表示正在发生交换吗?

swpd 描述已使用的交换空间,判断当前交换活动还应看 si/so。存量和当前速率应分开理解。

资料来源:procps-ng vmstat 手册、Linux 内核 /proc 统计说明、sysstat iostat 手册。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>