Jaki parametr jądra lub inne ustawienia kontrolują maksymalną liczbę gniazd TCP, które można otworzyć na serwerze z systemem Linux? Jakie są wady udostępniania większej liczby połączeń?
Zauważyłem podczas testowania obciążenia serwera Apache za pomocą ab , że dość łatwo jest zmaksymalizować otwarte połączenia na serwerze. Jeśli zrezygnujesz z opcji -k ab, która pozwala na ponowne użycie połączenia i sprawi, że wyśle ona więcej niż około 10 000 żądań, wtedy Apache obsłuży około 11 000 żądań, a następnie zatrzyma się na 60 sekund. Spojrzenie na dane wyjściowe netstat pokazuje 11 000 połączeń w stanie TIME_WAIT. Najwyraźniej jest to normalne. Połączenia są utrzymywane otwarte domyślnie przez 60 sekund, nawet po zakończeniu pracy z klientem ze względu na niezawodność TCP .
Wygląda na to, że byłby to łatwy sposób na wykonanie DoS serwera i zastanawiam się, jakie są typowe ustawienia i środki ostrożności.
Oto mój wynik testu:
# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed
Oto polecenie netstat, które uruchamiam podczas testu:
# netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c
11651 tcp 0 0 localhost:www TIME_WAIT -
1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab
źródło
Naprawdę chcesz zobaczyć, co system plików / proc ma do zaoferowania w tym zakresie.
Na ostatniej stronie mogą Cię zainteresować:
źródło
Nie sądzę, żeby można było to ustawić bezpośrednio. Obejmuje to kategorię strojenia TCP / IP. Aby dowiedzieć się, co możesz nastroić, spróbuj „man 7 tcp”. Sysctl ('man 8 sysctl') służy do ich ustawiania. „sysctl -a | grep tcp 'pokaże ci większość tego, co możesz dostroić, ale nie jestem pewien, czy pokaże wszystkie z nich. Ponadto, chyba że się to zmieni, otwarte gniazda TCP / IP wyglądają jak deskryptory plików. Więc ta i następna sekcja tego linku może być tym, czego szukasz.
źródło
Spróbuj ustawić następujące ustawienia, a także ustawienie tcp_fin_timeout. To powinno zamknąć TIME_WAIT szybciej.
źródło
tcp_tw_recycle
to potencjalnie niebezpieczne.tcp_tw_reuse
jest bezpieczniejszy i nie widzę powodu, aby używać ich jednocześnie.Apache zapasowy (1) był predefiniowany do obsługi tylko 250 równoczesnych połączeń - jeśli chcesz więcej, możesz zmodyfikować jeden plik nagłówka, aby zezwolić na więcej równoczesnych sesji. Nie wiem, czy nadal tak jest w przypadku Apache 2.
Ponadto należy dodać opcję zezwalającą na ładowanie większej liczby otwartych deskryptorów plików dla konta, na którym działa Apache - czego nie zauważają poprzednie komentarze.
Zwróć uwagę na ustawienia pracownika i jakie limity czasu podtrzymywania masz w samym Apache, ile zapasowych serwerów masz uruchomionych jednocześnie i jak szybko te dodatkowe procesy giną.
źródło
Możesz skrócić czas spędzony w stanie TIME_WAIT (Ustaw net.ipv4.tcp_fin_timeout). Możesz zastąpić Apache YAWS lub nginx lub czymś podobnym.
Kompromisy związane z większą liczbą połączeń zazwyczaj wiążą się z użyciem pamięci, a jeśli masz proces rozwidlania, wiele procesów potomnych, które zalewają procesor.
źródło
Bezwzględna liczba gniazd, które można otworzyć na jednym adresie IP, wynosi 2 ^ 16 i jest zdefiniowana przez TCP / UDP, a nie jądro.
źródło
Narzędzie do testowania wydajności serwera HTTP Apache, ab , w wersji 2.4 ma opcję -s timeout . Zobacz także błąd ab (Apache Bench): apr_poll: Upłynął określony limit czasu (70007) w systemie Windows .
Ta opcja rozwiązuje problem.
źródło