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 .