(Translated by https://www.hiragana.jp/)
アプリ開発でも、よ〜く考えよう。キャッシュは大事だよ:現場から学ぶWebアプリ開発のトラブルハック(12)(1/2 ページ) - @IT

アプリ開発かいはつでも、よ〜くかんがえよう。キャッシュは大事だいじだよ現場げんばからまなぶWebアプリ開発かいはつのトラブルハック(12)(1/2 ページ)

ほん連載れんさいは、現場げんばでのエンジニアの経験けいけんからられた、APサーバをベースとしたWebアプリ開発かいはつにおける注意ちゅういてんやノウハウについて解説かいせつするハックしゅうである。現在げんざいきているトラブルの解決かいけつや、今後こんご開発かいはつ参考さんこうとしておおいに活用かつようしていただきたい。(編集へんしゅう

» 2008ねん10がつ15にち 0000ふん 公開こうかい

無駄むだ”より“おそい”ものはない

 今回こんかいもパフォーマンスにまつわるトラブルをハックするが、アプリケーションのパフォーマンスチューニングもっと有効ゆうこう手段しゅだんは「処理しょりおこなわない」ことである。なにもしないことにまさ高速こうそく存在そんざいしない。今回こんかいのトラブルでは、インスタンスキャッシュして、無駄むだ処理しょりおこなわないことでチューニングをおこな手法しゅほう紹介しょうかいする。

 しかしながら、往々おうおうにしてチューニングはトレードオフである。そのトレードオフがこす、さらなるトラブルを紹介しょうかいする。

コンサルティングもトラブルハッカーの仕事しごと

 とあるプロジェクトから1つうのメールがとどく。

 「あるJava作成さくせいしたリッチアプリケーションのパフォーマンスに問題もんだいかかえている。自分じぶんたちでかんがえられ対策たいさくこうじた。しかし、目標もくひょうのパフォーマンスを達成たっせいできない」とのことで、相談そうだんってほしいそうた。

 こういったケースをメールでやりとりしても“らち”がかないため、早速さっそく現場げんば急行きゅうこうする。トラブルが発生はっせいした場合ばあいなにをするべきなのか、がからないプロジェクトはおおい。そんなプロジェクトのコンサルティングをおこない、すすむべきみちしめすのもトラブルハッカーの仕事しごとである。

まさかXMLが

 早速さっそく現場げんば担当たんとうしゃにヒアリングをおこなう。今回こんかいパフォーマンスがていないシステムはJavaリッチアプリケーションであり、サーバとクライアントのあいだ通信つうしんXMLおこなっている(1)。

図1 図1 システム構成 1 システム構成こうせい

 また、これまでの調査ちょうさでは、サーバがわ処理しょりはさほど速度そくどおそくはなく、クライアントがわ処理しょりがボトルネックになっているとのことであった。

 SOAP代表だいひょうされるXMLをもちいて通信つうしんおこなうシステムでは、XML操作そうさかんする以下いか処理しょりがボトルネックになりやすい。

  • XMLのパース
  • XMLとJavaオブジェクトのマッピング

 XMLのあつかいにはにがおもがあるため、さき担当たんとうしゃ確認かくにんをしたがXMLにかんしては「すでに以下いかのようなチューニングをほどこした」とつたえられた。

  • XML構造こうぞう簡略かんりゃく
  • 操作そうさ差分さぶんぶんのXMLだけを送信そうしんするように修正しゅうせい

先入観せんにゅうかん判断はんだんなまらせる

 先入観せんにゅうかんつと視野しやせまくなって、問題もんだい本質ほんしつ見失みうしなってしまう。ふたた冷静れいせいになり事態じたい整理せいりする。

  • GCの頻度ひんどはさほどたかくない
  • 通信つうしん発生はっせいする操作そうさおこなうとCPU利用りようりつ急上昇きゅうじょうしょうする

 以上いじょうから、ほん連載れんさいだい1かいWebアプリの問題もんだいてんを「える」する7つ道具どうぐ」のトラブルけフローにもとづき、メソッドプロファイラの導入どうにゅう決定けっていして、処理しょり時間じかんがかかっているメソッドを特定とくていすることにした。

プロファイラは、なんでもお見通みとお

 早速さっそく、フローの手順てじゅん3「メソッドプロファイリング」にもとづき、あるメソッドプロファイラをアプリケーションにアタッチして、どのメソッドがボトルネックなのかを確認かくにんした。

 また、結果けっか平均へいきんするため通信つうしんおこな操作そうさを10かいかえしたときの結果けっかをプロファイリングした。プロファイリングの結果けっか2のとおりである。

図2 プロファイリングの結果(一部を再現したものです) 2 プロファイリングの結果けっか一部いちぶ再現さいげんしたものです)画像がぞうをクリックすると拡大かくだいします)

 一見いっけんすると、普通ふつうのプロファイリング結果けっかであるが、よくてみるとおおきな問題もんだいく。

 そう、「getInitBillingProps」メソッドの回数かいすう実行じっこう回数かいすうの10かい一致いっちしているのだ(2あかわく参照さんしょう)。

 名前なまえから推測すいそくするにアプリケーション初期しょきのためにプロパティファイルのロードをおこない、プロパティのをインスタンスしているようである。メソッドの名前なまえどおりの動作どうさおこなっているとすれば、アプリケーションの通信つうしん操作そうさを10かいかえしたからといって、「getInitBillingProps」メソッドが10かい実行じっこうされるのはあきらかにおかしいはずである。

「getInitBillingProps」メソッドの挙動きょどう確認かくにん

 まずは、ソースを確認かくにんする。やはりプロパティファイルからプロパティのをオブジェクトしているだけである。ねんのため、いそがしそうにしている担当たんとうしゃつかまえて、メソッドの仕様しよう確認かくにんをした。やはり「getInitBillingProps」メソッドはアプリケーションの初期しょきのためにプロパティのをインスタンスするためのメソッドらしい。

図3 通信時の挙動 3 通信つうしん挙動きょどう

 すなわち、このアプリケーションは通信つうしんおこなうごとにプロパティファイルにアクセスしていることになる。つまるところ、完全かんぜん無駄むだ処理しょりおこなうのである。これでは、パフォーマンスがるはずもない。

 では、こういった状況じょうきょうではどのような解決かいけつさくがあるのか? 読者どくしゃみなさんもかんがえてみてほしい。ページで、その回答かいとうれい提示ていじしよう。

       1|2 つぎのページへ

Copyright © ITmedia, Inc. All Rights Reserved.

アイティメディアIDについて

メールマガジン登録とうろく

@ITのメールマガジンは、 もちろん、すべて無料むりょうです。ぜひメールマガジンをご購読こうどくください。