あるサービスでまれにサーバが応答せずタイムアウトとなるケースがあります。
どのような調査を行えばよいか、アドバイスをお願いいたします。
サーバ構成
バランサー
KeepAlive+LVS(ipvs) DSR方式
バランサー配下
Web/APサーバを数台配置
- 静的コンテンツはnginxで80ポート
- 動的コンテンツはTomcatで8080ポート
症状
クライアント
クライアントのSYNは要求を出していますが、サーバがこれに応答していないようです。
7回SYNを出した後、タイムアウトが発生。
サーバ
各サーバ上で、tcpdumpを出力。
リクエスト元IP(src)で絞り込みを行っている。
通信可能な場合はパケットが流れてきていますが、接続できない場合はtcpdumpに何も出力されません。
障害発生タイミング
Keep-Aliveが有効で、コネクションが残っている間は同じAPサーバにアクセスします。
クライアントからFを出して通信をクローズし、次回新たな接続を行う際にSYNを出してもサーバが応答しないという状態に陥ることがあります。
バランサのIPにpingを打ってみましたが、pingは通ってもSYNには応答しないという挙動も見られました。
「バランサが応答していないため、配下のAPサーバにもリクエストが流れない」のかと考えております。
ipvsのハッシュテーブルは 2500/4096程度でした。
また、ipvsadm -L
した場合、おおよそ以下のような数値が見られました。
- ActiveConn 150/1サーバ
- InActConn 200/1サーバ
Web/APサーバは4台あります。
1サーバで80/8080ポートを受け付けているので、上記だと350くらいのActiveConnがあります。
ポートの不足かと思い、net.ipv4.ip_local_port_range
を変更してみましたが、あまり効果はないようでした。
net.ipv4.ip_local_port_range = 32768 65000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。