https://zhuanlan.zhihu.com/p/87093404
TSO和LRO,对于熟悉网络的人来说,也是非常陌生,很难碰到。不过一旦你碰到和它相关的问题之后,那么你将会印象深刻,从此记住它们!
TSO的缩写是TCP Segmentation Offload,直译为:TCP分段卸载。查询了一下,好像还没有什么正式的中文翻译。
经过岁月的洗礼,TCP/IP基本上把其他传输协议都干掉了。我们都知道TCP/IP成为互联网数据的事实传输标准。TCP/IP传输的一个重要特点就是数据分段传输。我们电脑上不管多大的文件,使用TCP传输时,都会分成一个个小小的数据段进行传输。
如上图左边所示,应用层的数据经过传输层之后,就分成一个个小小的数据片段,然后层层加数据头,到达网卡硬件,再发送出去。如上图右边所示,对方网卡收到之后,也是同样,层层去头,最后合并以后还原成为发送时的数据。
那么由谁来负责将数据分割成一个个数据包呢?操作系统来干。早期是由CPU来做这个事情。千兆网络的传输,一秒125MByte,假设分成1500字节一个包,那么要分成833333份。
但是对于万兆网络来说,数据传输量变成千兆的10倍,但是TCP/IP包的大小还是1500,所以包的数量变成千兆网络的10倍,CPU处理起来比以前费力多了(CPU的主频并没有变成以前的10倍)。
那么最好的办法就是将数据分段这个事情下放(offload)到网卡去做。这就是TSO技术的源来。现在的网卡,大都支持TSO这个特性,数据直接扔给驱动,网卡自己会自动切割分包。
同样,LRO(Large Receive Offload)也是做同样的事情,网卡收到多个包之后,合并成一个大数据包再发给应用层。
TSO和LRO大大解放了CPU的工作量,看起来很美好。但是对于网关来说,启用这个功能会带来致命的问题:网络传输变慢,传输时延增加。
首先我们要知道,网关,简单的说,就是一个数据交换中心,它的职责很简单,将到达的数据包转发给下一个目的网关,或者主机。如果是家庭网关,还会包含NAT功能,对数据包的源地址或者目的地址进行转换。它不会去,也不应该修改数据包的内容。
但是从上面的描述中,TSO和LRO都会修改数据包的内容。TSO将一个大数据包切分成小段,发送出去。LRO将数据蓄积起来再传输。
要知道网关一般会有两个或者多个网络界面,以太网的话,网络界面的MTU都应该是1500,假如网卡接受数据时通过LRO将几个1500的数据片段合并,由于它是网关,并不需要处理数据,接下来它要将数据发出,发出时还是要分成1500的片段,否则大数据包直接发出去将会被丢弃。所以LRO和TSO在网关上来说,相当于一直做无用功:接受数据时进行LRO,发送出去时进行TSO......
除了无用功之外,TSO和LRO还会带来网络延时。因为LRO时,需要等待N个包才能合并。而不是一个包过来就可以马上转发出去。
说了这么多,网关或者虚拟主机一定要关闭TSO和LRO这两个特性。
对于FreeBSD来说,关闭这两个功能很简单。
我们先看一下当前网卡已经启用的特性。我的机器是i350芯片,驱动是igb。
$ ifconfig igb0
igb0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=e507bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6>
ether f4:ce:46:a9:00:fc
inet 192.168.11.240 netmask 0xffffff00 broadcast 192.168.11.255
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
可以看到options里面有TSO4 TSO6 LRO这些字样。(TSO4指IPV4的TSO, TSO6指IPV6的TSO)
那么怎么关闭这两个特性?执行下面的命令就行。
root@vmhost240:~ # ifconfig igb0 -tso -lro
root@vmhost240:~ # ifconfig igb0
igb0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=e500bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6>
ether f4:ce:46:a9:00:fc
inet 192.168.11.240 netmask 0xffffff00 broadcast 192.168.11.255
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
再看一下,TSO4 TSO6 LRO已经不在options出现了,这些特性就没有启用。
同样,对于虚拟主机来说,由于有虚拟交换机的存在,和虚拟交换机相连的物理网卡也要关闭这两个特性,否则虚拟机对外的网络传输性能将会很差。