sendfile 能显著提升静态资源传输效率,其核心是内核直接在文件系统与 socket 间搬运数据,绕过用户态拷贝,降低 CPU 和内存开销;需 Linux 系统、支持的文件系统及正确配置(如 sendfile on、tcp_nopush on),禁用 gzip 等用户态处理才生效。
使用 sendfile 指令能显著提升静态资源(如图片、CSS、JS 文件)的传输效率,核心在于让内核直接在文件系统和 socket 之间搬运数据,绕过用户态内存拷贝,减少 CPU 和内存开销。
sendfile 是 Linux 内核特性(2.3.10+),需确保:
EnableSendfile on)Nginx 默认开启 sendfile on,但配合其他指令才能发挥最大效果:
sendfile on; 在 http、server 或 location 块中启用tcp_nopush on;:使 Nginx 在发送响应头后,等待整个文件缓冲区填满再发,减少小包数量(尤其对大文件有效)tcp_nodelay on;:它会禁用 Nagle 算法,适合实时交互,但可能削弱 sendfile 的批量传输优势;静态资源通常保持默认(off)更合适sendfile 并非万能,以下情况会自动退化为常规 read/write 流程:
gzip_static on; 配合 sendfile
X-Accel-Redirect 但后端返回非本地路径,或文件不在 root 指定目录下可通过系统级工具观察内核行为:
strace -e trace=sendfile64,read,write,sendto nginx -t 启动调试模式,查看日志中是否出现 sendfile64 系统调用sendfile 时的 CPU 使用率(top 或 pidstat -u 1)和 QPS 变化,大文件传输场景下提升通常明显$sent_http_content_length 和响应时间指标也可辅助分析吞吐变化