UDP缓冲区的单位是什么?有哪些sysctl参数的文档可用?

3
我正在运行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)有类似的问题。
谢谢。
2个回答

2
您可以查看这些文档。话说,其中许多参数的文档都非常不完整,因此请准备好在博客和邮件列表中进行搜索以找出详细信息。
rmem_max是每个套接字的最大缓冲区大小(以字节为单位)。经过一番搜索,我发现这似乎是接收整个数据包的内存,因此其大小必须包括任何IP/UDP头的大小 - 尽管我对此领域还不是很了解。
但请记住,UDP确实是不可靠的。丢失的原因有很多,尤其是在交换机和路由器之间 - 这些也有缓冲区。

2

这些内容在socket(7)手册页中有详细的文档说明(以字节为单位)。

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

阅读socket(7), ip(7) 和 udp(7)手册页,了解这些内容的实际工作方式。相关的sysctls也在这些页面中有详细说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接