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利用可能です。
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プログラムは2倍の 'bufferSize'を出力し、それ以外の場合は256にフォールバックします。
値705032704 * 2 = 1410065408は、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
ファイルシステムへのエコーがオーバーフローするように見えます。