首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个网络接口中有多少个数据包挂起?

在一个网络接口中有多少个数据包挂起?
EN

Unix & Linux用户
提问于 2019-01-28 17:42:20
回答 1查看 1.2K关注 0票数 1

我有一个通过UDP套接字发送大量流量的应用程序,每个数据包都在两个接口上发送:enp2s0 (1 1Gbit以太网设备)和enx00808a8eba78 (100 1Gbit以太网设备)。

最大套接字发送缓冲区是默认的(212992字节),并且在大多数情况下,当流量运行时它是满的:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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缓冲区的数量。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 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:

代码语言:javascript
复制
2.3k * (60 + 30) ~= 200k

这证实了网络驱动程序中排队的数据包占用了套接字缓冲区的138 k,而套接字缓冲区的69k位于qdisc队列中:内核中没有其他数据包排队。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/497260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档