我正在运行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的问题.
谢谢.
解决方法:
您将查看these文档.就是说,其中许多参数的确记录得很差,因此,请不要指望谷歌在博客和邮件列表中挖掘出血腥的细节.
rmem_max是每个套接字的最大缓冲区,以字节为单位.挖掘一下,这似乎是接收到整个数据包的内存,因此大小也必须包括what / ip / udp标头的大小-尽管这对我来说很模糊.
但是请记住,UDP是不可靠的.有很多损失源,尤其是交换机和路由器之间,也有缓冲区.