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)的问题。

谢谢你。

4

2 回答 2

2

你会看这些文档。也就是说,其中许多参数的文档记录确实很差,所以确实希望通过谷歌搜索从博客和邮件列表中挖掘出血腥的细节。

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

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

于 2010-08-30T20:31:35.937 回答
2

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

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

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

于 2010-08-31T12:42:25.917 回答