实测可确定sendfile性能分界点在64KB~1MB区间,需用wrk对1KB~100MB文件在on/off模式下压测并监控I/O wait、TCP队列及内核路径耗时。

直接用 ab 或 wrk 配合不同大小的静态文件做对比压测,就能观察到 sendfile 在小文件和大文件场景下的实际性能分界点。关键不是理论值,而是你的具体内核版本、磁盘 I/O 能力和网络栈配置下的实测拐点。
准备可控的测试文件集
生成一组覆盖典型尺寸的纯文本文件(避免压缩干扰),例如:
- 1 KB、4 KB、16 KB、64 KB、256 KB、1 MB、10 MB、100 MB
- 用
dd if=/dev/zero of=1mb.txt bs=1M count=1等命令生成,确保内容无压缩性 - 放在 Nginx 的 root 目录下,用固定 URI 暴露(如
/files/1kb.txt)
控制变量并开启/关闭 sendfile
在 server 或 location 块中显式设置:
-
sendfile on;+tcp_nopush on;(推荐组合) -
sendfile off;(回退到传统的 read() + write() 路径) - 每次只改一项,重启 Nginx 并清空 page cache:
echo 3 > /proc/sys/vm/drop_caches
用 wrk 做多轮定点压测
对每个文件尺寸,在两种 sendfile 模式下各跑 3 次(取中位数),例如:
wrk -t4 -c100 -d30s http://localhost/files/1mb.txt- 重点关注 Requests/sec 和 Transfer/sec,而非平均延迟
- 特别留意 64 KB~1 MB 区间——多数 Linux 系统在此范围出现吞吐量增速放缓或反超点
结合系统指标定位瓶颈
压测同时运行监控命令:
-
pidstat -d 1查看 Nginx 进程的 I/O wait 和读字节数 -
ss -i观察 TCP 发送队列(wscale、retrans)是否异常 -
perf top -p $(pgrep nginx)看内核路径耗时(如do_sendfilevssock_sendmsg)
当 sendfile 开启后 I/O wait 显著下降但吞吐未提升,说明已受网络带宽或客户端接收窗口限制,此时边界就落在传输层而非文件路径。











