linux下sendfile真正实现零拷贝,windows下实际无效而降级为read/write;linux自2.2内核支持sendfile(),配合sg-dma可绕过cpu和用户空间,windows无等价机制,仅适合开发调试。

sendfile 指令在 Linux 和 Windows 下的实际效果差异显著,核心在于底层内核支持能力不同,而非 Nginx 配置本身。
Linux 下 sendfile 是真正生效的零拷贝优化
Linux 内核 2.2 起就原生支持 sendfile() 系统调用,2.4 版本后更引入 SG-DMA 技术,允许数据从磁盘 DMA 直接进入网卡缓冲区,完全绕过 CPU 拷贝和用户空间。Nginx 启用 sendfile on; 后:
- 静态文件传输只需 1 次内核内数据搬运(磁盘 → socket),省去用户态内存分配与复制
- CPU 占用明显下降,尤其在高并发下载或大文件服务场景下提升显著
- 配合
tcp_nopush on可批量发送数据包,进一步减少网络开销
Windows 下 sendfile 实际无效或降级为普通读写
Windows 没有等价于 Linux sendfile() 的内核机制。Nginx for Windows 中的 sendfile on:
本文档主要讲述的是Android 操作系统的介绍;Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 会被自动忽略或退化为传统
read()+write()流程 - 仍需经过用户空间缓冲区,产生两次内存拷贝和上下文切换
- 无法发挥零拷贝优势,性能提升几乎为零,甚至因额外判断带来微小开销
实际部署建议
若服务涉及大量静态资源分发(如 CDN、下载站、前端资源托管):
- 生产环境务必部署在 Linux 系统,确保
sendfile on发挥作用 - Windows 仅适合开发调试或低负载测试,不建议用于 IO 密集型线上服务
- 在 Linux 上还可叠加
aio on(异步 I/O)和directio进一步优化大文件场景
验证是否真正生效的小技巧
Linux 下可通过工具确认内核是否走零拷贝路径:
- 用
strace -e trace=sendfile64 nginx -t查看是否调用sendfile64 - 观察
ss -i输出中 socket 的retrans和rcv_space是否稳定,波动小说明传输高效 - 对比启用前后
top中 nginx worker 进程的 %CPU 占用变化










