Programuję serwer i wygląda na to, że moja liczba połączeń jest ograniczona, ponieważ moja przepustowość nie jest nasycona, nawet jeśli ustawiłem liczbę połączeń na „nieograniczoną”.
Jak mogę zwiększyć lub wyeliminować maksymalną liczbę połączeń, które może jednocześnie otwierać mój system Ubuntu Linux? Czy system operacyjny to ogranicza, czy jest to router lub dostawca usług internetowych? A może to coś innego?
linux
networking
linux-kernel
red0ct
źródło
źródło
Odpowiedzi:
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 zmniejsz
tcp_fin_timeout
Aby znaleźć wartości domyślne:
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ą wTIME_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ększeniaport_range
. Ustawienie zakresu15000 61000
jest obecnie dość powszechne. Możesz dodatkowo zwiększyć dostępność, zmniejszającfin_timeout
. Załóżmy, że robisz jedno i drugie, powinieneś zobaczyć ponad 1500 połączeń wychodzących na sekundę, łatwiej.Aby zmienić wartości :
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 toNie 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: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. Tanet.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ą.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ć.Podobnie zwiększ wartości dla
net.core.netdev_max_backlog
inet.ipv4.tcp_max_syn_backlog
. Ich wartości domyślne to odpowiednio 1000 i 1024.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.
źródło
(61000 - 32768) / 60 = 470 sockets per second
. Czy możesz to rozwinąć?Istnieje kilka zmiennych do ustawienia maksymalnej liczby połączeń. Najprawdopodobniej najpierw brakuje Ci numerów plików. Sprawdź ulimit -n. Potem są ustawienia w / proc, ale te domyślne to dziesiątki tysięcy.
Co ważniejsze, wygląda na to, że robisz coś złego. Pojedyncze połączenie TCP powinno być w stanie wykorzystać całą przepustowość między dwiema stronami; jeśli to nie jest:
ping -s 1472
...)tc
iperf
Być może źle zrozumiałem. Może robisz coś takiego jak Bittorrent, gdzie potrzebujesz wielu połączeń. Jeśli tak, musisz dowiedzieć się, ile połączeń faktycznie używasz (spróbuj
netstat
lublsof
). Jeśli liczba ta jest znaczna, możesz:ulimit -n
. Mimo to ~ 1000 połączeń (domyślnie w moim systemie) to całkiem sporo.iostat -x
?Ponadto, jeśli używasz routera NAT klasy konsumenckiej (Linksys, Netgear, DLink itp.), Strzeż się, że możesz przekroczyć jego możliwości przy tysiącach połączeń.
Mam nadzieję, że to pomoże. Naprawdę zadajesz pytanie dotyczące sieci.
źródło
Aby poprawić odpowiedź udzieloną przez derobert,
Możesz ustalić limit połączenia z systemem operacyjnym, catting nf_conntrack_max.
Na przykład: cat / proc / sys / net / netfilter / nf_conntrack_max
Możesz użyć następującego skryptu, aby policzyć liczbę połączeń TCP do danego zakresu portów TCP. Domyślnie 1-65535.
Potwierdzi to, czy maksymalny limit połączenia systemu operacyjnego jest przekroczony.
Oto skrypt.
źródło
which awk
jest twoim przyjacielem do określenia ścieżki do awk, SunOS również ma do niego link :)which
polega na tym, że program jest wPATH
takim przypadku, którego można użyćawk
zamiast podać pełną ścieżkę. (powiedziawszy, nie jestem pewien, czy rozwiązanie w skrypcie jest bliższe doskonałości, ale nie o to chodzi w skrypcie).awk
lokalizację, ale zakładam, że shell jest zawsze/bin/bash
(wskazówka pro: AIX5 / 6 domyślnie nawet nie ma basha).awk
wykrywanie jest przydatne? Osobiście po prostu założyłbym, że mam poprawkęPATH
ale rozsądną alternatywą może być/usr/bin/env awk
i/usr/bin/env bash
odpowiednio. Jeśli chodzi o to, co jest warte, błędnie wskazała lokalizację w moim systemie Linux. Nie/usr/bin/awk
ma/bin/awk
Na poziomie aplikacji programista może zrobić:
Po stronie serwera:
Sprawdź, czy moduł równoważenia obciążenia (jeśli masz), działa poprawnie.
Przekształć wolne limity czasu TCP w 503 Szybka natychmiastowa odpowiedź, jeśli moduł równoważenia obciążenia działa poprawnie, powinien wybrać działający zasób do obsłużenia, i jest lepszy niż zawieszanie się tam z nieoczekiwanymi komunikatami o błędach.
Np .: jeśli używasz serwera węzłów, możesz użyć toobusy z npm. Realizacja coś takiego:
Dlaczego 503? Oto kilka dobrych informacji na temat przeciążenia: http://ferd.ca/queues-don-t-fix-overload.html
Możemy również wykonać trochę pracy po stronie klienta:
Spróbuj grupować połączenia wsadowo, zmniejszyć ruch i łączną liczbę żądań czarno-białych klientów i serwerów.
Spróbuj zbudować pamięć podręczną warstwy pośredniej, aby obsłużyć niepotrzebne duplikaty żądań.
źródło