2013-05-09 14 views
9

Qual è la dimensione massima del buffer di ricezione di Linux UDP? Ho pensato che è limitato solo dalla RAM disponibile, ma quando ho impostatoDimensione massima UDP Linux del buffer di ricezione

5 GB rmem_max:

echo 5000000000 > /proc/sys/net/core/rmem_max 

e 4GB per il buffer di presa effettiva (in Erlang):

gen_udp:listen(Port, [{recbuf, 4000000000}]) 

Quando misuro l'utilizzo del buffer, mostra:

# netstat -u6anp | grep 5050 
udp6 1409995136  0 :::5050 :::*  13483/beam.smp 

Non riesco a superare questo 1,4 GB. Per dimensioni tampone più piccole, come ad es. 500 MB, la dimensione effettiva del buffer corrispondeva al valore configurato. Il mio sistema è Debian 6.0, la macchina ha 50GB di RAM disponibili.

+1

Dove dice che è limitato solo dalla RAM disponibile? E perché pensi di aver bisogno di un buffer da 4 GB? – EJP

+0

Non funziona. Non dice neanche che sia limitato in nessun altro modo. Ho bisogno di un tale buffer per evitare la perdita di dati durante la sbirciatina del traffico di rete più lungo. –

+1

Al contrario. Dice che il kernel può aggiustare il valore che fornisci up o down, e ti consiglia di chiamare 'getsockopt()' per vedere quale valore è stato effettivamente assegnato. Trovo difficile credere di aver bisogno di 4 GB per gestire i picchi del traffico. Probabilmente dovresti leggere più velocemente. – EJP

risposta

9

Sembra che ci sia un limite in linux. Ho provato a impostare rmem_max su 2^32-1 con successo.

[email protected]:/proc/sys/net/core# echo 2147483647 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    2147483647 

2^32 era troppo:

[email protected]:/proc/sys/net/core# echo 2147483648 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    -18446744071562067968 

Impostazione per 5000000000 rendimenti:

[email protected]:/proc/sys/net/core# echo 5000000000 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    705032704 

ho testato in python che impostare e ottenere presa buffer di ricezione con

ss.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufferSize) 
    print ss.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) 

Se "bufferSize" è inferiore a 1024^3 stampe di programmi duplicate "bufferSize", altrimenti torna a 256.

Il valore 705032704 * 2 = 1410065408 è vicino a 1409995136 ottenuto da netstat.

+0

In effetti, non ho verificato il valore effettivo inserito in rmem_max. Grazie. Sembra che la dimensione del buffer sia limitata a int signed senza alcun motivo esplicito. –

0

2^32-1 (2147483647, massimo 32 bit intero con segno)

[email protected]@localhost:~# sysctl -w net.core.rmem_max=2147483647 
net.core.rmem_max = 2147483647 

[email protected]:~# sysctl -w net.core.rmem_max=2147483648 
sysctl: setting key "net.core.rmem_max": Invalid argument 
net.core.rmem_max = 2147483648 

Riprendendo nella /proc file system sembra traboccare quando si tenta di impostare valori più grandi.

Problemi correlati