ネットワークインターフェイス内で処理を待っているパケットの数は何ですか?

ネットワークインターフェイス内で処理を待っているパケットの数は何ですか?

UDPソケットを介して多くのトラフィックを送信するアプリケーションがあり、各パケットはenp2s0(1Gbitイーサネットデバイス)とenx00808a8eba78(100Mbit USBイーサネットデバイス)の2つのインターフェイスで送信されます。
最大ソケットトランスポートバッファはデフォルト値(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キュー内のデータは約40,000個です。

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データはソケットで待機していますが、2番目のqdiscでは40kデータのみがキューに入れられているため、残りの160kデータはenx00808a8eba78遅いインターフェースドライバ()内で待機していると仮定します。

USBデバイスまたはより一般的に転送を待っているネットワークデバイスにどれだけのパケット(またはデータ)があるかを確認する方法はありますか?
たとえば、TX 準備ができているがまだ送信されていない DMA バッファの数です。

答え1

ユーザー空間でデバイスキューの長さを取得する方法がないようです。


しかし、興味のある人がいる場合は、いくつかの詳細を提供してください。

usbnettxq.qlenキュー内のTXパケットを追跡するためにデバイスが使用するフィールドstruct usbnet。最大TXキュー長はtx_qlenフィールドによって定義されますstruct usbnet

私の例では、tx_qlenUSBドライバにキューに60()のパケットがあり、qdiscに(およそ)30のパケットがあり、それぞれ1500バイトのデータを転送します。ソケットバッファはskb->truesize(すなわちskbデータ+skb構造サイズ)を考慮して計算されるので、パケットあたり2.3kです。

2.3k * (60 + 30) ~= 200k

これは、ソケットバッファの138kがネットワークドライバのキュー内のパケットによって消費され、ソケットバッファの69kがqdiscキューにあることを確認します。つまり、他のパケットはカーネルの他の場所にキューに入れられません。

関連情報