先週、不可解な現象に遭遇した。大阪の話なので、すべて電話越しの情報だが、まとめると以下の感じになる。

本番機では異常に遅い、というか速度にムラがある。あるページを開くのに5sくらいかかる。同じことを開発機でやると1s以内で返ってくる。
手で投げると速い。アプリ(API)から投げると遅い。
レスポンスのサイズが大きいと遅い、小さいと速い。
開発機でサイズが大きいものを作っても、遅くならない。
CPUの負荷はない。ディスクIOもほとんどない。

そもそも構成として、[ブラウザ]→[Apache→APPサーバー]→[Apache→SOAPサーバー]→[Apache→DBサーバー]となっていて、APPサーバーとSOAPサーバーが同じ筐体で、それ以外は別々となっている(3台)。

さらにややこしいのが、本番機はAPPサーバー(+SOAPサーバー)がクラスタしており、DBサーバーも別にクラスタしている。開発機はすべてAPPサーバーとDBサーバーが同じ筐体になっている。

とりあえず、APPサーバー→SOAPサーバーは、別のAPPアプリで再現した。

次に、APPアプリとDB側ApacheとDBサーバーでログを取ったら、すべてにおいて処理時間が4sくらいかかっていた。

となると、DBサーバーの問題じゃないのか?って誰でも思うわけで、とにかくあらゆることを調べたが、何も手がかりがなかった。そもそもデータを同じにしても、再現がまったくできない。

・・・

どーにもならない状態で3日が過ぎたのだが、ふと、クライアントがデータを受け取らなかったら、サーバーはデータを返せないのではないかと考えた。つまり、可能性として、サーバー側のレスポンスデータは一瞬で作れているが、クライアントが受け取らない or ネットワークが流れないときに、処理時間は長くなるのでは・・と。

すると、CPU負荷もディスクIOも説明が付く。ネットワークの要求待ちなのだから。

・・・

で、突破口となったのが、パフォーマンスモニターでネットワークのデータ送受信量を見ていたら、本番機では1度にデータを返さずに、波を打っているらしい。つまり、1MBを返すのに、300KBづつ3回の波があるみたいな感じ。開発機では1MB分を一気に返している。

というわけで、DBサーバーを切り分けるため、Apacheに数MBのファイルを置いてもらって、そのファイルをブラウザからダウンロードしてもらった。それだけで、上記の現象が再現できたので、アプリやDBが原因でない! と言ってみた。

・・・

でも、アプリとDBサーバーのログで処理時間が4sと出ていると、やはりDBサーバー側を疑ってしまうわな。Apache内で一気にバッファリングしているのならば、また話は異なるのだが。まぁDBサーバー側のApacheのソースは持っていないので、来週になってひっくり返される可能性もあるのですけど・・。あぁ、来週でなんとかならんと、GW連休がなくなるな・・。




ブックマークに追加する