質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

2回答

5393閲覧

稀にサーバが応答しない!何を調査すればよいか

退会済みユーザー

退会済みユーザー

総合スコア0

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

1グッド

1クリップ

投稿2016/09/02 20:04

あるサービスでまれにサーバが応答せずタイムアウトとなるケースがあります。
どのような調査を行えばよいか、アドバイスをお願いいたします。

サーバ構成

バランサー

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
htsign👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

発生した時間帯について各サーバのログを確認しているでしょうか?nginxなどのアプリケーションのログだけでは無く、syslogなどのシステムログについても、単にエラーや警告があるかを調べるのでは無く、現象が発生した時間帯にだけ現れているメッセージが無いかを確認してみて下さい。ログファイルだけで無く、dmesgも確認しておくことがお勧めです。

調査された内容から、ロードバランサーが犯人の可能性が高いですが、一応切り分けをした方が良いでしょう。切り分けの手段としては、ロードバランサーを使わず、直接Webサーバー等にアクセスできるかです(構成上、無理というのもあるかも知れませんが)。もし、アクセスできるのであれば、犯人はロードバランサーであると確定できると思います。

確認を忘れてはいけないことにスイッチなどネットワーク機器があります。ループ検出等でポートが一時的に閉じていたという可能性もあり得ます。経路にあるスイッチのログも全て確認して下さい。

他、詳しい構成と状況がわかれば、何かわかるかも知れません。現象もどれぐらいの頻度か、復旧は自然復旧なのか、何か再起動が必要だったのか、自然復旧でもどれぐらいの時間で戻ったのか、そういった情報もあるといいでしょう。ロードバランサーも1台なのか冗長構成なのか、冗長構成の場合は何を使っているのか、などです。

投稿2016/09/02 20:50

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

バックエンドの APサーバ側の同時接続数はいくつになっていますでしょうか。
APサーバ側の同時接続数に達すると、LVS/keepalived のヘルスチェックに失敗し、振り分け先からはずれると思います。
障害発生時、ipvsadm -Ln で振り分け先から消えていないか (inhibit_on_failure の場合は Weight が 0 になっていないか)、syslog (/var/log/messages など)に Keepalived_healthcheckers のログが出ていないか、確認ください。

可能であれば、keepalived.conf や障害発生時の ipvsadm -Ln, ipvsadm -Ln -c, ipvsadm -Ln --thresholds, ipvsadm -Ln --persistent-conn などを提示していただけると、何か推測できるかもしれません。

OS のネットワークリソースを疑うのであれば、鉄板ロードバランサー LVS を10分で構築するCHEFクックブック の net.nf_conntrack_max や、net.ipv4.tcp_fin_timeout, net.ipv4.tcp_tw_recycle, net.ipv4.tcp_tw_reuse などを調整するといいと思います。

(参考) persistence について

inhibit_on_failure の場合、Weight が 0 でも persistence が効きますので、persistence_timeout 以内のアクセスは他の APサーバには振り分けられません。
また、persistence_timeout の設定に合わせて、ipvsadm --set tcp tcpfin udp の tcpfin (default 120s) を persistence_timeout より短くした方がいいです。
例えば、persistence_timeout = 60 ならば、ipvsadm --set 0 59 0 などと。

投稿2016/09/03 09:27

TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問