從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)
為了調試這個問題,我在團隊驅動程式中添加了一個printk,其中調用了dev_kfree_skb_any,但是,當丟棄計數器增加時,我在dmesg 中看不到訊息,直到我透過ethtool 重置物理接口,因此數據包被丟棄到其他地方,然而,目前我不知道如何找到確切的原因。
我還使用了 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)
您對如何調試這個有什麼想法/建議嗎?謝謝!