首页/系统/Linux 内核与性能调优速查/iostat 间隔采样与单位

iostat 间隔采样与单位

iostat 首次输出是自启动以来的均值,后续为区间值;用 -m 换可读单位、-d 只看设备、-p 显示分区。

iostat 是什么

iostat 属于 sysstat 套件,从 /proc/diskstats 与 /proc/stat 汇总设备级 IO 与 CPU 数据。它的第一个输出是自开机以来的累计均值,之后每次输出才是间隔区间内的增量,这是最常被看错的地方。常用组合是 -d 只看设备、-x 输出扩展指标(aqu-sz、await、%util)、-m 把扇区换算为 MB。

基本信息

适用平台Linux(sysstat 包,CentOS/RHEL/Ubuntu 均可)
数据来源/proc/diskstats、/proc/stat
常用参数-d 设备 / -x 扩展 / -m MB 单位 / -p 分区 / -t 时间戳 / -y 跳过首次均值
采样语法iostat [选项] [间隔秒] [次数]
典型命令iostat -dxm 1 5

典型使用场景

  • 发布后 CPU 不高但接口变慢,看设备 await 与 %util 判断是否 IO 排队
  • 数据库压测时对数据盘做 1 秒采样,观察队列深度随并发上升的变化
  • 排查备份、日志轮转等定时任务对在线流量的冲击,用 -t 时间戳与业务时段对齐
  • 对比 SSD 与机械盘的 await 基线,验证硬件是否达到规格
  • 容量趋势记录:定时采集 -dxm 输出留档,用于容量与寿命评估

常用命令

常用命令
iostat -dxm 1 5              # 每 1 秒采一次共 5 次,只看设备,MB 单位
iostat -dxmp 1 5             # 追加分区明细行
iostat -y -dxm 1 5           # 跳过首次累计均值行,直接看区间值
iostat -t -dxm 1 5           # 每行带时间戳,便于与业务日志对齐
iostat -d -k -p sda 1 3      # 只看 sda 及其分区,KB 单位

输出逐列读法

列含义异常判读
r/s、w/s每秒读写请求数(IOPS)持续接近设备规格上限说明已打满
rMB/s、wMB/s每秒读写吞吐量与业务写入量对照可识别突发写入
aqu-sz平均队列长度持续大于 1 说明请求开始排队
await平均单次 IO 等待毫秒明显高于该设备基线即存在排队或劣化
%util设备有未完成请求的时间占比接近 100% 可能是饱和,但在多队列 SSD 上会失真
%util 表示设备存在未完成请求的时间比例,在高并发 NVMe 上即使接近打满也可能只有几十。判断饱和优先看 aqu-sz 与 await 的趋势,而不是单看 %util。

典型下钻顺序

要回答的问题第一眼再下钻
整机是否被 IO 拖住vmstat 的 b 与 waiostat 的设备级明细
哪块盘在忙iostat -dxm 的 aqu-sz 与 %utilsar -d 回看历史时段
哪个进程在打盘pidstat -d 的 kB_wr/siotop -oPa 看实时排名
是换页还是业务写vmstat 的 si/so/proc/<pid>/io 的累计字段

采样策略

  • 间隔取 1 秒、次数至少 5 次,避免把单点抖动当作趋势
  • 加 -t 打时间戳,让数据能与业务日志、告警时间对齐
  • 长周期观察交给 sar 或监控系统,iostat 只做现场确认
  • 压测前后保持相同并发与数据量,否则对比不成立
设备名要认准层级:dm-0、md0 是映射层,物理盘是 sda、nvme0n1。上层设备的 await 往往已包含底层排队时间,判断硬件能力要看最底层的物理设备。

易错点

  • 把首次输出当现状:首次是开机以来的累计均值,必须带间隔采样或加 -y 跳过
  • 只跑一次就下结论:单点数据无法区分瞬时抖动与持续压力
  • dm-*、md*、loop* 等映射层与物理盘混看,把上层读数当成物理盘性能
  • 用 %util 判定 NVMe 饱和,会因多队列并发而得出错误结论
  • 采样时段与业务峰值错位,用低谷数据否定压力存在

数据来源与参考

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