directio 是 Nginx 实现大文件绕过内核页缓存、直接读写磁盘的关键配置,核心目标是减少内存拷贝、避免缓存污染、提升顺序读吞吐,适用于 ≥ 数 MB 的静态资源;需配合 aio threads 和 sendfile off 才能生效,且依赖 SSD 存储与 XFS/ext4 文件系统。

directio 是 Nginx 实现大文件绕过内核页缓存、直接读写磁盘的关键配置,核心目标是减少内存拷贝、避免缓存污染、提升顺序读吞吐——尤其适用于视频、安装包等 ≥ 数 MB 的静态资源服务。
directio 触发条件与基本用法
它不是全局开关,而是按 location 或 server 级别设置的阈值控制指令:
-
directio 8m;表示:当响应文件大小 ≥ 8MB 时,启用 direct I/O;小于该值仍走常规 buffered I/O - 可设为
off(禁用)或具体字节数(如4m、10m),单位支持k、m、g - 必须配合
aio threads;才能真正发挥异步读优势;单独用directio会导致阻塞式直接读,反而降低并发能力
为什么必须搭配 aio threads 而不是 aio on
Linux 原生 AIO(aio on)依赖内核补丁和特定文件系统支持,实际兼容性差、易出错;而 aio threads 是 Nginx 自带的线程池机制,稳定可靠:
-
aio threads;启用后,Nginx 将大文件读取任务交由独立线程池处理,主线程不阻塞 - 此时
directio自动生效——即 ≥ 阈值的文件走 direct I/O + 线程池异步读 - 注意:
sendfile on与aio threads冲突,必须显式关闭:sendfile off;
对文件系统与存储的硬性要求
directio 不是“开箱即用”,底层需满足物理与格式约束:
- 存储介质建议 SSD:HDD 在 direct I/O 下随机寻道延迟高,反而拖慢小块读;SSD 天然适合大块顺序读
- 文件系统推荐 XFS:原生支持 direct I/O 对齐与异步操作,ext4 在高负载下可能退化为同步行为
- 挂载选项应含
noatime,nodiratime,避免元数据更新开销;若用 XFS,可加logbufs=8,logbsize=256k提升日志性能
配套调优不可遗漏
仅配 directio 和 aio threads 远不够,还需协同调整:
-
output_buffers 2 128k;:为异步读后的发送阶段预分配缓冲区,防止频繁小块 write() 系统调用 -
directio_alignment 512;:确保读写偏移对齐到磁盘扇区边界(默认 512 字节),避免额外拆分 IO -
use_temp_path=off(在proxy_cache_path中):强制缓存落盘到主路径,使线程池能统一调度读操作 - 后端代理场景下,还需确认上游响应头不含
Transfer-Encoding: chunked或动态生成内容——directio 只对确定长度的静态文件生效



















