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

时间:2013-05-09 11:04:14

标签: linux sockets network-programming udp buffer

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。

2 个答案:

答案 0 :(得分:9)

似乎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

设置为5000000000:

   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。

答案 1 :(得分:0)

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

 delete head;

尝试设置更大的值时,回显到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 文件系统似乎会溢出。