aio_write on 是 nginx 中启用异步文件写入的指令,必须配合 aio threads 使用,仅在 sendfile on 且响应为静态文件时生效,优化内核 page cache 落盘环节,需文件系统支持(xfs/ext4≥5.1)、内核启用 config_aio,并满足 512b 对齐及 directio 配置。

aio_write on 是 Nginx 中启用异步文件写入的指令,但它不能单独生效,必须配合 aio on(或 aio threads)使用,且仅对满足特定条件的写操作起作用。
关键点在于:Nginx 的 aio_write 并非开启“任意写操作的异步化”,而是让 sendfile 后续的落盘写入阶段(比如 copy_file_range 或内核 buffer flush)交由内核 AIO 线程池处理——前提是底层支持、文件系统兼容、且请求满足对齐与大小要求。
✅ 正确配置 aio_write 的前提与步骤
-
必须先启用 aio
aio_write是aio的补充选项,不依赖aio on就无效。推荐使用线程池模式(更可控):aio threads; aio_write on;
仅对 sendfile 场景生效
aio_write只在sendfile on且响应体来自静态文件(如location /static/)时触发。它优化的是「内核将 page cache 数据写入磁盘」这一环节,不是普通write()系统调用。-
文件系统与内核要求严格
- 文件系统需支持异步 write(XFS、ext4 ≥ 5.1 默认支持)
- 内核需启用
CONFIG_AIO(主流发行版默认开启) - 文件需以
O_DIRECT方式打开(Nginx 自动处理,但要求文件 offset 和 length 对齐 512B)
实际生效还需满足对齐条件
若文件未按块对齐(如偏移非 512B 倍数、长度非 512B 整数倍),Nginx 会自动退回到同步写,aio_write不起作用。
⚙️ 推荐配置示例(Nginx.conf)
http {
# 全局线程池定义(可选,提升复用性)
thread_pool default threads=16 max_queue=65536;
server {
location /static/ {
root /var/www;
sendfile on; # 必须开启
aio threads; # 启用线程池模式异步 I/O
aio_write on; # 启用异步写入(仅对 sendfile 落盘有效)
directio 4m; # >4MB 文件走 O_DIRECT,避免 page cache 干扰
}
}
}
?
directio 4m是关键辅助项:它让大文件跳过 page cache,直接进O_DIRECT路径,从而真正进入内核 AIO write 流程;小文件仍走 buffered I/O,此时aio_write不参与。
❌ 常见误区与失效原因
-
aio_write on对proxy_pass、fastcgi、upstream返回的内容完全无效 -
aio_write不影响body读取、日志写入、SSL 握手等其他写操作 - 在 ext4 上若挂载时用了
data=writeback或data=ordered,异步 write 可能被降级为同步 - 使用
aio on(无 threads)时,Nginx 依赖内核 POSIX AIO,而多数 Linux 发行版中该路径实为线程池模拟,性能和可靠性不如threads模式
? 验证是否生效
可通过以下方式确认:
- 查看 Nginx error log 是否有
*aio_write not supported类警告 - 使用
strace -e trace=io_submit,io_getevents,write,writev观察 worker 进程是否调用io_submit -
cat /proc/sys/fs/aio-nr查看当前 AIO 请求计数(需有真实大文件下载触发)
不复杂但容易忽略











