先週、不可解な現象に遭遇した。大阪の話なので、すべて電話越しの情報だが、まとめると以下の感じになる。
本番機では異常に遅い、というか速度にムラがある。あるページを開くのに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連休がなくなるな・・。


