avgqu-sz是iostat -x中唯一反映平均队列长度的字段,表示每秒平均排队请求数,但需结合await、硬件队列深度及设备类型综合判断,孤立看易误判。

Linux中磁盘队列长度本身不是单一可读数值,avgqu-sz 是唯一能直接反映“平均队列长度”的指标,但它必须结合 await 和硬件能力一起看,否则毫无意义。
iostat -x 输出里的 avgqu-sz 怎么读才不误导
avgqu-sz 是内核统计的“平均每秒队列中等待处理的 I/O 请求数”,单位是请求数(非字节),但它只是个平均值——瞬时尖峰可能远高于此。关键陷阱在于:它不区分请求大小、不体现排队位置(是块层?驱动层?还是设备内部?),更不说明是否真卡住。
- 机械盘上
avgqu-sz长期 > 2–4,且await> 10ms → 很可能真排队了 - NVMe SSD 上
avgqu-sz= 80 并不异常,只要await%util 未持续 100% → 设备正高效吞吐 - 若
avgqu-sz很低(如 0.3)但await却飙升(如 50ms)→ 问题不在队列,而在设备响应变慢或驱动挂起,得查svctm和dmesg -
avgqu-sz突然从 0 跳到 15+,但 2 秒后回落 → 可能只是某次批量刷日志,不用干预
为什么只看 avgqu-sz 会误判 SSD 的真实负载
SSD(尤其是 NVMe)的队列深度硬件支持可达 64k,而 Linux 默认往往只启用几十。此时 avgqu-sz 显示 30,不代表满负荷,只说明当前调度器塞了 30 个请求进去——设备可能还有余力。真正瓶颈信号是 await 开始抬升,或 %util 长时间卡在 100% 同时 r/s/w/s 远低于标称 IOPS。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 用
cat /sys/block/nvme0n1/device/queue_depth查当前生效的队列深度,再对比设备理论值(lspci -vv -s $(lspci | grep NVMe | awk '{print $1}') | grep -i queue) - 如果
queue_depth是 128,但iostat -x 1显示avgqu-sz常驻 120+ 且await> 0.5ms → 才值得调高 - 盲目把 NVMe 的
queue_depth改成 4096,可能引发nvme驱动锁竞争,反而让await波动更大 - HDD 完全相反:
queue_depth> 16 基本没收益,还可能因寻道混乱拉高平均延迟
排查队列积压时,哪些命令比 iostat 更接近真相
iostat 给的是聚合统计,掩盖了请求分布和路径延迟。当 avgqu-sz 异常但找不到大户进程时,必须下沉一层。
- 用
pidstat -d 1看每个进程的IO等待时间(%iowait列),比iotop更稳,且不依赖/proc实时性 - 用
blktrace -d /dev/sda -o - | blkparse -i -抓原始事件流,重点看Q→G(进队列到取请求)和I→C(下发到完成)的时间差;若Q→G延迟大,说明块层调度或锁争用;若I→C超长,直奔硬件或驱动 - 查
/proc/diskstats中的io_ticks字段:如果它增长速度远快于真实时间(比如 1 秒内涨了 800ms),说明设备真在满负荷运转,不是假忙 - 运行
dmesg -T | grep -i "timeout\|reset\|nvme.*error",很多队列积压其实是底层超时重试导致的连锁反应,而非上层请求太多
队列长度从来不是孤立数字,它是整条 I/O 路径上各环节协作的结果。最常被忽略的是:应用层一次 fsync 可能触发整个日志链路的同步阻塞,此时 avgqu-sz 会跳,但 pidstat 看不到写进程——因为真正卡住的是文件系统内核线程。










