tso/gso可通过ethtool命令查看和配置,并通过iperf3与tcpdump抓包验证其是否生效。1. 使用ethtool -k <interface>检查网卡当前卸载功能状态,关注tso、gso、sg和tx-checksumming字段。2. 通过sudo ethtool -k <interface> tso on/gso on开启功能,或off关闭。3. 使用iperf3建立高吞吐连接,同时用tcpdump在发送端抓包,若tso/gso开启,抓包显示大包(如65535字节);关闭则显示mtu大小包。4. 对比开启与关闭状态下的吞吐量和cpu利用率,验证性能差异。5. 接收端抓包始终显示mtu大小帧,证明分段发生在发送端网卡。

测试Linux网络接口的TSO/GSO(TCP/Generic Segmentation Offload)分段卸载功能,核心在于利用
ethtool
iperf3
tcpdump

解决方案: 要验证TSO/GSO是否生效,我们通常会采取以下步骤:
ethtool -k <interface_name>
ethtool -k eth0
tso
gso
sg
tx-checksumming
[fixed]
[off]
[on]
ethtool
tso
gso
sg
tx-checksumming
iperf3
iperf3 -s
iperf3 -c <server_ip> -t 30
iperf3 -c
tcpdump
tcpdump
tcpdump
tcpdump
iperf3
top
mpstat
TSO/GSO究竟是什么,它对网络性能有何影响?

在我看来,TSO和GSO这俩玩意儿,说白了,就是为了让CPU能少干点活,把一些原本它要做的繁琐工作甩给网卡或者内核更高效的机制去处理。这在处理高并发、大数据量传输的场景下,简直是性能优化的利器。
TSO (TCP Segmentation Offload):顾名思义,它主要是针对TCP协议的。通常情况下,如果应用程序要发送一个很大的数据块(比如几万字节),TCP/IP协议栈在将数据交给网卡之前,需要把这个大块数据分割成一个个符合网络MTU(最大传输单元,以太网通常是1500字节)大小的TCP段。这个分割过程,包括计算每个段的TCP头部、校验和等,都是CPU的活儿。TSO的出现,就是让这个分割任务从CPU转移到支持TSO的网卡硬件上。这样,CPU只需要将一个巨大的TCP数据块(可以高达64KB甚至更多)连同其头部信息一次性扔给网卡,网卡自己会负责将其切割成符合MTU的小包,并加上正确的TCP/IP头部和校验和再发送出去。这极大地减少了CPU处理每个小包的开销,降低了CPU利用率,提高了整体的吞吐量。

GSO (Generic Segmentation Offload):你可以把它理解为TSO的泛化版本。TSO只管TCP,而GSO则能处理更多类型的协议,比如UDP、GRE等。GSO的机制略有不同,它不一定完全依赖网卡硬件。如果网卡不支持TSO,或者是在虚拟化环境中(比如虚拟机内部的虚拟网卡),GSO可以在内核层面进行大包的聚合和分发。也就是说,应用程序仍然可以发送大块数据给内核,内核会以大包的形式在内部传输,直到数据即将离开物理网卡或者需要被虚拟化层处理时,才进行最终的分段。这同样能减少内核处理每个小包的上下文切换和中断次数,提升效率。
对网络性能的影响:
tcpdump
在我看来,TSO/GSO是现代高性能网络栈的基石之一,理解并善用它,对于优化网络服务性能至关重要。
如何通过ethtool命令管理TSO/GSO状态?
ethtool
ethtool
-k
-k
首先,要查看一个网络接口(比如
eth0
ethtool -k eth0
执行后,你会看到一长串的输出,里面包含了各种卸载功能的开启/关闭状态。我们需要重点关注这几项:
tcp-segmentation-offload: on [fixed]
off
[fixed]
generic-segmentation-offload: on [fixed]
off
scatter-gather: on [fixed]
off
tx-checksumming: on [fixed]
off
[fixed]
on
[fixed]
接下来,如果你需要修改这些状态(通常是为了测试目的,比如关闭它们来观察性能变化),你可以使用
-k
要关闭TSO:
sudo ethtool -K eth0 tso off
要开启TSO:
sudo ethtool -K eth0 tso on
同样地,对于GSO: 要关闭GSO:
sudo ethtool -K eth0 gso off
要开启GSO:
sudo ethtool -K eth0 gso on
请注意,这些命令修改的状态通常是临时的,即系统重启后会恢复到默认设置。如果你想让这些设置持久化,你需要根据你的Linux发行版和网络配置方式来操作:
networkd
/etc/systemd/network/*.network
NetworkManager
ethtool
ifupdown
/etc/network/interfaces
post-up ethtool -K eth0 tso off
ifcfg
/etc/sysconfig/network-scripts/ifcfg-<interface_name>
ETHTOOL_OPTS="-K ${DEVICE} tso off"ethtool
/etc/rc.local
systemd
我个人在生产环境中很少去主动关闭TSO/GSO,因为它们通常是性能的正面因素。除非遇到非常特殊的网络问题,怀疑是卸载功能导致的,才会去尝试关闭它们进行排查。
在实际网络流量中,如何验证TSO/GSO是否生效?
验证TSO/GSO是否真正生效,光看
ethtool
tcpdump
核心验证逻辑: 如果TSO/GSO功能开启,Linux内核在发送数据时,会将一个非常大的数据块(比如64KB)直接交给网卡处理。此时,如果你在发送端的网卡接口上用
tcpdump
tcpdump
具体验证步骤:
准备测试环境:
iperf3
tcpdump
eth0
基准测试(TSO/GSO关闭):
sudo ethtool -K eth0 tso off gso off
tcpdump
sudo tcpdump -i eth0 -n -s 0 -w /tmp/tso_off.pcap host <接收端IP> and tcp port <iperf3端口> # 例如:sudo tcpdump -i eth0 -n -s 0 -w /tmp/tso_off.pcap host 192.168.1.10 and tcp port 5201
-s 0
-n
iperf3
iperf3 -s
iperf3
iperf3 -c <接收端IP> -P 1 -t 10 # -P 1表示单线程,-t 10表示运行10秒
tcpdump
wireshark
tshark
/tmp/tso_off.pcap
功能验证(TSO/GSO开启):
sudo ethtool -K eth0 tso on gso on
iperf3
sudo tcpdump -i eth0 -n -s 0 -w /tmp/tso_on.pcap host <接收端IP> and tcp port <iperf3端口> iperf3 -c <接收端IP> -P 1 -t 10
tcpdump
/tmp/tso_on.pcap
tcpdump
额外验证:
iperf3
top
mpstat -P ALL 1
iperf3
sy
us
tcpdump
我个人的经验:在排查一些网络性能瓶颈时,我经常会用到这个方法。有时候,即使
ethtool -k
on
以上就是如何测试Linux网络接口TSO/GSO 分段卸载功能验证的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号