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 与 wa | iostat 的设备级明细 |
| 哪块盘在忙 | iostat -dxm 的 aqu-sz 与 %util | sar -d 回看历史时段 |
| 哪个进程在打盘 | pidstat -d 的 kB_wr/s | iotop -oPa 看实时排名 |
| 是换页还是业务写 | vmstat 的 si/so | /proc/<pid>/io 的累计字段 |
采样策略
- 间隔取 1 秒、次数至少 5 次,避免把单点抖动当作趋势
- 加 -t 打时间戳,让数据能与业务日志、告警时间对齐
- 长周期观察交给 sar 或监控系统,iostat 只做现场确认
- 压测前后保持相同并发与数据量,否则对比不成立
设备名要认准层级:dm-0、md0 是映射层,物理盘是 sda、nvme0n1。上层设备的 await 往往已包含底层排队时间,判断硬件能力要看最底层的物理设备。