Linux中iostat的avgqu-sz是运行时平均队列长度,非配置上限;真正队列深度需查/sys/block/*/device/queue_depth(NVMe/SATA)或/queue/nr_requests(老设备),并结合%util、await与标称IOPS综合判断瓶颈。

Linux 中不能直接用 iostat 查“配置的队列深度”,它显示的是运行时平均队列长度(avgqu-sz),不是设备能力上限。要真正检查磁盘队列深度,得区分“当前排队情况”和“硬件/软件允许的最大深度”两层含义——iostat -x 只管前者。
怎么看 iostat 里的 avgqu-sz(实际排队长度)
avgqu-sz 是内核 block layer 中等待 + 正在处理的 I/O 请求数的采样均值,反映负载压力而非配置值:
- 运行
iostat -xm 1(每秒刷新、单位 MB),关注输出中avgqu-sz列 - 该值持续 >4(SSD)或 >8(NVMe)且伴随高
await(如 >10ms)和低吞吐,才说明请求在积压 - 若
%util很低(比如 avgqu-sz 却 >2,大概率是单队列机械盘或调度器限制,不是磁盘真忙
怎么查设备真正的队列深度上限
avgqu-sz 不等于队列深度,真正要查的是驱动暴露的硬件队列能力:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- NVMe 盘(如
nvme0n1):cat /sys/block/nvme0n1/device/queue_depth - SATA/SAS 盘(如
sda):cat /sys/block/sda/device/queue_depth或cat /sys/block/sda/device/nr_hw_queues(再结合单队列深度估算) - 老式设备或 USB 盘:
cat /sys/block/sda/queue/nr_requests是主要软件限制 - 若读取报
No such file,说明队列深度由固件或内核硬编码,不可调
为什么 avgqu-sz 高 ≠ 队列深度不够
盲目调大队列深度可能适得其反,先确认是否真卡在这里:
- 用
iostat -x 1观察:如果%util ≈ 100%但 IOPS 远低于设备标称值(如 NVMe 标称 50w,实测仅 8w),且await > 10ms,才值得怀疑深度不足 - HDD 上设过高 depth 会拉高平均延迟,保持默认 8–16 更稳;SSD 应先检查调度器:
cat /sys/block/sdX/queue/scheduler,避免用已淘汰的cfq - 有 LVM、dm-crypt 或 RAID 层时,
avgqu-sz会叠加多层排队,此时对比/sys/block/dm-0/stat和底层物理盘更准
avgqu-sz 是诊断信号,不是配置目标。它告诉你“现在有没有堵”,而队列深度文件告诉你“最多能塞多少”。两者配合看,才能准确定位是下发太快、调度太慢,还是磁盘真扛不住。

















