Czy zwiększenie net.core.somaxconn zrobi różnicę?

27

Wdałem się w argument dotyczący parametru net.core.somaxconn: Powiedziano mi, że nie zmieni to domyślnej wartości 128.

Wierzyłem, że to może być wystarczający dowód:

„Jeśli argument zaległości jest większy niż wartość w / proc / sys / net / core / somaxconn, to po cichu jest obcinany do tej wartości” http://linux.die.net/man/2/listen

ale nie jest.

Czy ktoś zna sposób na potwierdzenie tego na dwóch komputerach, siedzących w sieci Gbit? Najlepiej byłoby przeciwko MySQL, LVS, apache2 (2.2), memcached.

petermolnar
źródło

Odpowiedzi:

43

Ustawienie net.core.somaxconnwyższych wartości jest potrzebne tylko na serwerach o wysokim obciążeniu, gdzie nowa szybkość połączenia jest tak wysoka / wysoka, że ​​posiadanie 128 (50% więcej w BSD: 128 backlog+ 64 half-open) połączeń jeszcze nieakceptowanych jest uważane za normalne. Lub gdy musisz przekazać definicję „normalny” samej aplikacji.

Niektórzy administratorzy używają wysokiego poziomu, net.core.somaxconnaby ukryć problemy ze swoimi usługami, więc z punktu widzenia użytkownika proces będzie wyglądał jak skok opóźnienia zamiast przerwania połączenia / przekroczenia limitu czasu (kontrolowany przez net.ipv4.tcp_abort_on_overflowLinuksa).

listen(2)instrukcja mówi - net.core.somaxconndziała tylko górna granica dla aplikacji, która może swobodnie wybierać coś mniejszego (zwykle ustawionego w konfiguracji aplikacji). Chociaż niektóre aplikacje po prostu używają, listen(fd, -1)co oznacza ustawienie zaległości na maksymalną wartość dozwoloną przez system.

Prawdziwą przyczyną jest albo niska szybkość przetwarzania (np. Serwer z jednym wątkiem blokującym), albo niewystarczająca liczba wątków / procesów roboczych (np. Oprogramowanie do wieloprocesowego / blokowania wątków, takie jak apache/ tomcat)

PS. Czasami lepiej jest szybko zawieść i pozwolić modułowi równoważenia obciążenia wykonać jego zadanie (ponów próbę) niż zmuszać użytkownika do czekania - w tym celu ustawiamy net.core.somaxconndowolną wartość i ograniczamy zaległości aplikacji np. 10I ustawiamy net.ipv4.tcp_abort_on_overflowna 1.

PPS. Stare wersje jądra Linuksa mają nieprzyjemny błąd polegający na obcięciu somaxconwartości do 16 mniejszych bitów (tj. Rzutowaniu wartości na uint16_t), więc podniesienie tej wartości do więcej niż 65535może być nawet niebezpieczne. Aby uzyskać więcej informacji, zobacz: http://patchwork.ozlabs.org/patch/255460/

Jeśli chcesz dowiedzieć się więcej o wszystkich wewnętrznych zaległościach w Linuksie, przeczytaj: Jak działa zaległość TCP w Linuksie .

SaveTheRbtz
źródło
1
Warto również zauważyć: od Linuksa 5.4 zwiększono go do 4096 .
Cześć Anioł