我有一个通过UDP套接字发送大量流量的应用程序,每个数据包都在两个接口上发送:enp2s0 (1 1Gbit以太网设备)和enx00808a8eba78 (100 1Gbit以太网设备)。
最大套接字发送缓冲区是默认的(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 由于200 k的数据在套接字中挂起,但在第二个qdisc中只有40k排队,所以我假设剩下的160 k在慢接口驱动程序(enx00808a8eba78)中挂起。
是否有一种方法可以检查有多少包(或数据)正在等待在USB设备中传输,或者更一般地在网络设备中传输?
类似于为TX准备好但尚未发送的DMA缓冲区的数量。
发布于 2019-01-29 16:27:38
似乎没有从用户空间中检索设备队列长度的方法。
顺便说一句,如果有人感兴趣的话,还有一些细节:
usbnet设备使用struct usbnet的字段txq.qlen跟踪排队的TX数据包。最大TX队列长度由字段tx_qlen of struct usbnet定义。
在我的示例中,我有60个(tx_qlen)数据包在USB驱动程序中排队,而(或多或少)在qdisc中有30个数据包,每个包包含1500个字节的数据。由于套接字缓冲区是考虑到skb->truesize (即skb数据+ skb结构大小)计算的,因此每个数据包为2.3k:
2.3k * (60 + 30) ~= 200k这证实了网络驱动程序中排队的数据包占用了套接字缓冲区的138 k,而套接字缓冲区的69k位于qdisc队列中:内核中没有其他数据包排队。
https://unix.stackexchange.com/questions/497260
复制相似问题