2013-05-09 73 views
9

什么是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可用。

+1

它在哪里说这是仅受可用RAM的限制?为什么你认为你需要一个4GB的缓冲区? – EJP 2013-05-09 11:59:58

+0

它不。它并没有说它以任何其他方式受到限制。我需要这样一个缓冲区来避免在长时间的网络流量中丢失数据。 – 2013-05-09 12:05:36

+1

恰恰相反。它说,内核可以调整你提供向上或向下的价值,并建议你打电话'的getsockopt()',看看有什么价值实际上被分配。我很难相信你需要4GB来处理流量高峰。可能你应该更快地阅读。 – EJP 2013-05-10 00:28:33

回答

9

看来,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 = 141006540​​8靠近对netstat获得的1409995136。

+0

事实上,我没有验证正在落实rmem_max实际值。谢谢。看起来缓冲区大小仅限于带符号整数,没有明确的原因。 – 2013-05-10 08:32:31

0

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文件系统出现试图设置较大的值时溢出。