12

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

4

2 に答える 2

12

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 に近い値です。

于 2013-05-10T08:20:37.883 に答える
0

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より大きな値を設定しようとすると、ファイルシステムへのエコーがオーバーフローするように見えます。

于 2016-10-31T03:11:49.967 に答える