iostat -x 关键列解读

r/s、w/s 是每秒请求数;await 是平均完成时间(含排队);aqu-sz 是平均队列深度;%util 是设备忙碌时间比例,多列合看才准确。

命令在看什么

iostat -x 输出每个块设备的扩展统计:r/s 与 w/s 是每秒读写请求数,await 是请求的平均完成时间(毫秒,含排队),aqu-sz 是平均队列深度,%util 表示设备有请求在处理的时间比例,另有 rkB/s、wkB/s 表示吞吐。判断存储瓶颈要把延迟、队列与吞吐合看——单个 %util 达到 100% 不能说明问题,NVMe 与多队列设备本身就能并行处理大量请求。

基本信息

适用平台Linux(sysstat 包提供 iostat)
常用参数-x 扩展统计、-d 只显示设备、-m 以 MB/s 为单位、-t 带时间戳、-z 省略空闲设备
数据来源/proc/diskstats
关键列r/s、w/s、rkB/s、wkB/s、await、aqu-sz、%util
首份报告默认是自开机以来的累计均值,用 -y 可跳过
对比工具sar -d(历史)、iotop(进程侧)

典型使用场景

  • 判断是否存在存储瓶颈:延迟、队列与吞吐三者必须合看
  • 区分「设备本身慢」与「上游请求太多」:await 高同时 aqu-sz 也高说明在排队
  • 多设备或多分区对比,定位哪个盘最吃紧
  • 对比 SSD 与机械盘的指标量级,为选型或迁移提供依据
  • 容量规划时观察吞吐是否已接近设备能力的上限

查看示例

查看示例
iostat -x 1 3  # 每秒采样一次共 3 次,只看扩展列
iostat -dxm -t 1 5  # 只显示设备、以 MB/s 为单位、带时间戳
iostat -x -z 1 3  # 省略空闲设备,聚焦有负载的目标
iostat -xy 1 3  # -y 跳过自开机以来的首份汇总报告
lsblk -o NAME,MAJ:MIN,SIZE,ROTA  # 确认设备名、主次号以及是否机械盘
sar -d 1 3  # 需要历史对比或与 CPU 指标对齐时使用 sar -d

关键列读法

列含义正常/异常
r/s、w/s每秒读写请求数与设备类型对比,机械盘通常远低于 NVMe
rkB/s、wkB/s每秒读写吞吐接近设备上限时说明已饱和
await平均完成时间(含排队,毫秒)显著高于基线需结合队列判断原因
aqu-sz平均队列深度持续偏高说明请求在排队
%util设备忙碌时间比例NVMe 到 100% 不等于饱和
r_await / w_await读写分开的平均延迟混合负载下用于区分读写表现
NVMe 与多队列设备可以并行处理大量请求,%util 逼近 100% 的同时延迟可能仍然正常。此时应重点看 await 与 aqu-sz 的组合,以及 r/s、w/s 是否已接近设备能力上限。
iostat 的第一份报告(无 -y 时)是自开机以来的累计均值,直接拿它判断「当前」状态会出错。采样式使用时应至少取三份报告,并只看后面几份。

易错点

  • 只看 %util 就下结论:在多队列设备与虚拟化磁盘上该列参考价值有限,需要配合延迟与队列
  • await 升高就归因设备慢:上游请求量过大造成的排队同样抬高 await,必须结合 aqu-sz 区分
  • 误读第一份报告:那是开机以来的均值,容易被当成实时数据
  • 分区与整盘指标混看:同时启用分区统计时两份数据并存,重复计算会夸大压力
  • 在虚拟化环境照搬物理机经验:云盘的指标语义受后端与超卖影响,应与平台监控一起判断

数据来源与参考

  • sysstat 文档 iostat(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌