Linuxサーバーで開くことができるTCPソケットの最大数を制御するカーネルパラメーターまたはその他の設定は何ですか?より多くの接続を許可することのトレードオフは何ですか?
apを使用してApacheサーバーを負荷テストしているときに、サーバーで開いている接続を最大限に簡単に拡張できることに気付きました。接続の再利用を許可するabの-kオプションを省略し、約10,000件を超えるリクエストを送信すると、Apacheは最初の11,000件程度のリクエストを処理し、60秒間停止します。netstatの出力を見ると、TIME_WAIT状態の11,000の接続が示されています。どうやら、これは正常です。TCP信頼性の理由でクライアントが接続を行った後でも、接続はデフォルトの60秒で開いたままになります。
これはサーバーをDoSする簡単な方法のように思えますが、そのための通常の調整と予防策は何だろうと思っています。
テスト結果は次のとおりです。
# 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
テスト中に実行したnetstatコマンドは次のとおりです。
# 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