网络接口内有多少数据包正在等待处理?

网络接口内有多少数据包正在等待处理?

我有一个通过 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队列中数据约为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 缓冲区的数量。

答案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 队列中:没有其他数据包在内核中的其他地方排队。

相关内容