Ustawienie net.core.somaxconn
wyż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.somaxconn
aby 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_overflow
Linuksa).
listen(2)
instrukcja mówi - net.core.somaxconn
dział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.somaxconn
dowolną wartość i ograniczamy zaległości aplikacji np. 10
I ustawiamy net.ipv4.tcp_abort_on_overflow
na 1.
PPS. Stare wersje jądra Linuksa mają nieprzyjemny błąd polegający na obcięciu somaxcon
wartości do 16 mniejszych bitów (tj. Rzutowaniu wartości na uint16_t
), więc podniesienie tej wartości do więcej niż 65535
moż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 .