【发布时间】:2013-05-09 11:04:13
【问题描述】:
Linux UDP 接收缓冲区的最大大小是多少?我认为它仅受可用 RAM 的限制,但是当我设置时
rmem_max 为 5GB:
echo 5000000000 > /proc/sys/net/core/rmem_max
以及 4GB 的实际套接字缓冲区(在 Erlang 中):
gen_udp:listen(Port, [{recbuf, 4000000000}])
当我测量缓冲区利用率时,它显示:
# netstat -u6anp | grep 5050
udp6 1409995136 0 :::5050 :::* 13483/beam.smp
我不能超过这个 1.4GB。对于较小的缓冲区大小,例如500MB,实际缓冲区大小与配置值匹配。我的系统是 Debian 6.0,机器有 50GB RAM 可用。
【问题讨论】:
-
它在哪里说它仅受可用 RAM 限制?为什么你认为你需要一个 4GB 的缓冲区?
-
它没有。它也没有说它以任何其他方式受到限制。我需要这样一个缓冲区来避免在较长的网络流量窥视期间丢失数据。
-
相反。它说内核可能会向上或向下调整您提供的值,并建议您致电
getsockopt()以查看实际分配的值。我很难相信你需要 4GB 来处理流量高峰。也许你应该读得更快。 -
“它说内核可能会向上或向下调整你提供的值”你在哪里找到这个信息?如何在一个线程中比“while(true){recv(Socket)}”更快地阅读?为了测试,我在收到数据包后丢弃它们。我每秒可以读取 60000 个 600B 大小的数据包,而生成 200000/s 的流量不是问题。在这些条件下,缓冲区会在 16 秒后填满。你不能客观地说 10s 是一瞥,但 20s 不是。我宁愿期待,有了更好的机器,我能够在偷看更长的时间内存活下来。
-
20 多年来,我一直在 man 页面中阅读该声明。这不是新闻。你怎么知道你在接收端丢包?
标签: linux sockets network-programming udp buffer