TSO与GSO简单区分

概念

TSO(TCP Segmentation Offload): 是一种利用网卡来对大数据包进行自动分段,降低CPU负载的技术。 其主要是延迟分段。通过硬件(网卡)实现。

GSO(Generic Segmentation Offload): GSO是协议栈是否推迟分段,在发送到网卡之前判断网卡是否支持TSO,如果网卡支持TSO则让网卡分段,否则协议栈分完段再交给驱动。 如果TSO开启,GSO会自动开启。 GSO通过软件来实现。

以下是TSO和GSO的组合关系:

  1、GSO开启, TSO开启: 协议栈推迟分段,并直接传递大数据包到网卡,让网卡自动分段
  2、GSO开启, TSO关闭: 协议栈推迟分段,在最后发送到网卡前才执行分段
  3、GSO关闭, TSO开启: 同GSO开启, TSO开启
  4、GSO关闭, TSO关闭: 不推迟分段,在tcp_sendmsg中直接发送MSS大小的数据包

目前,在linux-4.18之后UDP也开始GSO的支持,可参考此处 patch

UFO(DDP Fragmentation Offload)是一种类似于IP分片的技术,拆包之后只有第一个分片有UDP头部。

参考

https://www.kernel.org/doc/Documentation/networking/segmentation-offloads.txt
http://blog.jobbole.com/111668/
https://www.mnstory.net/2017/07/10/network-tso-ufo-gso-lro-gro/

<think>我们正在讨论如何测试Mellanox网卡的TSO功能。TSO(TCPSegmentation Offload)是一种网络卸载技术,它将TCP分段的任务从操作系统网络协议栈转移到网卡硬件上,从而减少CPU的负担。测试TSO功能通常涉及以下几个步骤:1.**确认网卡支持TSO**:首先需要确认网卡硬件和驱动程序支持TSO功能。2.**启用/禁用TSO**:在操作系统中,我们可以通过工具来启用或禁用TSO,以便进行对比测试。 3. **性能测试**:通过发送网络流量并观察CPU利用率和网络吞吐量来评估TSO的效果。具体步骤:###1.确认TSO支持在Linux系统中,我们可以使用`ethtool`命令来查看网卡对TSO的支持情况以及当前状态。```bashethtool-k<interface> ```例如,如果网卡名为`eth0`,则运行:```bashethtool-keth0| greptcp-segmentation``` 输出可能类似于: ```tcp-segmentation-offload:on``` 如果输出显示为`on`,则表示TSO已启用。另外,我们还可以查看网卡是否支持TSO:``` tcp-segmentation-offload: on[fixed]```这里的`[fixed]`表示该功能是固定的,无法更改(但通常是可以更改的)。 ###2.启用/禁用TSO我们可以使用`ethtool`命令来启用或禁用TSO。注意,需要root权限。 禁用TSO: ```bashethtool -K <interface>tsooff``` 启用TSO: ```bashethtool -K <interface>tsoon``` 例如,禁用eth0的TSO:```bashethtool-Keth0tsooff``` ###3.测试TSO效果为了测试TSO的效果,我们可以进行网络性能测试,比较启用和禁用TSO时的CPU利用率和网络吞吐量。常用的工具有`iperf3`或`netperf`。####使用iperf3测试首先,需要两台机器:一台作为服务器,一台作为客户端。在服务器端启动iperf3服务器: ```bashiperf3 -s``` 在客户端运行iperf3测试,同时监控CPU使用率。例如,运行一个TCP测试: ```bashiperf3 -c <server_ip>``` 在测试期间,我们可以使用`top`或`htop`命令观察CPU使用率。**测试步骤:** 1.在网卡上启用TSO,运行iperf3测试,记录吞吐量和客户端/服务器端的CPU使用率。 2.禁用TSO,再次运行相同的测试,记录结果。 3.对比两次测试的结果。####使用网络流量捕获验证我们还可以通过抓包来验证TSO是否生效。当TSO启用时,从协议栈发给网卡的数据包会大于MTU(例如,一个64KB的TCP数据段),然后由网卡硬件分割成符合MTU的小包。因此,在协议栈层面(即使用`tcpdump`抓包)看到的是大包,而在网卡发送出去的线路上则是小包。但是,由于TSO是在网卡硬件上进行的,我们在主机上用`tcpdump`抓包(在协议栈和网卡驱动之间)看到的是大包。在客户端运行: ```bashtcpdump -i eth0 -wtso_on.pcap```然后运行iperf3测试。停止抓包后,使用Wireshark或`tcpdump -r`查看捕获的包。当TSO启用时,我们可以看到从应用层发出的数据包大小大于MTU(例如,大于1500字节)。而禁用TSO时,应用层发出的数据包已经被协议栈分割成小于等于MTU的大小。###注意事项-测试时确保网络环境稳定,避免其他因素干扰。 -多次测试取平均值,以减少误差。 -Mellanox网卡通常有自己的一套工具(如Mellanox NICDiagnosticsTools),也可以使用这些工具进行更深入的测试。###引用说明以上步骤中使用的工具和命令是Linux网络性能测试的常用方法[^1][^2]。§§相关问题§§1.如何测试Mellanox网卡的UDP卸载(USO)功能? 2.除了TSO,还有哪些网络卸载技术可以提升服务器性能?3.在虚拟化环境中如何测试网卡的TSO功能? 4.如何通过内核参数调整来优化TSO性能?</think>### 测试 Mellanox 网卡 TSO 功能的步骤 #### 1. **确认 TSO 支持状态** ```bash # 查看网卡名称(如 eth0 或 enp1s0) ip link show # 检查 TSO 状态(替换 eth0 为实际网卡名) ethtool -k eth0 | grep tcp-segmentation-offload ``` - **输出说明**: - `tcp-segmentation-offload: on` 表示已启用 - `[fixed]` 表示硬件固定支持,不可修改 - 若显示 `off`,需手动启用 #### 2. **控制 TSO 开关** ```bash # 启用 TSO(需 sudo 权限) ethtool -K eth0 tso on # 禁用 TSO(对比测试用) ethtool -K eth0 tso off ``` #### 3. **性能测试方法** **(1) 带宽 CPU 占用测试** ```bash # 服务器端启动 iperf3 服务 iperf3 -s # 客户端测试(替换 SERVER_IP) iperf3 -c SERVER_IP -t 30 -P 4 ``` - **对比指标**: - TSO **开启时**:高吞吐量 + **低 CPU 占用**(网卡处理分段) - TSO **关闭时**:吞吐量下降 + **高 CPU 占用**(协议栈处理分段) **(2) 抓包验证** ```bash # 捕获协议栈输出的大包(TSO 开启时) tcpdump -i eth0 -w tso_on.pcap 'tcp and port 5201' # 捕获物理网卡发出的小包(需端口镜像) # 物理链路可见 MTU 级别的分片包 ``` - **关键证据**: - TSO 开启时:协议栈输出大于 MTU 的数据包(如 64KB) - TSO 关闭时:协议栈输出 ≤ MTU 的数据包(如 1500B) #### 4. **内核状态监控** ```bash # 查看协议栈分段统计(TSO 关闭时计数增加) nstat -az TcpTSO* | grep -v " 0" ``` - 关键指标:`TcpTSODefer`(延迟分段)、`TcpSegsFailed`(分段失败) #### 5. **Mellanox 专用工具** ```bash # 安装 Mellanox 工具包 apt-get install mstflint # 查看硬件卸载统计 ethtool -S eth0 | grep -E 'tso.*packets' ``` - 输出 `tso_packets` 计数增加表明硬件成功处理分段 ### 测试结果解读 | 状态 | 吞吐量 | CPU 占用 | 抓包特征 | 硬件计数 | |----------|--------|----------|-------------------------|----------| | TSO **开启** | 高 | **低** | 协议栈输出大包 (>MTU) | 增加 | | TSO **关闭** | 较低 | **高** | 协议栈输出小包 (≤MTU) | 无变化 | > **注意**:虚拟化环境中需额外检查: > 1. 虚拟机网卡驱动是否支持 TSO > 2. 宿主机网卡 TSO 状态 > 3. 虚拟机配置 `ethtool -K veth0 tso on`[^1][^2] --- ### 相关问题 1. **如何区分 TSOGSO/GRO 的功能差异?** 2. **在 Kubernetes 集群中如何批量检查节点的 TSO 配置?** 3. **TSO 开启导致网络延迟增加的故障该如何排查?** 4. **Mellanox 网卡驱动不支持 TSO 时有哪些替代优化方案?** [^1]: 普通网卡是用软件方式进行一系列TCP/IP相关操作,因此会在数据复制、协议处理和中断处理三方面增加服务器负担。TSO将TCP分段任务卸载到网卡硬件处理。 [^2]: Linux内核网络栈的分层模型中,TSO作用于网络设备接口层网卡驱动层之间,在协议栈输出大包后由网卡硬件执行分片操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值