Linux UDP接收缓冲区的最大大小

Linux UDP接收缓冲区的最大大小是多less? 我认为这只受可用内存的限制,但是当我设置时

5GB的rmem_max:

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,实际的缓冲区大小与configuration的值相匹配。 我的系统是Debian 6.0,机器有50GB RAM可用。

Solutions Collecting From Web of "Linux UDP接收缓冲区的最大大小"

看来linux在有一个限制。 我曾尝试设置rmem_max到2 ^ 32-1成功。

  root@xxx:/proc/sys/net/core# echo 2147483647 > rmem_max root@xxx:/proc/sys/net/core# cat rmem_max 2147483647 

2 ^ 32太多了:

  root@xxx:/proc/sys/net/core# echo 2147483648 > rmem_max root@xxx:/proc/sys/net/core# cat rmem_max -18446744071562067968 

设置为50亿的收益率:

  root@xxx:/proc/sys/net/core# echo 5000000000 > rmem_max root@xxx:/proc/sys/net/core# cat rmem_max 705032704 

我已经在python测试,设置和获取套接字接收缓冲区

  ss.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufferSize) print ss.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) 

如果'bufferSize'小于1024 ^ 3,则程序打印加倍'bufferSize',否则返回到256。

值705032704 * 2 = 141006540​​8接近netstat获得的1409995136。

2 ^ 32-1(2147483647,最大32位有符号整数)

 root@root@localhost:~# sysctl -w net.core.rmem_max=2147483647 net.core.rmem_max = 2147483647 root@localhost:~# sysctl -w net.core.rmem_max=2147483648 sysctl: setting key "net.core.rmem_max": Invalid argument net.core.rmem_max = 2147483648 

在尝试设置更大的值时,回到/proc文件系统似乎会溢出。