转自http://blog.csdn.net/littlefang/article/details/50505527

在一台Linux设备上,使用tcpdump捕包获从另一台设备tcpreplay的报文,发现接收顺序与回放包序列不一致。


问题排查

乱序表现为三次握手的SYN、SYN-ACK包出现在数据包之后。尤为奇怪的是光纤直连的情况下没有乱序,但是通过交换机后就乱序了。为了排查是否是交换机导致的乱序,通过分光器对光路一分二,另一台接受同样流量的设备tcpdump捕包没有乱序。 
因此,推测乱序问题是出现在捕包网卡上。在排除网卡GRO原因导致的乱序后,重点怀疑网卡多队列导致的。

解决方案

使用下面的命令,将网卡队列数设置为1,之后乱序情况消失。

ethtool -S eth0 #查看队列个数

ethtool -L eth0 combined # 配置队列个数.

反思

1、一般网卡上都有多个发送和接收队列,用来减少CPU中断数,网卡上也会采用哈希算法保证同一TCP链接获同一IP地址的数据分配到一个队列,从而避免乱序的情况。文中反应的网卡,不知为何出现这样的情况。 
2、同样的流量,同样的接收网卡,通过交换机回放和光纤直连回放竟然会产生乱序和不乱序两种结果,而使用wireshark的查看报的到达时序间隔,也没有发现特殊之处,实在令人费解。


[1]: https://toontong.github.io/blog/ethtool.html ethtool 开启多队列网卡 
[2]: http://www.danoking.com/2012/06/04/平定igb之乱/ 平定igb之乱[链接失效] 
[3]:http://blog.csdn.net/littlefang/article/details/50505760 [转载]平定igb之乱

Logo

更多推荐