質問
SLBは複数のバックエンドサーバーに負荷を分散します。 クライアントページビューが0の場合、TIME_WAITステータスに大きな接続があることがわかります。 バックエンドサーバーにログインし、次のコマンドを実行して、TIME_WAITステータスで接続数が多すぎることを確認します。
while true;do netstat -n | awk '/^ tcp/ {++ S[$NF]} END {for(a in S) print a,S[a]}';sleep 1;done | grep TIME_WAIT
次のコマンド出力が返されます。
TIME_WAIT 424
TIME_WAIT 430
TIME_WAIT 437
TIME_WAIT 447
TIME_WAIT 455
TIME_WAIT 464
TIME_WAIT 473
TIME_WAIT 481
TIME_WAIT 490
TIME_WAIT 498
TIME_WAIT 506
TIME_WAIT 513
回答
この場合、問題を解決するには2つの方法があります。
説明
注: この問題は通常、SLBのレイヤー7 (HTTP) 転送モードで発生します。 SLBがHTTPリクエストを転送する場合、リクエストはアプリケーション層プロトコルで行われます。 したがって、Webアプリケーションのタイムアウト時間を変更しても、システムの頻度やnet.ipv4.tcp_keepalive_timeなどのSLBヘルスチェックパラメーターがあっても、TIME_WAITステータスの接続数の減少に大きな影響はありません。
-
- SLBレイヤー4 (TCP) 転送モードの使用を推奨します。 詳細については、「TCPリスナーの追加」をご参照ください。 各ヘルスチェックのこのパターンでは、SLBはデータパケットのRST状態を送信して、サーバーヘルスチェックで確立されたTCP接続から切断するため、SLBヘルスチェック接続からは表示されません。
- TCP転送モードの変更に加えて、HTTP転送モードでヘルスチェック機能を無効にして、TIME_WAITステータスの接続数を減らすこともできます。 ただし、ヘルスチェックを無効にすると、バックエンドサーバーの例外を監視できなくなります。 SLBが異常状態のバックエンドサーバーにリクエストを転送した場合、異常状態のバックエンドサーバーは監視できません。 ヘルスチェックを無効にする方法の詳細については、「ヘルスチェックの無効化」をご参照ください。
適用範囲
- SLB