web-dev-qa-db-ja.com

Linux UDP受信バッファーの最大サイズ

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利用可能です。

11

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 = 141006540​​8は、netstatによって取得された1409995136に近い値です。

10
Lech Głowiak

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ファイルシステムへのエコーがオーバーフローするように見えます。

0
Ivan Hamilton