0

0

ethtool -K 关闭 TSO/GSO 后吞吐反而下降的真实业务场景分析

舞夢輝影

舞夢輝影

发布时间:2026-01-25 19:29:02

|

787人浏览过

|

来源于php中文网

原创

关闭TSO/GSO后iperf单流无法跑满带宽,是因CPU软中断瓶颈与TCP并发粒度失配所致:单流受限于RTT和窗口,多流(如-P5)可摊薄开销但过多会引发软中断争抢、锁竞争和cache颠簸。

ethtool -k 关闭 tso/gso 后吞吐反而下降的真实业务场景分析

为什么关了TSO/GSO,iperf跑不出满带宽?

这不是命令写错了,而是你正踩在「CPU软中断瓶颈」和「TCP并发粒度失配」的交界点上。典型现象是:单流 iperf -P1 仅跑出 2~3Gbps(10G网卡),但开到 -P5 才接近峰值,再加进程反而回落——这恰恰说明关闭卸载后,内核协议成了新瓶颈。

  • TSO/GSO 关闭后,原本由网卡硬件完成的分段任务全压给 CPU:每个大包都要在 dev_hard_start_xmit() 中被切片、填 TCP/IP 头、计算校验和,消耗大量 cycles
  • 单 TCP 流受限于 RTT 和接收窗口,无法打满物理带宽;而多流能摊薄单流调度开销,但超过临界点(如 -P5)后,软中断争抢、队列锁竞争、cache line bouncing 开始反噬吞吐
  • 尤其在 Docker 容器中,veth pair + bridge 转发路径叠加 GSO 禁用,会导致 skb 在 host namespace 和 container namespace 间反复克隆+重分片,放大延迟

哪些业务场景下关 Offload 反而伤性能?

不是所有“低延迟需求”都适合关 TSO/GSO。真实受损场景往往具备以下特征:

  • 高吞吐微服务网关:Envoy/Nginx 作为 sidecar,每秒处理数万连接,且多数请求体小(
  • 实时风控/交易撮合系统:依赖低 P99 延迟,但流量模型是「少量大包 + 大量心跳小包」。关 TSO 后,大包分片阻塞 TX 队列,小包排队等待时间从 µs 级跳到 ms 级
  • Kubernetes HostNetwork Pod:容器直接使用宿主机网络栈,但 ethtool -K 只作用于物理口,veth peer 的 GSO 状态未同步,造成发送路径 GSO off(host)→ on(container)不一致,触发内核 fallback 到 GSO soft path,性能断崖式下跌

怎么验证是不是 Offload 关得不对?

别只看 ethtool -k eth0 显示 “off”,要确认它真在生效路径上:

Mulan AI
Mulan AI

画布式AI视频创作平台,轻松制作爆款视频

下载
  • 查实际发送路径是否绕过 GSO:cat /proc/net/snmp | grep -A1 TcpTcpOutSegs 是否远高于 TcpOutDataSegs(差值大说明分段发生在协议栈,GSO 生效);关闭后两者应趋近
  • 抓包对比:tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' 若 SYN 包长度 > 1500 字节,说明 TSO 仍生效(常见于没对 veth 或 docker0 桥接设备执行相同操作)
  • 检查驱动层是否静默忽略:ethtool -i eth0driver 名,某些旧版 ixgbe/igb 驱动在禁用 TSO 后会 fallback 到 LRO/GRO 行为,需一并关掉 gro off lro off

真正该关 Offload 的时候,只关一部分

全关 TSO/GRO 是懒办法。生产环境更推荐「按需裁剪」:

  • 只关 tso off,保留 gso on:让内核在协议栈做通用分段,避免硬件兼容性问题,同时保持分段逻辑可控
  • gro off 但开 lro off:GRO 在软中断中聚合,易干扰实时性;LRO 在驱动层合并,影响更小,部分智能网卡还支持可编程 LRO 规则
  • 对容器网络,必须同步操作:ethtool -K docker0 gso off + ethtool -K vethXXXX gso off,否则 veth pair 两端 GSO 状态错配会触发 skb_linearize() 强制拷贝,CPU 直接翻倍

最常被忽略的一点:关 Offload 不等于解决延迟,它只是把问题从网卡 queue 移到了 CPU softirq queue。如果你没调优 /proc/sys/net/core/netdev_budget、没绑定 irq 到专用 core、没限制容器 CPU quota,那关了也是白关。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

231

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

501

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

498

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

232

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3510

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

25

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

28

2026.01.13

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

58

2026.01.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
光速学会docker容器
光速学会docker容器

共33课时 | 1.9万人学习

Docker 17 中文开发手册
Docker 17 中文开发手册

共0课时 | 0人学习

极客学院Docker视频教程
极客学院Docker视频教程

共33课时 | 17.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号