从 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)
你对如何调试这个问题有什么想法或建议吗?谢谢!