2013-05-09 21 views
9

Jaki jest maksymalny rozmiar bufora odbioru UDP dla systemu Linux? Myślałem, że to jest ograniczona tylko przez dostępną pamięć RAM, ale kiedy ustawićLinux UDP maksymalny rozmiar bufora odbiorczego

5GB za rmem_max:

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

i 4 GB dla rzeczywistego bufora gniazda (w Erlang):

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

Kiedy mierzę wykorzystanie bufor wykazuje:

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

nie może przekroczyć 1.4GB. Dla mniejszych rozmiarów buforów, np. 500 MB, rzeczywisty rozmiar bufora pasuje do skonfigurowanej wartości. Mój system to Debian 6.0, urządzenie ma 50 GB dostępnej pamięci RAM.

+1

Gdzie jest napisane, że jest ograniczona tylko dostępną pamięcią RAM? I dlaczego myślisz, że potrzebujesz bufora 4 GB? – EJP

+0

Nie ma. Nie twierdzi, że jest ograniczona w jakikolwiek inny sposób. Potrzebuję takiego bufora, aby uniknąć utraty danych podczas dłuższego podglądu ruchu sieciowego. –

+1

Wręcz przeciwnie. Mówi, że jądro może dostosować wartość, którą podajesz w górę lub w dół, i radzi ci wywołać 'getsockopt()', aby zobaczyć, jaka wartość została faktycznie przydzielona. Trudno mi uwierzyć, że potrzebujesz 4 GB do obsługi szczytów ruchu. Prawdopodobnie powinieneś po prostu czytać szybciej. – EJP

Odpowiedz

9

Wygląda na to, że istnieje limit w Linuksie. Próbowałem ustawić rmem_max na 2^32-1 z powodzeniem.

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

2^32 jest zbyt wiele,

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

Ustawienie 5000000000 Wynik:

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

I testowano w pytona, że ​​ustawienie i uzyskanie gniazdo bufor odbiorczy z

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

Jeśli "wielkość bufora" jest mniejszy niż 1024^3 program drukuje podwójną "wielkość bufora", w przeciwnym razie powraca do 256.

Wartość 705032704 * 2 = 1410065408 jest zbliżona do wartości 1409995136 uzyskanej przez netstat.

+0

Rzeczywiście, nie weryfikuję rzeczywistej wartości umieszczanej w rmem_max. Dzięki. Wygląda na to, że rozmiar bufora jest ograniczony do podpisanego int bez wyraźnego powodu. –

0

2^32-1 (2147483647, maksimum 32-bitową liczbę całkowitą)

[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 

Nawiązując do /proc plików wydaje się przepełnić, gdy próbuje ustawić większe wartości.