磁盘队列深度(aqu-sz)是调优aio线程池的关键指标,反映内核层待处理i/o请求数;应使线程数略大于aqu-sz峰值(如95分位值的1.2–1.5倍),并联动优化i/o调度器、设备队列深度及文件系统参数。

分析磁盘队列深度是调优静态服务 AIO 线程池的关键入口。它反映的是 I/O 请求在内核层排队等待处理的积压程度,直接关联到 AIO 线程是否“忙不过来”或“人浮于事”。调得准,能释放吞吐;调过头,反而引发上下文切换开销或资源争抢。
看懂 aqu-sz:AIO 队列深度的核心指标
aqu-sz(average queue size)来自 iostat -x 输出,代表设备平均请求队列长度。它不是应用层线程数,而是内核提交给磁盘驱动的待处理 I/O 数量。
- 持续高于当前 AIO 线程数(如 aqu-sz ≥ 32,而线程池仅设 16),说明线程不足,请求在队列中堆积,延迟上升
- 长期远低于线程数(如 aqu-sz 常为 2~5,线程池却配了 64),说明线程冗余,空转消耗 CPU 和内存
- 注意:aqu-sz 受限于硬件队列深度(如 NVMe 常支持 64K+)、I/O 调度器(如
mq-deadline更适合高并发)和应用负载模式(小块随机读写更易推高 aqu-sz)
匹配线程池大小与实际 I/O 并发压力
AIO 线程池不是越大越好,应略大于典型 aqu-sz 峰值,留出缓冲但避免浪费。
- 观察业务高峰期 5–10 分钟的
iostat -x 1,记录 aqu-sz 的 95 分位值(例如 28) - 线程池初始值建议设为该值的 1.2–1.5 倍(如 32~40),再结合
cat /proc/sys/fs/aio-nr确认系统 AIO 限额足够 - 对 Nginx 类静态服务,若启用
aio threads;,需同步调整thread_pool default threads=32 max_queue=65536;中的threads,且max_queue应 ≥ 2× 线程数,防任务被丢弃
联动调优底层 I/O 能力支撑 AIO 效率
线程池只是上层调度,若底层 I/O 路径存在瓶颈,再多线程也无济于事。
- 确认磁盘使用
noop或mq-deadline调度器(echo mq-deadline > /sys/block/nvme0n1/queue/scheduler) - 增大设备请求队列深度:
echo 1024 > /sys/block/nvme0n1/queue/nr_requests,避免内核层排队阻塞 AIO 提交 - 关闭文件系统 atime 更新:
mount -o remount,noatime /data,减少无关写入干扰 aqu-sz 稳定性
验证效果:用 fio 模拟并对比
调参后不能只看监控数字,要用可控负载验证真实收益。
- 运行随机读压测:
fio --name=randread --ioengine=libaio --iodepth=64 --rw=randread --bs=4k --size=2G --runtime=300 --group_reporting - 对比调优前后关键指标:aqu-sz 是否回落、avgqu-sz 是否稳定、r/s 和 w/s 是否提升、await 是否下降
- 特别关注
svctm(服务时间)是否接近硬件极限——若 svctm 显著升高,说明瓶颈已下移到磁盘本身,需换介质或 RAID 优化











