Linux UDP 最大接收缓冲区大小

标签 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 可用内存。

最佳答案

好像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

关于Linux UDP 最大接收缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16460261/

相关文章:

php - 为什么等待运行时的进程数很高,但我的 CPU 却有 99% 空闲?

c - 绑定(bind)失败 : : Address family not supported by protocol family - C

java - 如果写入/关闭被对等方关闭的 java.net.Socket 会发生什么?

javascript - 我在哪里可以学习高级网络编程,特别是游戏开发方面的知识?

regex - sed - 跨多个文件删除某些字符串的部分

linux - 我应该如何在不使用 root 密码的情况下完全镜像服务器用户 rsync?

python-3.x - 如何从服务器端的字符串中使用Elementtree XML解析?

java - 套接字未接收到任何数据

linux - 在 JupyterHub 中创建的默认系统用户的密码

python - 如何在 ssl python 套接字中设置密码