2012-02-14 31 views
13

要了解我在处理传入数据方面的表现如何,我想测量我的TCP和UDP套接字的队列长度。如何获得UDP套接字的排队数据量?

我知道我可以通过SO_RCVBUF套接字选项获取队列大小,并且ioctl(<sockfd>, SIOCINQ, &<some_int>)告诉我有关TCP套接字的信息。但对于UDP,ioctl只返回下一个未决数据报的大小。有没有办法如何获得队列大小的UDP,而不必分析系统表,如/proc/net/udp

+4

恐怕你不能直接获取这些信息,因为内核不支持它。 – ldx 2012-02-14 15:51:32

回答

6

由于ldx提到,它不支持通过ioctl或getsockopt。 在我看来,SIOCINQ的当前实现旨在确定需要多少缓冲区来读取整个等待缓冲区(但我想它并不那么有用,因为它可以在读取它到实际缓冲区读取)。

还有很多其他的遥测,虽然这样的系统调用不支持,我想在正常的生产使用中没有真正的需要。

您可以通过“netstat -su”检查丢弃/错误,如果您只是想监视机器状态,可以使用SNMP(udpInErrors)更好地检查丢失/错误。

顺便说一句:你总是可以选择在内核代码中进行破解并添加此值(或其他值)。

6

FWIW,我做了一些实验来绘制在不同平台上FIONREAD的行为。

平台,其中FIONREAD返回所有的数据在SOCK_DGRAM插座待定:

的Mac OS X,NetBSD的,FreeBSD的,Solaris和HP-UX,AIX,视窗

平台,其中FIONREAD回报仅用于第一个待处理数据报的字节:

Linux

也可能值得注意的是,某些实现在计数中包含头文件或其他开销字节,而其他实例只计算有效负载字节数。 Linux似乎会返回有效负载大小,不包括IP标头。

+2

恐怕这不起作用,根据[udp(7)](http://www.kernel.org/doc/man-pages/online/pages/man7/udp.7.html):_“FIONREAD (SIOCINQ):返回整数中下一个待处理数据报的大小(以字节为单位),或者当没有数据报挂起时返回0。“_ – che 2012-02-16 06:41:09

+2

我的错误:我忘记了'FIONREAD'在Linux上的工作方式与* BSD上的不同。 Solaris操作系统。我将编辑我的答案以显示平台差异。 – 2012-02-16 19:44:24