在定位网络问题的时候,MTU 这个参数经常会让我们特别关注,有时它会影响我们无法 SSH 到我们的远端服务器,有时它会让我们的网络延迟加长,甚至于有时还会让我们的服务器变卡,你以为我这里会来说 MTU,那不好意思,我不想说 MTU,我想说的是和 MTU 有关的 TSO。

如果你不知道什么是 MTU 的话,那么可以想象一下如果你有一辆小货车,核载量是 1 吨吧,然后你有 2 吨的多的货物需要运送,那么很显然,你是不可能一次性将这些货物都运完的(什么?超载?那是不可能的)。所以常见的做法就是一吨一吨地运,这么的一吨就是 MTU,但是,需要再补充一点的是,你的 MTU 不一定就是你的承载量,例如,你只是一个转运的工人,你需要把货物运给另外一个运送的人,但是那个人的货车却只能装载 800 KG,那么你就不能一次性运过去一吨的货物了,不然你剩下 200 KG放在原地吗?这个时候你的 MTU 又变成 800 KG 了,所以 MTU 是可以根据实际情况变化的,但是前提就是减少中间环节的卡顿,也就是不要产生货物堆积。

MTU 就简短得介绍完了,那么什么是 TSO 呢,TSO 的全称是 TCP segmentation Offload,中文叫:TCP段卸载,算了,还是忘记中文翻译吧,记住英文就好了;是的,有 TCP 也有 UDP 的 USO,原理类似,不多赘述。TSO 的作用在于减轻 CPU 的负担,将货物的分割工作交给网卡来完成。

例如,我们要传输一个 20M 的数据,因为 MTU 的存在,我们每次最多传输 1500-20 = 1480 bytes,那么就需要将数据分割成 N 份 1480 bytes,那么如果这个工作让 CPU 来做,有点浪费 CPU 的资源,于是就出现了 TSO,直接将数据交给网卡驱动,让网卡驱动去完成分割工作,从而达到减轻 CPU 工作的目的,就是这么简单。

实操

查看 tso 是否开启:

root@liqiang.io:~# ethtool --show-offload wlp3s0
Features for wlp3s0:
... ...
tcp-segmentation-offload: off
	tx-tcp-segmentation: off [fixed]
	tx-tcp-ecn-segmentation: off [fixed]
	tx-tcp-mangleid-segmentation: off [fixed]
	tx-tcp6-segmentation: off [fixed]
udp-fragmentation-offload: off
generic-segmentation-offload: on
... ...

这里的第一段就可以看出来,我的系统是没有开启 TSO 的。

开启关闭 TSO

开启 TSO

root@liqiang.io:~# ethtool -K eth0 tso on
root@liqiang.io:~# ethtool -K eth0 gso on

注意,这里没有开启 gso,只开启 tso 是没用的,因为只有开启了 gso 才会检测是否支持 tso。

关闭 TSO

root@liqiang.io:~# ethtool -K eth0 tso off
root@liqiang.io:~# ethtool -K eth0 gso off

验证 TSO

如果开启了 TSO,使用 Tcpdump 分析网络流量看到的数据是不一样的,下面给个对比。

Reference