directio 在 Server 块中启用时,要求文件≥4MB才绕过页缓存直读磁盘,必须关闭 sendfile、配合 directio_alignment 512,且仅适用于 Linux/FreeBSD 下支持 O_DIRECT 的文件系统。

在 Server 块中启用 directio,核心是让 Nginx 对指定大小的文件绕过内核页缓存,直接读写磁盘,特别适合视频、安装包等大文件分发场景。它不适用于小文件或高频随机访问,且与 sendfile on 互斥——开启 directio 时必须关闭 sendfile。
配置 directio 的基本语法和位置
directio 指令支持在 http、server 和 location 块中使用。在 server 块中配置,表示该虚拟主机下所有匹配路径(除非被更细粒度的 location 覆盖)都遵循此规则:
- 语法:
directio size | off;,例如directio 4m;表示文件大于或等于 4MB 时启用直接 I/O - 默认值为
off,即禁用直接 I/O - 必须搭配
directio_alignment使用,确保底层块对齐(常见设为512或4096)
Server 块中的典型配置示例
以下是一个实际可用的 server 配置片段,专用于大文件服务:
server {
listen 80;
server_name files.example.com;
<pre class="brush:php;toolbar:false;"># 关闭 sendfile(与 directio 冲突)
sendfile off;
# 启用直接 I/O:≥4MB 的文件走 directio
directio 4m;
directio_alignment 512;
# 推荐配合:禁用 tcp_nopush(因 sendfile 已关,该优化失效)
tcp_nopush off;
location /downloads/ {
root /var/www/static;
# 此处继承 server 级 directio 设置
}}
注意:如果某 location 需要不同策略(比如小文件走缓存),可在该 location 内显式覆盖:directio off; 或 directio 1m;。
关键限制与注意事项
启用 directio 不是“开箱即用”的性能开关,需满足几个前提条件:
- 仅在 Linux 和 FreeBSD 上生效(依赖
O_DIRECT系统调用) - 文件系统需支持直接 I/O(ext4、XFS 均支持;某些网络文件系统如 NFS 可能不支持)
- 文件必须按
directio_alignment对齐(默认 512 字节),否则可能降级为普通读取 - 不能与
sendfile on共存;也不能与aio on(异步 I/O)同时启用 - 对小文件反而降低性能——因为失去页缓存带来的重复读加速
验证是否生效
可通过以下方式确认 directio 是否起作用:
- 检查 Nginx 错误日志:若配置错误(如路径不合法、权限不足),会报
directio failed类错误 - 用
strace -p $(pgrep nginx) -e trace=io_submit,read,pread64观察是否出现O_DIRECT标志 - 对比相同大文件请求的 CPU 使用率和延迟:启用后用户态 CPU 应略有下降,内核态 page cache 相关活动减少











