的Linux的UDP最大规模的接收缓冲区
问题描述:
什么是Linux的UDP的最大尺寸接收缓冲区?我以为这只是受可用RAM限制,但是当我设置的Linux的UDP最大规模的接收缓冲区
5GB的rmem_max:
echo 5000000000 > /proc/sys/net/core/rmem_max
和4GB的实际套接字缓冲区(二郎):
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可用。
答
看来,Linux中有一个极限。 我曾尝试将rmem_max设置为2^32-1成功。
[email protected]:/proc/sys/net/core# echo 2147483647 > rmem_max
[email protected]:/proc/sys/net/core# cat rmem_max
2147483647
2^32是太多:
[email protected]:/proc/sys/net/core# echo 2147483648 > rmem_max
[email protected]:/proc/sys/net/core# cat rmem_max
-18446744071562067968
设置为50亿个收益率:
[email protected]:/proc/sys/net/core# echo 5000000000 > rmem_max
[email protected]:/proc/sys/net/core# cat rmem_max
705032704
我在蟒蛇已经测试设置和获取套接字接收与
ss.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufferSize)
print ss.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)
缓冲
如果 'BUFFERSIZE'是小于1024个立方公尺程序打印一倍“BUFFERSIZE”,否则它退回到256
值705032704 * 2 = 1410065408靠近对netstat获得的1409995136。
+0
事实上,我没有验证正在落实rmem_max实际值。谢谢。看起来缓冲区大小仅限于带符号整数,没有明确的原因。 – 2013-05-10 08:32:31
答
2^32-1(2147483647,最大32位带符号的整数)
[email protected]@localhost:~# sysctl -w net.core.rmem_max=2147483647
net.core.rmem_max = 2147483647
[email protected]:~# sysctl -w net.core.rmem_max=2147483648
sysctl: setting key "net.core.rmem_max": Invalid argument
net.core.rmem_max = 2147483648
呼应到/proc
文件系统出现试图设置较大的值时溢出。
它在哪里说这是仅受可用RAM的限制?为什么你认为你需要一个4GB的缓冲区? – EJP 2013-05-09 11:59:58
它不。它并没有说它以任何其他方式受到限制。我需要这样一个缓冲区来避免在长时间的网络流量中丢失数据。 – 2013-05-09 12:05:36
恰恰相反。它说,内核可以调整你提供向上或向下的价值,并建议你打电话'的getsockopt()',看看有什么价值实际上被分配。我很难相信你需要4GB来处理流量高峰。可能你应该更快地阅读。 – EJP 2013-05-10 00:28:33