|
本帖最后由 xuanlv777 于 2024-4-19 19:48 编辑
近期发现,自己的n100软路由,网卡是Intel I226-V (rev 04),物理机直装爱快,在负载较大时,个别网口不定期断开然后重新连接(几乎天天都有),chiphell论坛同样问题很多用户反映:I226-V断流问题https://www.chiphell.com/thread-2535386-1-1.html
查询各种资料得知是TSO、LRO功能引发的问题,引用知乎帖子:
TSO? LRO? 这是什么东西?和我有关系么?https://zhuanlan.zhihu.com/p/87093404
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的工作量,看起来很美好。但是对于网关来说,启用这个功能会带来致命的问题:网络传输变慢,传输时延增加。
TSO和LRO为何会拖慢网络性能?
首先我们要知道,网关,简单的说,就是一个数据交换中心,它的职责很简单,将到达的数据包转发给下一个目的网关,或者主机。如果是家庭网关,还会包含NAT功能,对数据包的源地址或者目的地址进行转换。它不会去,也不应该修改数据包的内容。
但是从上面的描述中,TSO和LRO都会修改数据包的内容。TSO将一个大数据包切分成小段,发送出去。LRO将数据蓄积起来再传输。
要知道网关一般会有两个或者多个网络界面,以太网的话,网络界面的MTU都应该是1500,假如网卡接受数据时通过LRO将几个1500的数据片段合并,由于它是网关,并不需要处理数据,接下来它要将数据发出,发出时还是要分成1500的片段,否则大数据包直接发出去将会被丢弃。所以LRO和TSO在网关上来说,相当于一直做无用功:接受数据时进行LRO,发送出去时进行TSO......
除了无用功之外,TSO和LRO还会带来网络延时。因为LRO时,需要等待N个包才能合并。而不是一个包过来就可以马上转发出去。
说了这么多,网关或者虚拟主机一定要关闭TSO和LRO这两个特性。
当前新设备中intel i225、i226系列网卡已成为主流配置,用户众多,软路由设备中更是比比皆是,为了使爱快系统更加稳定、用户体验更好,建议爱快官方在固件中增加关闭TSO、LRO功能,不胜感激。
|
|