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
ユーザー空間でデバイスキューの長さを取得する方法がないようです。
しかし、興味のある人がいる場合は、いくつかの詳細を提供してください。
usbnet
txq.qlen
キュー内のTXパケットを追跡するためにデバイスが使用するフィールドstruct usbnet
。最大TXキュー長はtx_qlen
フィールドによって定義されますstruct usbnet
。
私の例では、tx_qlen
USBドライバにキューに60()のパケットがあり、qdiscに(およそ)30のパケットがあり、それぞれ1500バイトのデータを転送します。ソケットバッファはskb->truesize
(すなわちskbデータ+skb構造サイズ)を考慮して計算されるので、パケットあたり2.3kです。
2.3k * (60 + 30) ~= 200k
これは、ソケットバッファの138kがネットワークドライバのキュー内のパケットによって消費され、ソケットバッファの69kがqdiscキューにあることを確認します。つまり、他のパケットはカーネルの他の場所にキューに入れられません。