Kernel
網路介面中有多少數據包待處理?
我有一個通過 UDP 套接字發送大量流量的應用程序,每個數據包都在 2 個介面上發送:
enp2s0
(1Gbit 乙太網設備)和enx00808a8eba78
(100Mbit usb-乙太網設備)。最大套接字發送緩衝區是預設值(212992 字節),並且在流量執行時大部分時間是滿的:
root@punk:~# netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 211968 0.0.0.0:x11-2 0.0.0.0:*
兩個介面的 qdisc queue 中的數據大約是 40k:
root@punk:~# tc -s qdisc show dev enp2s0 qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 1697909529 bytes 1136534 pkt (dropped 0, overlimits 0 requeues 12) backlog 0b 0p requeues 12 root@punk:~# tc -s qdisc show dev enx00808a8eba78 qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 1675952337 bytes 1121840 pkt (dropped 0, overlimits 0 requeues 55) backlog 43326b 29p requeues 55
由於 200k 的數據在套接字中待處理,但只有 40k 在第二個 qdisc 中排隊,我假設剩餘的 160k 在慢速介面驅動程序 (
enx00808a8eba78
) 中待處理。有沒有辦法檢查有多少數據包(或數據)正在等待在 USB 設備或更一般地在網路設備中傳輸?
類似於為 TX 準備好但尚未發送的 DMA 緩衝區的數量。
似乎沒有辦法從使用者空間檢索設備隊列長度。
順便說一句,如果有人感興趣,請提供一些細節:
usbnet
設備txq.qlen
使用struct usbnet
. 最大 TX 隊列長度由 的欄位tx_qlen
定義struct usbnet
。在我的範例
tx_qlen
中,USB 驅動程序中有 60 個(由於計算套接字緩衝區時考慮了skb->truesize
(即 skb 數據 + skb 結構大小),因此每個數據包為 2.3k:2.3k * (60 + 30) ~= 200k
這證實了 138k 的套接字緩衝區被網路驅動程序中排隊的數據包消耗,而 69k 的套接字緩衝區在 qdisc 隊列中:沒有其他數據包在核心的其他地方排隊。