Javaアプリケーションのプロファイリングについて考え始めると、多数のツールが思い浮かぶだろう。しかし、プロファイリングがロギングステートメントの追加と同じくらい容易になると考えたことは? これがPerf4jプロジェクトの目標である。
Perf4JのSystem.currentTimeMillis()に対する関係は、log4jのSystem.out.println()に対する関係と同じである
この目標を念頭に置いて、Perf4Jは、次のような印象的な機能リストを提供している。
- 簡潔なタイミングステートメント用のシンプルなストップウォッチメカニズム。
- 集約統計とパフォーマンスグラフを生成するログファイルを解析するためのコマンドラインツール。
- 非常に一般的なロギングフレームワークおよびファサード(log4j、java.util.logging、Apache Commons LoggingおよびSLF4J)との容易な統合。
- 動作中のアプリケーションで統計とグラフを生成するカスタムlog4jアペンダ(カスタムjava.util.loggingハンドラは近日公開)
- パフォーマンス統計をJMX属性として公開する機能と、統計が指定のしきい値を超えると通知を送信する機能。
- Webアプリケーションでパフォーマンスグラフを公開するサーブレット。
- AspectJやSpring AOPなどのAOPフレームワークと組み合わせるとunobstrusiveな(慎ましい)時間計測ステートメントを可能にする、@Profiledアノテーションおよび一連のカスタムアスペクト。
- 拡張可能なアーキテクチャ。
InfoQはPerf4jプロジェクトのプロジェクトリーダーであるAlex Devine氏と話をした。Devine氏はPerf4jがどのように実現したかを説明してくれた。
パフォーマンス追跡と管理の問題が弊社のほとんどすべてのプロジェクト(本当に、ほぼすべてのサーバーベースの分散アプリケーション)に影響すると分かったので、標準のパフォーマンスライブラリを構築して製品化することに決めました。それが結果として、Perf4Jになりました。
「Perf4jによって解決できる、特に扱いにくいパフォーマンスの問題はありますか?」
Perf4Jは特に、広く分散されたサービス指向アプリケーションにおけるパフォーマンスの問題を見つけ出すのに適しています。たとえば、Homeawayでは、検索ページの1つでの単一ヒットはフロントエンドWebサーバーへの呼び出しにつながります。これは、HTTP上での検索サービスと広告サーバーの呼び出しに加え、データベース呼び出しを生成します。そして、検索サービス自体は複数の検索ノードから得られる検索結果を集約します。パフォーマンスが実稼働環境で低下する場合、Perf4jを使用すると問題があるコンポーネントを迅速に特定することが非常に容易になります。
これは、「can Perf4jは実稼働環境で使用できるのか?」という次の質問につながる。
Perf4Jは間違いなく、実稼働環境で使用できるように設計されています。実際、しばしばすべてがステージング環境でのみ素晴らしく、実稼働環境で惨めに失敗しているように思います。大きなパフォーマンスヒットの前にモニタリングを実施することは、問題を見つけ出すためにも不可欠であることがしばしばです。
パフォーマンスオーバーヘッドについて、Devine氏は次のように付け加えた。
StopWatchの開始と停止は本質的に、時間計測してログ出力するためコードの前後にSystem.currentTimeMillis()を呼び出す場合に実施することと同じことに分類されるため、オーバーヘッドはロギングと同様です。したがって、ロギングと同様に、オーバーヘッドは結局、設定したアペンダによって決まります。AsyncCoalescingStatisticsAppenderの設計は、単に個々のスレッドでダウンストリームアペンダによって処理されるキューにログメッセージを送ることであるため、結局ダウンストリームアペンダが多くの作業をすることになると、メインスレッドの実行時間に影響を与えることはないでしょう。また、load-time weaving付きの@Profiledアノテーションを使用する場合、ランタイム時にプロファイリングしたいメソッドを決定できます。この場合、プロファイリングしないメソッドのオーバーヘッドは完全にゼロです。
また、今後の展開については次のように述べている。
プロファイリングするコードにStopWatchや@Profiledアノテーションがなくても、ランタイムプロファイリングを可能にしたいと思っています。つまり、開発者がaop.xmlファイルやSpringアプリケーション構成ファイルでプロファイリングする特定のメソッドを指定できるようにしたいと思います。これにより、たとえば、Perf4Jに関する知識がまったくないサードパーティライブラリをプロファイリングすることが可能になり、ソースコードからすべてのプロファイリングステートメントが完全に排除されます。
Perf4jは、 http://perf4j.orgからダウンロード可能だ。