iostat -x 的核心价值在于拆解i/o请求生命周期,通过avgqu-sz与await组合判断队列堆积或物理层延迟,结合r_await/w_await分离读写瓶颈,并用r/s、%util、svctm交叉验证是否真饱和或上游阻塞。

在极高 IOPS 场景下,iostat -x 的核心价值不是看“设备忙不忙”,而是拆解请求生命周期:它在哪排队、等多久、是否真被磁盘处理了。关键不在数值高低,而在 await 与 avgqu-sz、r/s、w/s 的逻辑关系 是否匹配硬件能力。
重点关注 avgqu-sz 与 await 的组合信号
avgqu-sz 是平均队列长度,反映内核向设备提交后、尚未完成的请求数量。在高并发 SSD/NVMe 场景下:
- avgqu-sz 持续 ≥ 8(SATA SSD)或 ≥ 64(NVMe PCIe 4.0)且 await > 2ms,说明设备已无法及时消费请求,队列开始堆积
- avgqu-sz 很高(如 >100),但 await 却很低(iotop -o 看瞬时峰值是否触发短时拥塞
- avgqu-sz ≈ 1 但 await 持续 >5ms,反而更危险——说明请求几乎不排队,但每个都慢,问题可能在物理层(如 NAND 坏块重映射、RAID卡缓存失效、NVMe 控制器过热降频)
用 r_await 和 w_await 分离读写路径瓶颈
高 IOPS 往往读写混合,单看 await 会掩盖差异:
- 若 r_await >10ms 而 w_await cat /proc/meminfo | grep -i "cached\|swapcached")
- 若 w_await 显著高于 r_await(例如 >8ms),且 wkB/s 不高,很可能是同步写(
O_SYNC、fsync())或 journal 刷盘阻塞,不是吞吐问题而是确认延迟问题 - 两者都高但差值小,再比对 svctm(虽已弃用,但非零值仍有参考意义):若 svctm ≈ await,说明几乎没有排队,纯服务耗时长;若 await ≫ svctm,排队主导延迟
结合 r/s 与 %util 判断是否“假饱和”
SSD/NVMe 在高 IOPS 下 %util 接近 100% 很常见,不能直接等同于瓶颈:
- %util = 98% + r/s = 120K + await = 0.4ms → 设备健康,高效运转
- %util = 99% + r/s = 15K + await = 35ms → 典型异常:IOPS 极低却占满设备,大概率是大块顺序读被锁住(如 ext4 barrier、LVM thin pool 元数据锁)或驱动未启用多队列(
cat /sys/block/nvme0n1/queue/nr_requests应 ≥ 1024) - %util 10ms → 请求根本没有效到达设备,问题在 block layer 上游:检查
blktrace或perf record -e block:block_rq_issue定位卡点
验证队列深度是否匹配硬件能力
Linux 默认队列深度常远低于 NVMe 实际支持(如 1024 vs 65536),限制并发潜力:
- 查当前队列大小:
cat /sys/block/nvme0n1/queue/depth(旧内核)或cat /sys/block/nvme0n1/queue/nr_requests - 临时调大(需设备支持):
echo 4096 > /sys/block/nvme0n1/queue/nr_requests - 观察 iostat 中 avgqu-sz 是否显著上升、await 是否下降——若无改善,说明瓶颈不在队列深度,而在其他层(如文件系统、应用逻辑)











