Nginx的aio threads并非将I/O任务交给其他进程,而是让当前worker进程在发起read()时避免阻塞事件循环,依靠内核线程池异步完成读盘并回调通知;其前提是Linux内核≥5.1、文件系统为XFS或ext4、Nginx编译启用--with-file-aio,且需配合directio与禁用sendfile才能生效。

不能“彻底剥离”——aio threads 不是把 I/O 任务扔给别的进程,而是让当前 worker 进程在发起 read() 时不阻塞事件循环,靠内核线程池异步完成实际读盘,并通过回调通知 Nginx 继续处理。它仍是该 worker 的一部分,只是执行方式从同步等待变为非阻塞调度。
前提条件必须满足
aio threads 能生效,不是光配个参数就行,得同时满足:
- Linux 内核 ≥ 5.1(低版本仅支持 aio on,且依赖 directio)
- 文件系统为 XFS 或 ext4(btrfs、NTFS-3G 等不保证稳定)
- Nginx 编译时启用了 --with-file-aio(主流发行版包通常已开启)
- 静态文件未被 mmap 或 sendfile 直接绕过(aio 对 sendfile 无效,只对 read() 路径起作用)
配置要点与典型用法
在 location 块中启用 aio threads,需配合 directio 和 open_file_cache 使用,否则可能适得其反:
-
启用 aio threads:
aio threads;(不是aio on) -
强制走 aio 路径:加
directio 4m;(例如 4MB 以上文件启用直接 I/O,绕过 page cache,逼出 aio) -
避免反复 open():配
open_file_cache max=1000 inactive=30s;减少 inode 查找开销 -
禁用冲突选项:确保没开
sendfile on;(二者互斥,sendfile 优先级更高)
为什么它不是“交给别人干”
aio threads 实际由 Nginx 自己维护一个固定大小的线程池(默认 32,可通过 aio_write_threads 或系统 ulimit 调整),所有 worker 进程共享这个池。当某个 worker 发起 read() 请求时:
AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。
- 主线程立即返回,继续处理其他连接
- 请求被投递到线程池中的空闲线程执行物理读取
- 读完后,线程通过 eventfd 通知原 worker,worker 在 epoll 中收到就绪事件再取结果
整个过程仍绑定在同一个 worker 进程上下文中,内存、连接状态、日志上下文都不跨进程——所以不是“剥离”,而是“卸下阻塞包袱”。
对比其他方案的实际效果
比起简单调大 worker_processes 或 worker_connections,aio threads 更适合以下场景:
- 大量中等大小(几 MB 到百 MB)静态文件,且磁盘随机读压力大(如 SSD 未满载但 latency 波动高)
- 无法启用 sendfile(例如需要修改响应头、加签、动态注入内容)
- 后端是慢存储(如 NFS、Ceph RBD),而你又不能换硬件
若文件普遍 aio on; directio 8m; 配合内核原生 io_uring(Nginx 1.25+ 支持)会更稳。

















