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