worker_aio_requests指令位于http或server块中,用于设置启用AIO时每个worker进程的异步I/O请求数上限,默认32,仅对大文件读取有效,需配合aio on、directio及内核AIO支持。

Nginx 的 worker_aio_requests 指令并不属于 events 块,而是位于 http 或 server 块中,且仅在启用 AIO(Asynchronous I/O)时生效,主要用于优化大文件读取场景下的异步 I/O 请求队列深度。
worker_aio_requests 的实际作用范围
该指令控制每个 worker 进程在使用 aio on 时,可同时发起的异步 I/O 请求数上限。它不能写在 events 块内,否则 Nginx 启动会报错:
正确位置是 http、server 或 location 块中,且需配合 aio on; 和 directio(或内核支持的异步读取路径)使用。
启用 AIO 前的必要条件
- Linux 内核需 ≥ 2.6.22(推荐 ≥ 4.0),并启用
CONFIG_AIO - Nginx 编译时需包含
--with-file-aio(默认多数发行版已启用) - 文件系统需支持直接 I/O(如 ext4、xfs),且文件需满足
directio触发条件(通常为文件大小 ≥ 配置的 directio 值) - 需显式配置
aio on;,否则worker_aio_requests不生效
典型配置示例与调优建议
以下为合理用法:
http {
aio on;
worker_aio_requests 32; # 默认值,一般无需修改
<pre class="brush:php;toolbar:false;">server {
location /video/ {
aio on;
directio 4m; # 文件 ≥ 4MB 时启用 direct I/O + AIO
output_buffers 1 128k;
}
}}
调优注意点:
- 默认值 32 适合大多数场景;过高(如 > 128)可能增加内核压力,反而降低吞吐
- 仅对大文件静态服务(如视频、ISO 下载)有意义;小文件或代理场景基本无效
- 必须配合
sendfile off;和tcp_nopush off;,避免与 sendfile 冲突 - 可通过
strace -e trace=io_submit,io_getevents -p <worker-pid></worker-pid>验证 AIO 是否真实触发
常见误区与替代方案
很多人误以为调高 worker_aio_requests 能提升并发性能,但实际:
- 它不提升连接数或请求处理能力,只影响单个 worker 对大文件读取的异步队列深度
- 现代 SSD + 高速网络下,AIO 收益有限;多数情况靠调整
worker_connections、启用reuseport、优化 TCP 参数更有效 - 若未启用
directio或文件太小,AIO 根本不会工作,此时该参数完全被忽略
真正需要关注异步行为的场景,建议优先检查是否已启用 epoll(Linux 默认)、是否开启 accept_mutex 合理分载,以及是否用 proxy_buffering off 配合流式响应等更直接的手段。

















