Nginx `sendfile`与`tcp_nopush`在千兆/万兆局域网的网卡队列调优

夏枫君_1162

夏枫君_1162

2026-09-28

557人浏览

原创

nginx 的 sendfile 与 tcp_nopush 不直接调节网卡队列,而是通过零拷贝和 tcp_cork 机制使每次 tx 队列填充更饱满、更规律,降低中断频次与 softirq 开销;需配套禁用 gzip、tcp_nodelay off、确保 content-length 存在,并按 location 精细化启用。

nginx `sendfile`与`tcp_nopush`在千兆/万兆局域网的网卡队列调优

在千兆或万兆局域网中,Nginx 的 sendfile 与 tcp_nopush 不直接调节网卡队列(如 RPS、RFS、XPS 或 ring buffer 大小),而是通过协同内核网络栈行为,间接影响网卡队列的填充效率和中断压力。真正决定网卡队列是否“堵”或“空转”的,是上层应用的数据推送节奏与内核发送缓冲区的配合程度——而这正是 sendfile + tcp_nopush 的作用边界。

为什么网卡队列不是 Nginx 配置能直接改的

Nginx 运行在用户空间,无法直接操作网卡硬件队列(如 Intel ixgbe 的 TX/RX ring buffer)或内核的软中断分发策略(RPS/RFS)。这些属于 Linux 网络子系统底层调优范畴,需通过 /proc/sys/net/core/ 和 /sys/class/net/eth0/queues/ 下的参数调整,例如:

  • net.core.netdev_max_backlog:控制未处理数据包在队列中的最大数量,千兆建议 ≥2500,万兆建议 ≥5000;
  • net.core.rmem_max / wmem_max:影响 socket 接收/发送缓冲区上限,大文件传输时建议设为 4–16MB;
  • /sys/class/net/eth0/queues/tx-0/xps_cpus:绑定 TX 队列到特定 CPU,避免跨核缓存失效;
  • ethtool -G eth0 tx 4096 rx 4096:显式扩大 ring buffer 深度(需驱动支持)。

sendfile + tcp_nopush 如何减轻网卡队列压力

它们不“填满”队列,而是让每次入队的数据块更饱满、更规律,从而降低单位时间内的中断次数和上下文切换开销:

Nginx Config Linter
Nginx Config Linter

对 Nginx 配置文件进行语法检查、验证和安全、性能审计。

下载
  • sendfile on 触发零拷贝路径,跳过用户态内存拷贝,使内核可直接将磁盘页映射进 TCP 发送缓冲区,减少 CPU 占用和延迟;
  • tcp_nopush on 启用 TCP_CORK,强制内核等待响应头 + 文件起始段(通常 ≤1 个 MTU,约 1460 字节)凑满后再推入网卡 TX 队列——避免大量 40–64 字节的小包反复触发 TX 中断;
  • 二者联用后,一个大文件响应往往只需 1–3 次 sendfile() 系统调用 + 对应的 TX 队列填充动作,而非数百次小 write();
  • 实测显示:在万兆局域网中对 100MB 文件启用该组合,TX 中断频率可下降 40%–60%,尤其在高并发下载场景下,softirq 时间占比明显回落。

局域网环境下的关键配套设置

千兆/万兆带宽本身不是瓶颈,但错误配置会让高带宽变成“高丢包率”或“高重传率”。必须同步收紧以下环节:

  • 禁用 gzip:压缩强制走用户态 read/write,彻底绕过 sendfile 路径;
  • 显式设 tcp_nodelay off:避免与 tcp_nopush 冲突;Linux 下二者互斥,未关闭则 tcp_nopush 被静默忽略;
  • 确保 Content-Length 存在:Nginx 需预知大小才能调用 sendfile();若上游返回 chunked,则退化为普通模式;
  • 限制单次 sendfile 量:用 sendfile_max_chunk 512k,防止一次 push 过大阻塞 worker 事件循环,也适配多数首帧数据体积;
  • 按 location 精细化启用:只在服务真实静态大文件的位置开启,例如:location ~ \.(mp4|zip|iso|dmg)$ { ... },不污染 API 或 WebSocket 路径。

验证是否对网卡队列产生正向影响

不能只看 Nginx 配置是否存在,要观察内核和网卡层面的实际行为:

  • 运行 strace -e trace=sendfile -p $(pgrep nginx),确认 worker 进程确实在调用 sendfile();
  • 用 watch -n1 'cat /proc/net/dev' 观察 eth0 的 tx_compressed 或 tx_fifo_errors 是否上升——稳定无增长说明 TX 队列未溢出;
  • Wireshark 抓包检查:HTTP 响应头与文件前 2KB 数据是否落在同一 TCP 报文段(即 “TCP segment of a reassembled PDU” 消失);
  • 检查 nginx error.log,排除 tcp_nopush is ignored 类警告。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

417

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

840

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

2492

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

836

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

749

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

394

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2236

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

4132

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

667

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习