Quelle est la taille maximale du tampon de réception Linux UDP? Je pensais que c’était limité uniquement par la RAM disponible, mais quand j’ai mis
5 Go pour rmem_max:
echo 5000000000 > /proc/sys/net/core/rmem_max
et 4 Go pour le tampon de socket actuel (en Erlang):
gen_udp:listen(Port, [{recbuf, 4000000000}])
Lorsque je mesure l'utilisation de la mémoire tampon, cela indique:
# netstat -u6anp | grep 5050
udp6 1409995136 0 :::5050 :::* 13483/beam.smp
Je ne peux pas dépasser ce 1,4 Go. Pour des tailles de tampon plus petites, comme par ex. 500 Mo, la taille réelle de la mémoire tampon correspond à la valeur configurée. Mon système est Debian 6.0, la machine dispose de 50 Go RAM disponibles.
Il semble qu'il y ait une limite dans linux. J'ai essayé de définir rmem_max sur 2 ^ 32-1 avec succès.
root@xxx:/proc/sys/net/core# echo 2147483647 > rmem_max
root@xxx:/proc/sys/net/core# cat rmem_max
2147483647
2 ^ 32 était trop:
root@xxx:/proc/sys/net/core# echo 2147483648 > rmem_max
root@xxx:/proc/sys/net/core# cat rmem_max
-18446744071562067968
Réglage à 5000000000 rendements:
root@xxx:/proc/sys/net/core# echo 5000000000 > rmem_max
root@xxx:/proc/sys/net/core# cat rmem_max
705032704
J'ai testé en python ce paramètre et obtenir socket tampon de réception avec
ss.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufferSize)
print ss.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)
Si 'bufferSize' est inférieur à 1024 ^ 3, le programme imprime doublé 'bufferSize', sinon il retombe à 256.
La valeur 705032704 * 2 = 1410065408 est proche du 1409995136 obtenu par netstat.
2 ^ 32-1 (2147483647, entier signé maximum de 32 bits)
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
Les échos dans le système de fichiers /proc
semblent déborder lorsque vous tentez de définir des valeurs plus grandes.