团队接口丢弃数据包

团队接口丢弃数据包

从 3.10.104 升级到内核 4.14 后,我发现在主动备份模式下,团队接口 (TX) 上不断出现丢包 (大约 10 个数据包/秒),增加物理端口上的 txqueuelen 有所帮助,但是,丢包仍然会不时发生。

以下是 eth6 上 txqueuelen 为 0 的 ifconfig 输出

team0      Link encap:Ethernet  HWaddr 00:1E:67:B5:7F:76
      inet addr:192.168.221.203  Bcast:0.0.0.0  Mask:255.255.255.0
      inet6 addr: fe80::21e:67ff:feb5:7f76/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:837 errors:0 dropped:671 overruns:0 frame:0
      TX packets:282219490 errors:0 dropped:169438 overruns:0 carrier:0
      collisions:0 txqueuelen:10000
      RX bytes:27531 (26.8 KiB)  TX bytes:113995992408 (106.1 GiB)

物理接口:

eth6      Link encap:Ethernet  HWaddr 00:1E:67:B5:7F:76  
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:837 errors:0 dropped:0 overruns:0 frame:0
      TX packets:282218759 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:74718 (72.9 KiB)  TX bytes:383252978322 (356.9 GiB)

为了调试这个问题,我在调用 dev_kfree_skb_any 的团队驱动程序中添加了一个 printk,但是,虽然丢弃计数器增加了,但直到我通过 ethtool 重置物理接口,我才在 dmesg 中看到消息,因此数据包被丢弃在其他地方,但是,现在,我不知道如何找到确切的原因。

我还使用过 dropwatch 实用程序,它会产生大量输出,显示大量丢包,但是,它在内核 3.10 上会生成类似的输出,使用 ifconfig 不会看到丢包。我猜它记录了其他内容,可能是内核丢弃的输入数据包,因此有用的信息会丢失。以下是 4.14 上的 dropwatch 输出,按唯一符号排序:

__udp4_lib_rcv+6b0 (0xffffffff8155ce77)
ip_forward+98 (0xffffffff81534f88)
kfree_skb_list+13 (0xffffffff814f0d22)
sk_stream_kill_queues+4a (0xffffffff814f68a9)
tcp_v4_do_rcv+154 (0xffffffff815508e9)
tcp_v4_rcv+1de (0xffffffff81552490)
unix_stream_connect+3b4 (0xffffffff81586890)

你对如何调试这个问题有什么想法或建议吗?谢谢!

相关内容