【问题标题】:What are the units of UDP buffers, and where are docs for sysctl params?UDP 缓冲区的单位是什么,sysctl 参数的文档在哪里?
【发布时间】:2011-04-05 22:53:48
【问题描述】:

我正在运行 x86_64 RedHat 5.3(内核 2.6.18)并在尝试设置 UDP 缓冲区的上下文中专门查看来自 sysctl -a 的 net.core.rmem_max。接收器应用程序有时会丢失数据包,但我认为缓冲区已经足够大了,具体取决于它的含义:

此设置的单位是什么——位、字节、数据包或页?如果是位或字节,它是来自数据报/有效负载(例如 100 字节)还是网络 MTU 大小(~1500 字节)?如果是页面,页面大小是多少(以字节为单位)?

这是每个系统、每个物理设备 (NIC)、每个虚拟设备 (VLAN)、每个进程、每个线程、每个套接字/每个多播组的最大值吗?

例如,假设我的数据是每条消息 100 字节,每个网络数据包包含 2 条消息,并且我希望每个套接字能够缓冲 50,000 条消息,并且我在 4 个线程中的每个线程上打开 3 个套接字。 net.core.rmem_max 应该有多大?同样,当我在应用程序中设置套接字选项时,单位是有效负载字节,所以在这种情况下每个套接字上都是 5000000?

最后,一般来说,我如何找到通过 sysctl -a 看到的参数的单位详细信息?我对其他参数(例如 net.core.netdev_max_backlog 和 net.ipv4.igmp_max_memberships)有类似的单位和每 X 问题。

谢谢。

【问题讨论】:

    标签: linux sockets udp buffer sysctl


    【解决方案1】:

    您会查看 these 文档。话虽如此,其中许多参数的文档记录确实很差,因此请务必使用谷歌搜索从博客和邮件列表中挖掘出血淋淋的细节。

    rmem_max 是每个套接字的最大缓冲区,以字节为单位。仔细研究,这似乎是接收整个数据包的内存,因此大小还必须包括任何/ip/udp 标头的大小 - 尽管这个区域对我来说非常模糊。

    请记住,UDP 不可靠的。丢失的来源很多,尤其是在交换机和路由器之间——它们也有缓冲区。

    【讨论】:

      【解决方案2】:

      它在 socket(7) 手册页中有完整的记录(以字节为单位)。

      此外,可以使用 SO_RCVBUF 在每个套接字的基础上设置限制(如同一页面中所述)。

      阅读 socket(7)、ip(7) 和 udp(7) 手册页,了解这些东西如何实际工作的信息。 sysctl 记录在那里。

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 1970-01-01
        • 2018-12-06
        • 1970-01-01
        • 1970-01-01
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多