directio是Nginx绕过内核页缓存、直接读写磁盘的I/O优化机制,适用于≥阈值的大静态文件(如视频、镜像),需配合sendfile off、gzip off及Content-Length头使用,可降低内存带宽、CPU及I/O调度开销。

directio 是 Nginx 提供的底层 I/O 优化机制,专用于绕过内核页缓存(page cache),让大文件读取直接走 DMA 通道进入用户态缓冲区,从而避免内存拷贝与缓存污染。它不适用于所有场景,但在特定条件下——尤其是分发 GB 级静态文件(如镜像、安装包、视频源)且内存有限或需严格控制缓存行为时——能显著降低系统开销。
适用场景与前提条件
directio 不是“打开就快”的通用开关,必须满足以下条件才真正生效:
- 仅对 静态文件服务 生效(即使用 root 或 alias 指向磁盘路径的 location),proxy_pass 不触发 directio
- 文件大小需超过设定阈值(如 directio 1m),否则仍走常规缓存路径
- 目标文件需位于支持 direct I/O 的文件系统(如 ext4、xfs),且挂载时未启用 barrier=0 或 data=writeback 等可能冲突的选项
- 操作系统需支持 O_DIRECT(Linux 2.4.10+ 均支持),且 Nginx 编译时未禁用 --without-directio
核心配置方式
在匹配大文件的 location 块中启用,并配合其他关键参数协同工作:
- 设置触发阈值:
directio 1m;表示 ≥1MB 的文件启用 direct I/O;设为off则完全禁用 - 关闭 gzip:
gzip off;—— 压缩必须在用户态完成,与 directio 冲突 - 关闭 sendfile:
sendfile off;—— sendfile 依赖 page cache,与 directio 互斥 - 确保响应头含 Content-Length:
add_header Content-Length $sent_http_content_length;(若后端未返回,Nginx 需自行计算,否则 fallback 到普通读取)
为什么能降系统开销?
对比默认行为,directio 主要削减三类开销:
- 内存带宽压力:跳过 page cache,避免将几 GB 文件反复装入/挤出内存,尤其在多并发下载时防止 cache thrashing
- CPU 使用率:省去内核页缓存管理、脏页回写、LRU 链表维护等开销;实测在 10Gbps 网络下可降低 CPU 8–15%
- I/O 调度干扰:绕过内核 I/O scheduler 的排队逻辑,更适合顺序大块读取,减少 latency 波动
典型配置示例
专用于 ISO、ZIP、VIDEO 等超大静态资源:
location ~ \.(iso|zip|tar\.gz|dmg|mkv|mp4)$ {
root /data/files;
directio 1m;
sendfile off;
gzip off;
tcp_nopush off; # 不再依赖 sendfile,nopush 失效
client_max_body_size 0;
add_header Content-Length $sent_http_content_length;
open_file_cache off; # 避免缓存句柄干扰 directio 行为
}


















