これまでの連載では、halookを使ってHadoop/HBaseの内部動作を可視化しながら、各処理がどのように動作しているのかを紹介してきました。今回から数回は少し趣向を変えて、halookを支えるプロダクトである「ENdoSnipe」について紹介します。これまでの連載でも何度となく登場したENdoSnipeですが、これまで特に説明していませんでした。そこで、これから3回にわたってENdoSnipeについて紹介します。
halookを生んだENdoSnipe
ENdoSnipeはAcroquest Technology株式会社が開発した、Javaシステムの可視化・診断ツールです。元々はプロプライエタリな製品でしたが、halookの公開と同時にオープンソース化して、業務や自宅開発など様々な用途で利用してもらえるようになりました。またENdoSnipeはAPM(アプリケーション性能監視ソフト)として使える側面もあり、数少ないオープンソースのAPMとして利用することができます。
ENdoSnipeは、以下のモジュールで構成されています。
1.Javelin
Javaクラスに測定ポイントを仕掛けて、そこから情報を収集するエージェント。
2.DataCollector
Javelinで収集した情報を蓄積するデータストア。複数のJavelinから情報を収集することができます。
3.Dashboard
収集した情報を可視化するためのWebアプリケーション。グラフや表での表示を行うほか、PerformanceDoctorによる診断などができます。
対象アプリケーションと共にJavelinを動作させることで情報を収集し、DataCollectorにいったん蓄積したうえで、その情報を後からDashboardで可視化したり、PerformanceDoctorで診断することで、アプリケーションに障害が潜んでないかを確認・診断することができます。
また、ENdoSnipeは以下の用途を想定しています。
タイミング | 用途 |
開発中の動作確認 | 問題の種になりそうなバッドプラクティスの検出のため |
パフォーマンス試験 | 性能測定や性能問題の検出のため |
トラブルシューティング | 問題解析や原因の特定のため |
実運用 | 性能監視のため
問題発生時の情報収集のため |
このように開発から運用まで幅広い開発工程で利用することを想定しています。
halookはこのENdoSnipeのプラグインとして開発しており、Javelinを拡張してHadoopの情報を取得できるようにしたり、DashboardにHadoop用のビューを追加することで、Hadoopを解析できるようにしています。同様の手法で、他のOSSなアプリケーションやミドルウェアを解析するためのツールも構築することができるでしょう。
Javelin : ENdoSnipeのコア機能
では、どのようにしてENdoSnipeはJavaの内部情報を取得しているのでしょうか。Java内部の情報を取得する方法としては、たとえばスレッドダンプやヒープダンプがあります。これらを取得すれば、Java内部で動いている全てのスレッドの情報やヒープメモリの状況は分かりますが、情報として十分ではありません。たとえば引数や戻り値、途中で呼び出したユーティリティクラスのメソッドなどは取得できないでしょう。
ENdoSnipeではJava内部の詳しい情報を取得するために、BCI(Bytecode Instrumentation)を利用して、ソースコードを一切書き換えることなく、Javaクラスの書き換えを行っています。このクラス書き換えと、情報の取得を行うプロダクトがJavelin(JAVa Extensible Logging INfrastructure)です。Javelinは解析対象のアプリケーションに対するエージェント(javaagent)として振る舞い、動的にJavaクラスを書き換えることで、解析に必要な情報の取得を行っています。たとえばArrayListクラスのaddメソッドを書き換えて、メソッドが呼び出された際に「add後のオブジェクト数を取得してログデータに出力する」という処理を追加することで、ArrayListのオブジェクト数を取得する、といった形です。なお、JavelinはBCIのライブラリとしてjavassistを利用しており、ソースコードに手を入れずにクラスの書き換えを行っています。
DataCollector:データの収集・中継役
Javelinで取得したJava内部の情報は、いったんDataCollectorに集約されてからDashboardで可視化されます。つまりDataCollectorはJavelinから取得した情報の収集・中継役と言えるでしょう。DataCollectorに情報を集約することで、複数のJavaプロセスから情報を収集し、まとめて可視化することができます。
Dashboard:さまざまな可視化を行う
Javelinで取得したJava内部の情報は、いったんDataCollectorに集められ、Dashboardにて様々な形で可視化されます。可視化の最もわかりやすい例は「グラフ」でしょう。
CPU使用率や、ヒープメモリの使用量など、一般的なJava用の解析ツールで取得できるような情報はもちろんのこと、Listのオブジェクト数や、ディスクI/O、ネットワークI/Oなどもグラフとして表示できます。たとえば性能試験や長時間の負荷試験の際に、ENdoSnipeを使ってグラフを出力し続けることで、異常な状態になっていないかを確認できるでしょう。
さらに、ENdoSnipeはレポート機能を備えているためグラフを一括してファイル出力することができます。特に性能試験の試験成績書や、実運用時の定期レポートなどを作成することを考慮しています。
また、現在商用製品からオープンソースに移行中の可視化ツールとして、取得した情報から「クラス図」を作成する「BottleneckEye」や、「シーケンス図」を作成する「ArrowVision」というツールがあります。これらは実際のアプリケーションの動作からクラス図やシーケンス図を生成するため、たとえば仕様書などがないプロジェクトや、仕様書が十分にメンテナンスされていないプロジェクトであっても、BottleneckEyeやArrowVisionを使うことで、アプリケーションの動作概要を一目で掴むことができます。さらに、障害の発生時には、クラス図やシーケンス図上に発生した障害もプロットされるため、どこで問題が起きたかも一目で掴むことができます。
ENdoSnipeはこうしてJava内部の情報を積極的に可視化することで、問題を「一目で見つける」ことを目指しています。
PerformanceDoctor:ただ見せるだけでなく、診断する
ここまでENdoSnipeの仕組みや可視化について紹介してきましたが、これらの機能について、さほど珍しくはないと感じた方もいるかも知れません。実際に、VisualVMのような解析ツールやプロファイラやNew RelicのようなAPMソフトを利用することで、同じような解析は可能です。しかしながら、ENdoSnipeには他のツールにはない大きな特徴的な機能があります。それがPerformanceDoctorによる「診断機能」です。
たとえば「ArrayListに格納されている要素の数」を解析するとしましょう。ヒープメモリのプロファイラを利用すれば、オブジェクト数を取得する事はできますし、継続的にオブジェクト数を取得することで、その推移も把握できるかも知れません。しかしENdoSnipeは、そうやって取得した情報を元に「診断」を行います。具体的に言えば、もしArrayListに格納されている要素の数が時間とともに増えていれば、「メモリリークの疑いがある」と診断するのです。このように、収集した大量の情報を利用した診断機能こそが、ENdoSnipeの大きな特徴です。
診断の例として、以下のようなものがあります。
- (1)複数のスレッドから同時にHashMapにアクセスしている(無限ループやデータ破損が起きる可能性がある)
- (2)ファイルI/Oや、ネットワークI/Oが過剰に大きい(無駄な処理が発生している可能性がある)
- (3)ライブラリの使い方を誤っており、何度も余計な初期化を行っている(性能が伸びない可能性がある)
- (4)一連の処理で、同じSQLを何度も発行している(データ量の増加に伴い、性能劣化の可能性がある)
- (5)SQLのフルスキャンが発生している(データ量の増加に伴い、性能劣化の可能性がある)
いずれも、単体試験や結合試験を行うだけでは検出しにくい問題ばかりです。もちろん、実際には問題にならないものを検出する(false-positive)可能性はありますが、あくまでも健康診断や人間ドッグのような、初期診断としてENdoSnipeを利用することで、問題を早期に発見できることができるのです。
また、このPerformanceDoctorの実装にあたっては、実際にトラブルシューティング経験のあるエンジニアが、自分のノウハウをソースコード化することで診断ルールを作成しています。やや大袈裟に言えば、PerformanceDoctorを使うことで、あたかも経験を積んだトラブルシューターが傍らにいるかのように、問題を検出できるのです。
今回は、halookを支えるプロダクトであるENdoSnipeの概要を紹介しました。冒頭にも書いた通り、ENdoSnipeはオープンソース化されており、すぐにダウンロードして利用することができます(注)
次回は実際にセットアップを行い、動作させるまでの手順を紹介します。
注:ENdoSnipeバージョン5.0は現在開発中のため、一部の機能に制限があります。利用に際してはご注意ください。