Wac*_*iec 11 sockets linux buffer udp network-programming
Linux UDP接收缓冲区的最大大小是多少?我认为它仅限于可用的RAM,但是当我设置时
rmem_max为5GB:
echo 5000000000 > /proc/sys/net/core/rmem_max
Run Code Online (Sandbox Code Playgroud)
和4GB的实际套接字缓冲区(在Erlang中):
gen_udp:listen(Port, [{recbuf, 4000000000}])
Run Code Online (Sandbox Code Playgroud)
当我测量缓冲区利用率时,它显示:
# netstat -u6anp | grep 5050
udp6 1409995136 0 :::5050 :::* 13483/beam.smp
Run Code Online (Sandbox Code Playgroud)
我不能超过这个1.4GB.对于较小的缓冲区大小,例如500MB,实际缓冲区大小与配置的值匹配.我的系统是Debian 6.0,机器有50GB RAM可用.
Lec*_*iak 10
似乎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
Run Code Online (Sandbox Code Playgroud)
2 ^ 32太多了:
root@xxx:/proc/sys/net/core# echo 2147483648 > rmem_max
root@xxx:/proc/sys/net/core# cat rmem_max
-18446744071562067968
Run Code Online (Sandbox Code Playgroud)
设置为5000000000:
root@xxx:/proc/sys/net/core# echo 5000000000 > rmem_max
root@xxx:/proc/sys/net/core# cat rmem_max
705032704
Run Code Online (Sandbox Code Playgroud)
我在python中测试过设置和获取套接字接收缓冲区
ss.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufferSize)
print ss.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)
Run Code Online (Sandbox Code Playgroud)
如果'bufferSize'少于1024 ^ 3程序打印加倍'bufferSize',否则它回落到256.
值705032704*2 = 1410065408接近netstat获得的1409995136.
| 归档时间: |
|
| 查看次数: |
37663 次 |
| 最近记录: |