Jump to content 日本-日本語

製品 >  ソフトウェア >  HP- UX Developer Edge

HPjmeter ガイド

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む

メトリクスの利用


メトリクスを使用して、メソッド実行時間の参照、メトリクスの比較、クラス実行時間やコールグラフツリーの参照、インライン化するべきメソッドの判定、スレッドの参照と解析などができます。それぞれのメトリクスについて、次で説明します。

メソッド実行時間の参照と解析


各メソッドで使用されている時間を参照することができる、便利なメトリクスです。このメトリクスを参照するには、[Metric]メニューをクリックし、[Exclusive Method Times (Clock)]を選択します。すると次のような画面が表示されます。
 
メソッド実行時間の参照と解析  画面
 
メソッドは、時間の長い順に表示されています。メソッドの左側にある数字は、各メソッドの実行中に経過した時間の合計をミリ秒単位で示したものです。横方向のバーは、その情報をグラフ表示したものです。

[Metric]メニューの[Inclusive Method Times (Clock)]オプションは、そのメソッドと、そのメソッドが呼び出したメソッドで経過した時間の合計をミリ秒単位で示したものです。数値はメソッドの左側に表示されます。

[Metric]メニューの下にある[Inclusive Method Times (CPU)]と[Exclusive Method Times (CPU)]も便利なメトリクスです。このメトリクスは、プロファイラによっては使用できないことがあります。このオプションは、そのメソッドで使用されたCPU時間を表示します。メソッド呼び出しの左側にある数字は、おおよその時間をミリ秒で示したものです。これは、概算値としてのみ参照してください。CPU時間とクロック時間を比較して、同期メソッドや同期ステートメントのためにどのメソッドで長い待ち時間が発生しているかを判定することができます。

メソッドの検索


前に[Mark to Find]を設定したメソッドが参照中のメトリクスのどこにあるかを確認したい場合は、[Binoculars With a Lightning Bolt]アイコンをクリックするか、[Edit]メニューから[Find Immediately]を選択します。または、[Edit]メニューから[Find]を選択して次のようなダイアログを表示し、パッケージ名、クラス名、メソッド名でメソッドを検索できます。これは、一つのクラスやパッケージに関連付けた複数のメソッドを参照する場合に便利な方法です。
 
メソッドの検索   画面


[Method Call Counts]ウィンドウで、nextTokenメソッドに[Mark to Find]を設定してあります。ここで[Binoculars With a Lightning Bolt]アイコンをクリックするか、[Edit]メニューから[Find Immediately]を選択します。このメソッドは、相対的に見るとそれほど多くの時間を消費していないことがわかります。そこで、多くのクロック時間を使っているメソッドを検索します。この例では、2番目のメソッドであるsocketReadが、invokeを除く他のメソッドのほぼ倍の時間を使用しています。このメソッドに[Mark to Find]を設定して、詳しく調査できるようにします。

メトリクスの比較


HPjmeterでは、複数のウィンドウを開いて簡単に比較作業をすることができます。[File]メニューから[New Window]を選択します。1つのウィンドウで[Exclusive Method Times (Clock)]を、もう一方のウィンドウで[Exclusive Method Times (CPU)]を参照します。2つの測定結果を比較するには、[Find]機能を使用します。大きな差があれば、長い待ち時間を消費しているメソッドを見つける手がかりになります。この待ち時間を減らすことができれば、パフォーマンスを改善できます。

あるメソッドを呼び出したメソッドを知りたい場合は、そのメソッドをダブルクリックします。オープンされたウィンドウには、呼び出し回数ではなくクロック時間やCPU時間が表示されます。(注意: これは包括的な測定の場合にのみ表示されます。排他的な場合は表示されません)また、疑わしいメソッドをマークして、[Call Graph Tree]で参照することもできます。チェックマーク アイコンをクリックするか、[Edit]メニューから[Mark to Find]を選択します。

クラス実行時間の参照


[Class Times]メトリクスは、クロック時間とCPU時間で利用できます。このメトリクスを参照するには、[Metric]メニューから[Exclusive Class Times (Clock)]か[Exclusive Class Times (CPU)]を選択します。すると、次のようなウィンドウが表示されます。
 
クラス実行時間の参照  画面1
 
左側の数字は、特定のクラスのすべてのメソッドで消費した時間の合計です。この時間は排他的で、そのクラス以外のメソッド呼び出し時間は含まれません。あるクラスに含まれるすべてのメソッドを参照するには、そのクラスをダブルクリックします。すると、次のようなウィンドウが表示されます。
 
クラス実行時間の参照  画面2
 
そのクラスの中で長い時間を消費しているメソッドがあれば、それを選択し[Mark to Find]をクリックします。次に[Call Graph Tree]など他のメトリクスでそのメソッドを解析し、そのメソッドで消費されている時間を減らす方法を決定します。

このメトリクスは、そのアプリケーションの1つもしくは少数のクラスで実行時間の大半を費やしていないかを発見するのに有効です。その場合、潜在的ボトルネックとなっているそのクラスのパフォーマンスの改善に重点を置くことができます。

コールグラフツリーの参照


[Call Graph Tree]は、クロック時間、CPU時間、メソッド呼び出し回数の参照で使用できます。これらは[Metric]メニューの下に表示されます。次の図は、クロック時間に基づいた[Call Graph Tree]です。
 
コールグラフツリーの参照   画面
 
これが典型的なコールツリーです。ブランチを展開するには、メソッド名の左側にある丸印をクリックします。呼び出されるメソッドは下に表示され、少し字下げされています。ブランチを折りたたむには、もう一度丸印をクリックします。ウィンドウの下部にそれぞれの色が何を示しているかが説明されています。メソッドの左側に丸印がない場合は、そのメソッドが他のメソッドを呼んでいないか、呼び出し回数がしきい値(後述)に達していないので、何も含まれていないことを示します。


様々なメソッド実行時間のメトリクスやメソッド呼び出し回数を参照していて、詳しく調査する必要のあるメソッドを見つけたとします。例えば、メソッドjava.net.SocketInputStream.socketReadを呼び出しているメソッドについて詳しく知る必要があるとします(排他的クロック時間が2番目に高いメソッドです)。前に[Mark to Find]を設定していますので、[Binoculars with a Lightning Bolt]アイコンをクリックするか、[Edit]メニューから[Find Immediately]を選択します。これによりツリーが展開され、次に示すように、参照したいメソッドが強調表示されます。
 
例  画面1
 
メソッドの一番左側にある数字は、直前のメソッドから呼び出されたときの、そのメソッドの包括的時間です。包括的というのは、そのメソッドと、そのメソッドから呼び出されたほかのメソッドで使用した時間を合計したもの、という意味です。パーセンテージは、そのメソッドが消費した時間の中で、指定された呼び出し側メソッドのために消費した時間が占める割合です。仮に、"200 (50%, 4 other callers) someClass.someMethod"と表示されている場合、200が総合計時間の50%ということなので、このメソッドでの包括的時間の合計は400となります。このメソッドを呼び出した他のメソッドの値も表示されます。このメソッドを呼び出しているほかのメソッドを検索する場合は、そのメソッドをダブルクリックします。他の呼び出しメソッドをシングルクリックし、[Find]ボタンをクリックします。その呼び出しメソッドは、ツリー内で強調表示されます。

ツリーを調べると、この問題となっているメソッドを呼び出しているメソッドを判定できます。このメソッドで消費している時間を減らすには、2つの選択肢があります。一つは、これを呼んでいるメソッドを調べて、このメソッドの呼び出し回数を減らす方法を考えることです。もう一つは、コードを解析し、より効率のよいアルゴリズムを開発して、このメソッドで使う時間を短くすることです。この2つのアプローチを組み合わせるのが、このメソッドが消費している時間を減らす最も有効な方法です。

展開するツリーが増えると、ツリーを参照するために必要な空間は大きくなります。ツリーが大きくなりすぎた場合、2つの方法で小さくすることができます。一つは、メソッドをツリーに含めるために必要な最小値を変更することです。[Tree]アイコンをクリックするか、[Tree]メニューから[Prune]を選択します。次のようなダイアログボックスが表示されるので、スライダを動かしてカットオフ値を変更します。また、このダイアログでグローバルなデフォルト値を変更できます。
 
例  画面2
 
一番上位のメソッド呼び出しが必要ない場合は、ツリーの大きさを縮小する方法はもう一つあります。それは新しいルートを設定することです。メソッドを強調表示させ、[Tree]メニューから[Set as Root(s)]を選択します。これで、強調表示されたメソッドが新しいルートになり、ツリーが小さく、管理しやすくなります。選択されているメソッドよりも上位にあるメソッドはすべてビューから削除されます。もう一度ツリー全体を見たい場合は、[Tree]メニューから[Restore Roots]を選択します。また、[Tree]メニューで[Collapse All]を選択すると、全てのツリーを折りたたむことができます。


このメトリクスを使用する便利な方法は、時間や呼び出し回数のメトリクスと併用する、というものです。まず、調査する必要のあるメソッドを見つけます。呼び出し回数の多いものや、クロック時間がCPU時間に比べてはるかに長いメソッドです。[Mark to Find]を使用して、そのメソッドを他のメトリクスで見つけやすいようにします。次に[Call Graph Tree]を起動し、メソッドを探します。そのメソッドが何度呼ばれたかを調べたい場合は、そのメソッドよりも上にある、そのメソッドを呼び出しているメソッドを全て調べます。目的はこのメソッドを呼び出すメソッドの数を減らすことです。この方法で、このメソッドを呼び出しているメソッドの大半が見つかります。あるいは、そのメソッドで使っている時間を調べたい場合は、問題になっているメソッドのツリーを展開して、時間の多くを使っているメソッドをがどれかを判定します。これによって、パフォーマンスを上げるために調査するべき、速度低下の原因となっている可能性のある場所を見つけることができます。

インライン化候補のメソッドの判定


HPjmeterでは、アプリケーションのパフォーマンスを改善するため、インライン化すべきメソッドを挙げることができます。これは、頻繁に呼ばれているメソッドのうち、比較的単純なコードであるものが候補になります。インライン化の候補を参照するには、[Guess]メニューから[Inline Candidates]を選択します。すると、次のようなウィンドウが表示されます。
 
インライン化候補のメソッドの判定   画面
 
このメソッドに[Mark to Find]を設定して、[Call Graph Tree]のどこにあるかを見つけられるようにします。上の例では、Java標準ライブラリに含まれない一部のメソッドが、インライン化の候補として挙げられています。[Call Tree]でこのメソッドを探し、インライン化が簡単かどうかを調べる価値があります。インライン化するメソッドの最初の候補をマークして[Method Call Count]メトリクスで探します。次に、そのメソッドをダブルクリックして、それを呼び出しているメソッドを探します。それが数メソッドしかない場合もあります。その場合、そのメソッドを調べて、候補となっているメソッドを、単独のメソッドではなくインライン化することが可能かどうかを検討します。

注意: プロファイル データファイルを作成したプロファイラのバージョンによっては、各メソッドで浪費している時間が表示されたりされなかったりします。また、HPjmeterではメソッドのソースコードを見ることはできませんので、これはどのメソッドをインライン化すればいいかの目安にすぎません。プログラマが、インライン化によってパフォーマンスの改善がどの程度、実効があるかを考慮する必要があります。また、インライン化するべきかどうかを判断する際には、コードの可読性と、インライン化に適しているかどうかを考慮する必要もあります。

プロファイル データファイルに適切な情報が含まれていれば、HPjmeterは、アプリケーションのライフタイム内に存在した全てのスレッドについての統計値を表示します。最初にファイルをオープンした際、ファイル統計画面にスレッド数の合計が表示されます。

スレッドのライフタイムの参照


スレッドについての詳細を参照するには、[Metric]メニューから[Thread Histogram]を選択します。すると次のような画面が表示されます。
 
スレッドのライフタイムの参照  画面1
 
このビューでは、横方向のバーでスレッドの相対的なライフタイムを示しています。バーの位置が、そのスレッドが、プログラムのライフタイム中いつ存在したかを示します。バーは色分けされていて、どのような状態が、スレッドのライフタイムのどれだけを占めていたかを示しています。この色のついたバーは、アプリケーションを最適化する場合に、どのスレッドを検討するべきかを判断する際に大変便利です。暖色(赤とオレンジ)は、最適化によってパフォーマンスが改善される場所を示しています。黄色(I/O)も、ある程度は改善される場所を示します。寒色は、待機中などの状態を示します。

この例では、ほとんどの時間をCPU内で消費しているスレッドがいくつかあることがわかります。このスレッドについて、それが本当に必要なのか、CPU利用を減少させることが可能かどうかを調べてください。

スレッドをダブルクリックすると、個々のスレッドがどのような状態で時間を使っているかの割合を示す円グラフが表示されます。これは、スレッドが時間をどのように分割して使っているかを知るのに便利です。もう一つの手法は、スレッドヒストグラムに仮想の縦線を引き、ある期間内に、どのスレッドがどれだけ存在していたかを調べる方法です。その縦線と横方向のバーが交差しているスレッドを確認してください。

スレッドヒストグラムを参照する場合は、ライフタイムの短いスレッドを探します。スレッドの作成と破棄は高価な処理なので、短期間に多数のスレッドが作成、破棄されると、パフォーマンスに負の影響が出ます。次の例では、バーの長さでわかるとおり、ライフタイムの短いスレッドが多くなっています。
 
スレッドのライフタイムの参照  画面2
 
[Thread Group Histogram]も[Metric]メニューの下にあります。このビューは、個々のスレッドだけではなく、あるアプリケーション内の異なるスレッドグループに対する割合が表示される、ということを除けばスレッドヒストグラムと同じです。ここでも、スレッドグループのいずれかをダブルクリックすると円グラフが表示されます。

個々のスレッドやスレッドグループの解析


個々のスレッドやスレッドグループを解析するには、[Scope]メニューから[Thread]か[Thread Group]を選択します。これによって、ウィンドウが分割され右側のペインに要約されたスレッドヒストグラム、左側のペインにメトリクス、というように表示されます。

メトリクスを参照するには、右側のペインでスレッドをクリックします。[Metric]メニューに移動し、参照するメトリクスを選択します。次に、選択したスレッドの[Method Call Count]の例を挙げます。
 
個々のスレッドやスレッドグループの解析  画面


上の例では、String.equalsが6,383,130回、呼び出されていることがわかります。このメソッドについて詳しく知るには、通常どおりに[Mark to Find]を設定し、[Call Graph Tree]ビューに切り替えて[Find Immediately]を選択します。この場合、パフォーマンスを上げることができるのはStringの使用を制限することである、ということを判断できます。後で、これは最も頻繁に作成されているオブジェクトであることがわかります。

同様のオプションが[Thread Groups]でも使用できます。アプリケーションが多くのスレッドグループを使用している場合、これはプログラム全体の動作を維持したまま、アプリケーションを小さな部分に分割するのによい方法です。

メトリクスを[Thread]のスコープや[Thread Group]のスコープで参照した場合、右側のペインで別のスレッドをクリックすると、対象のスレッドを変更することができます。これは、どのスレッドがどのタスクを実行しているかを判定するのに便利な方法です。また、修正するべき問題を持つスレッドがどれか、期待した通りにきちんと動作しているスレッドはどれかを判定するのにも役立ちます。

円グラフビューの使用


個々のスレッドやスレッドグループを[Threads Histogram]ウィンドウでダブルクリックすると、スレッドやスレッドグループが時間をどのように配分しているかを示す円グラフが表示されます。例を次に示します。
 
個々のスレッドやスレッドグループの解析  画面
 
上の例は、ロックの獲得、CPUの使用、I/Oの実行、スリープ、待ちなどで、スレッドやスレッドグループがどれだけの割合で時間を消費しているかを示しています。特定のスレッドがロックの獲得に多くの時間を使っている場合、同期に関する問題が存在しているため、詳しく調べる必要があります。同じように、スリープやI/Oの実行に長い時間を使っているスレッドも調べる必要があります。
このページのトップへ

目次へ 前のページへ 次のページへ

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

HPEサポートセンター
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項