iostat -x 是唯一靠谱的起点,因其提供r_await、w_await、avgqu-sz等关键扩展指标,可捕捉延迟毛刺与队列堆积,避免仅依赖失真的%util和平均值。

为什么 iostat -x 是唯一靠谱的起点
不加 -x(扩展统计)的 iostat 几乎没用——它只给平均值,而 IO 延迟和队列问题本质是分布问题。真实瓶颈往往藏在 95% 以上的延迟毛刺里,iostat -x 1 每秒刷新一次扩展指标,才能看到瞬时压力。
常见错误是直接跑 iostat 或 iostat -d,结果只看到 %util 高就断定磁盘忙,其实可能是队列堆积或设备响应慢,%util 在 NVMe 或多队列设备上早已失真。
-
-x必须带:启用r_await、w_await、avgqu-sz、await等关键字段 - 加
1或2:避免看“自启动以来平均”,要动态观察趋势 - 过滤设备名:比如
iostat -x 1 /dev/nvme0n1,避免被大量空闲设备干扰视线
w_await 高但 svctm 低?说明写请求卡在队列里了
w_await 是写请求从入队到完成的总耗时(毫秒),svctm(已废弃,Linux 2.6+ 实为估算值)理论上接近硬件响应时间。如果 w_await > 20ms 且远高于 svctm(比如 w_await=85,svctm=0.2),基本可判定写请求不是被设备拖慢,而是排队等太久。
这时重点看 avgqu-sz(平均队列长度)和 aqu-sz(当前队列长度)。NVMe 设备队列深度常达 64K,但若 avgqu-sz 持续 > 10 且 await 同步飙升,说明上层(如文件系统、块层调度器)压入太快,设备来不及消化。
- 队列积压典型场景:大量小文件同步写 +
sync调用、XFS 日志刷盘卡顿、ext4 的barrier开启时等待存储确认 -
avgqu-sz> 队列深度 × 0.7 是危险信号(查设备队列深度用cat /sys/block/nvme0n1/queue/nr_requests) -
await和w_await差距大?说明读请求也在抢资源,得结合r_await判断是否混合 IO 干扰
别只盯 %util,rkB/s 和 wkB/s 才暴露真实负载模式
%util 在现代存储上几乎失效:它只是设备忙时间占比,对支持并行队列的 SSD/NVMe 来说,100% util 可能只对应 30% 的物理吞吐能力。真正反映压力的是吞吐量与延迟的组合。
比如 wkB/s 很低(w_await > 50ms,说明不是带宽打满,而是每次写都卡住——大概率是元数据操作(如 inode 更新、日志提交)或锁竞争;反过来,wkB/s 接近设备标称值(如 NVMe 3GB/s)且 w_await 稳定在 1–2ms,那才是健康高吞吐。
- 对比基准值:
dd if=/dev/zero of=/tmp/test bs=1M count=1024 oflag=direct测裸设备写延迟,再比对业务中的w_await -
rrqm/s和wrqm/s高?说明上层(如 page cache、IO 调度器)做了大量合并,可能掩盖了随机小 IO 的真实延迟 - 突发写场景下,
await峰值持续 > 100ms 且avgqu-sz波动剧烈,需检查是否有定时任务(如 logrotate、rsync)或数据库 checkpoint 触发批量刷盘
配合 iotop -a 和 /proc/diskstats 定位具体进程与底层计数器
iostat 告诉你“哪里堵”,但不告诉你“谁在堵”。iotop -a(-a 显示累计 IO)能快速揪出长期霸占写带宽的进程,尤其注意那些 WRITE 列持续非零、SWAPIN 也高的进程——可能是内存不足导致频繁 swap 写,而非业务逻辑本身。
更底层的验证看 /proc/diskstats:第 10 列是写完成次数,第 13 列是写花费毫秒数(注意单位是毫秒,非微秒)。用 awk '{print $13/$10}' /proc/diskstats 算出平均写延迟,和 iostat 的 w_await 对比——若显著偏高,说明 iostat 统计周期内有长尾请求被平滑掉了。
-
iotop -oP只显示实际在做 IO 的进程,避免被 idle 进程干扰 - 某些容器环境
iotop不显示容器名,改用cat /proc/<pid>/cgroup | grep blkio</pid>关联 cgroup -
/proc/diskstats第 9 列(写扇区数)× 512 ÷ 第 10 列 = 平均写大小,若远小于 4KB,基本可断定是元数据或日志小写,优化方向不是加大吞吐,而是减少调用频次或聚合写入
最易忽略的一点:iostat 的时间窗口是采样间隔的整数倍,如果瓶颈只持续几百毫秒,而你用 iostat -x 5,大概率漏掉。生产排查务必从 1 秒开始,确认稳定后再放宽。











