初めまして、akuta です。
前回の記事から間があいてしまい息をしているの?と一部の方にご心配を
かけてしまい申し訳ありません。いろいろ事情が重なりましたが、
今後は定期的に更新していきたいと思いますのでよろしくお願いいたします。
さてそのいろいろな事情の1つとして、サービスを行なっていく上で
避けて通れない障害があります。今回はその障害の切り分け方法について
書いておきたいと思います。
障害 の切り分け方法はいくつかあると思いますが、プログミングに強くない
私はパケットによる調査をよく使います。
具体的には、先日発生した開発中の外部サービスとの連携に関する障害を使って
説明します。
この連携では外部にhttpで要求を投げて、そのレスポンスを受け取るという
非常に単純なものですが、何故か不特定に失敗する障害が発生しました。
他のサーバでテストしてみると正常に動作するため、プログラムの問題というより
サーバ固有の問題ということで、ひとまずパケットを見てみることにしました。
まずはtcpdumpでhttp要求を取得して、Wiresharkで見てみます。
tcpdump -i eth0 -s 4096 -w hoge.log
キャプチャーしつつ、連携コマンドを流しエラーが発生するの待ちます。
待つこと数分でエラーが発生したので、しばらく放置してからキャプチャー終了。
そしてwiresharkで確認。キャプチャーが大きくなりすぎると、パソコンの負荷が
高くなってしまいますが、そこはガマンして一つ一つ見ていきます。
しかしエラー発生時のパケットは正常なものばかり、、、、というか
エラー時にはhttpリクエストすら発行されていない。アプリのバグかよ~という
思いもよぎりましたが、ここは冷静になってhttp以外のパケットも全部とって
みることにしました。
tcpdumpで待ち構えて、コマンド流し続けて待つこと数分。
エラーが発生したので、様子を見てからキャプチャー終了。
気が重くなるようなログサイズのキャプチャーファイルをwiresharkで
開き、エラー発生時間のパケットを丹念に見ていくと、どうもDNSへの
要求が正常に返せていないのでは?と気づきました。
そして再度DNSのパケットだけ取得して数分待ち、再びwireshark。

それまで query => response , query => response と要求を返していた
DNSが突如 responceを返さなくなります。
なんだよDNSかよ~と結論づけようとしましたが、他のサーバも同じDNSを
使っており問題は発生していないので、DNS自体に問題はないと思い、
続いてネットワークボード関連を疑うことに。DNSはhttpとは異なるNWボードを
使っていたので、pingフラッドで状況確認。
# ping -f xxx.xxx.xxx.xxx
PING xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) 56(84) bytes of data.
--- xxx.xxx.xxx.xxx ping statistics ---
2991 packets transmitted, 2991 received, 0% packet loss, time 34874ms
rtt min/avg/max/mdev = 0.126/32.247/717.828/119.466 ms, pipe 60, ipg/ewma
11.663/92.585 ms
近くのサーバに対して実行してみた結果ですが、packet lossはしていないものの、
avrgやmax値が明らかに大きすぎる値となりました。通常avrg : 0.24程度。
ということで、ネットワークボードと対向のスイッチポート、LANケーブルを
別途調査することにして調査はひとまず終了。
「かわいい女のコだと思った?残念さやかちゃんでした!」という名言が示唆するように、
アプリ障害だと思った?残念NW障害でした!という事例もあるので、
原因を決め付けず、パケットも見ておいたほうがよいですねというお話でした。