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 데이터가 소켓에 대기 중이지만 두 번째 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 대기열에 있음을 확인합니다. 즉, 다른 패킷은 커널의 다른 곳에 대기열에 있지 않습니다.