【问题标题】:How do I get amount of queued data for UDP socket?如何获取 UDP 套接字的排队数据量?
【发布时间】:2012-03-16 04:40:58
【问题描述】:

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

我知道我可以通过SO_RCVBUF 套接字选项获取队列大小,并且ioctl(<sockfd>, SIOCINQ, &<some_int>) 告诉我有关 TCP 套接字的信息。但对于 UDP,SIOCINQ/FIONREAD ioctl 仅返回下一个待处理数据报的大小。有没有办法获取 UDP 的队列大小,而无需解析 /proc/net/udp 等系统表?

【问题讨论】:

  • 内核不支持,恐怕你无法直接获取到这些信息。

标签: linux sockets udp


【解决方案1】:

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

FIONREAD 返回 SOCK_DGRAM 套接字中所有待处理数据的平台:

Mac OS X、NetBSD、FreeBSD、Solaris、HP-UX、AIX、Windows

FIONREAD 仅返回第一个待处理数据报的字节的平台:

Linux

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

【讨论】:

  • 恐怕这不起作用,根据udp(7): "FIONREAD (SIOCINQ): 返回下一个待处理数据报的大小(以字节为单位),如果没有数据报,则返回 0待处理。”
  • 我的错:我忘记了FIONREAD 在 Linux 上的工作方式与在 *BSD 和 Solaris 上的工作方式不同。我将编辑我的答案以显示平台差异。
【解决方案2】:

正如 ldx 提到的,它不受 ioctl 或 getsockopt 支持。 在我看来,当前 SIOCINQ 的实现旨在确定读取整个等待缓冲区需要多少缓冲区(但我想这不是很有用,因为它可以在读取它到实际缓冲区之间改变阅读)。

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

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

顺便说一句:您始终可以选择修改内核代码并添加此值(或其他值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多