Pewne ograniczenia po stronie klienta i serwera mają wpływ na maksymalną liczbę połączeń, choć nieco inaczej.
Po stronie klienta:
Zwiększ zakres portów efermalnych i zmniejsztcp_fin_timeout
Aby znaleźć wartości domyślne:
sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout
Zakres portów efermalnych określa maksymalną liczbę gniazd wychodzących, które host może utworzyć z określonego adresu IP. fin_timeout
Określa minimalny czas Gniazda te pozostaną w TIME_WAIT
stanie (bezużyteczny po używaniu raz). Standardowe ustawienia systemowe to:
net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_fin_timeout = 60
Zasadniczo oznacza to, że Twój system nie może konsekwentnie gwarantować więcej niż (61000 - 32768) / 60 = 470
gniazd na sekundę. Jeśli nie jesteś z tego zadowolony, możesz zacząć od zwiększenia port_range
. Ustawienie zakresu 15000 61000
jest obecnie dość powszechne. Możesz dodatkowo zwiększyć dostępność, zmniejszając fin_timeout
. Załóżmy, że robisz jedno i drugie, powinieneś zobaczyć ponad 1500 połączeń wychodzących na sekundę, łatwiej.
Aby zmienić wartości :
sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30
Powyższego nie należy interpretować jako czynników wpływających na zdolność systemu do wykonywania połączeń wychodzących na sekundę. Ale raczej te czynniki wpływają na zdolność systemu do obsługi równoczesnych połączeń w zrównoważony sposób przez duże okresy „aktywności”.
Domyślne wartości Sysctl w typowym systemie Linux dla tcp_tw_recycle
& tcp_tw_reuse
by to
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0
Nie pozwalają one na połączenie z „używanego” gniazda (w stanie oczekiwania) i zmuszają gniazda do zakończenia pełnego time_wait
cyklu. Polecam ustawienie:
sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1
Umożliwia to szybkie przełączanie gniazd w time_wait
stan i ponowne ich użycie. Ale zanim to zrobisz, upewnij się, że nie powoduje to konfliktu z protokołami, których używałbyś dla aplikacji, która potrzebuje tych gniazd. Przeczytaj post „Radzenie sobie z czasem oczekiwania TCP” autorstwa Vincenta Bernata, aby zrozumieć konsekwencje. Ta net.ipv4.tcp_tw_recycle
opcja jest dość problematyczna dla serwerów publicznych, ponieważ nie obsługuje połączeń z dwóch różnych komputerów za tym samym urządzeniem NAT , co jest problemem trudnym do wykrycia i czekającym na ugryzienie. Uwaga, net.ipv4.tcp_tw_recycle
która została usunięta z systemu Linux 4.12.
Na serwerze Side:net.core.somaxconn
wartość odgrywa ważną rolę. Ogranicza maksymalną liczbę żądań w kolejce do gniazda nasłuchującego. Jeśli jesteś pewien możliwości aplikacji serwera, zwiększ ją z domyślnego 128 do czegoś takiego jak 128 do 1024. Teraz możesz skorzystać z tego wzrostu, modyfikując zmienną backlog nasłuchiwania w wywołaniu nasłuchiwania aplikacji, na równą lub wyższą liczbę całkowitą.
sysctl net.core.somaxconn=1024
txqueuelen
rolę mają również parametry kart Ethernet. Domyślne wartości to 1000, więc zwiększ je do 5000, a nawet więcej, jeśli twój system może to obsłużyć.
ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local
Podobnie zwiększ wartości dla net.core.netdev_max_backlog
i net.ipv4.tcp_max_syn_backlog
. Ich wartości domyślne to odpowiednio 1000 i 1024.
sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048
Teraz pamiętaj, aby uruchomić aplikacje po stronie klienta i serwera, zwiększając ulimty FD w powłoce.
Oprócz powyższej jeszcze jedną popularniejszą techniką stosowaną przez programistów jest zmniejszenie liczby wywołań pisania TCP . Moje własne preferencje to użycie bufora, w którym przesyłam dane, które chcę wysłać do klienta, a następnie w odpowiednich punktach zapisuję buforowane dane do właściwego gniazda. Ta technika pozwala mi korzystać z dużych pakietów danych, zmniejszać fragmentację, zmniejszać wykorzystanie procesora zarówno na poziomie użytkownika, jak i na poziomie jądra.