我正在运行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找到参数单位的详细信息?我有类似的单位和每X问题有关其他参数,如net.core.netdev_max_backlog和net.ipv4.igmp_max_memberships。
谢谢。
答案 0 :(得分:2)
你会查看these个文档。也就是说,其中许多参数确实记录得非常糟糕,所以请务必使用谷歌搜索从博客和邮件列表中挖掘出血腥的细节。
rmem_max是每个套接字最大缓冲区,以字节为单位。四处搜索,这似乎是接收整个数据包的内存,因此大小必须包括任何/ ip / udp标头的大小 - 尽管这个区域对我来说非常模糊。
请注意,UDP 不可靠。丢失的来源很多,而不是交换机和路由器之间的最小 - 这些也有缓冲区。
答案 1 :(得分:2)
它完全记录在socket(7)手册页中(以字节为单位)。
此外,可以使用SO_RCVBUF在每个插槽的基础上设置限制(如同一页中所述)。
阅读socket(7),ip(7)和udp(7)手册页,以获取有关这些内容如何实际工作的信息。这里记录了sysctls。