ej-technologies 社の提供する Java 解析ツール、JProfiler には多くの使い道がありますが、そのうちのひとつに CPU プロファイリングとその解析があります。
この記事では、データの収集 (これはかなり単純なプロセスです) そのものよりも、収集した CPU プロファイル データを解析する方法について説明しています。
以下では、CPU 解析におけるヒントを示しています (注: 画像内のコールスタックは、一部意図的に黒塗りされています)。
- プロファイル データの収集後、まず [CPU views] – [Call Tree] での “Thread Status” (スレッドの状態) は “All States” (すべての状態) を選択します。これによって、”Runnable” (実行可能) の状態ではないスレッドについても確実にチェックが入ります。
- [Hot Spots] のセクションを開き、目立っておかしいところがないかチェックします。ホットスポット ビューでは、選択したタイプの呼び出しのリストが表示されます。リストは、呼び出しが全呼び出しの総使用時間の 1% 未満となった時点で切り捨てられます。ここでは、”Self time” (セルフ タイム) によってメソッドをソートできるので、特定のメソッドに必要以上の時間がかかっている場合に、一目瞭然でわかります。
- [Threads] のセクションでは、特定のスレッドによる動作がかかりっきりになっていないかどうか確認できます。もしも該当する場合には、そのスレッドをルートとして設定し、他の不要な呼び出しのノイズを軽減することができます。
- ここで、[CPU views] のコール ツリーをチェックし、アプリケーションの実行で CPU 時間の大部分を消費している該当メソッドを見つけ出します。
- このメソッドをルートとして設定 (これによって他のメソッドのノイズが軽減されます) し、解析を行います (右クリックして [Set As Root] を選択)。
– 注意:ここで選択したルートは、すべてのタブに反映されます。いずれかのタブにおいてすべての呼び出しを表示するには、まずルートを削除する必要があります。
- 次に、右クリックして [Analysis] – [Calculate Cumulated Outgoing Calls] (累積発信呼び出し) を選択します。通常のコール ツリーでは特定のコール スタックのメソッドのみからの発信呼び出しが表示されますが、[Calculate Cumulated Outgoing Calls] を選択することにより、特定のメソッドからのすべての発信呼び出しが確認できます。
- [Calculate Cumulative Outgoing Calls] に対する補足手段として、[Calculate Backtrace to Selected Method] (選択メソッドへのバックトレースの計算) を選択することもできます。
a. 上記のように特定のメソッドからの発信呼び出しを表示する代わりに、選択メソッドの呼び出しにいたるまでのバックトレースが表示されます。
b. バックトレース解析では、ホットスポット ビューでのオプションと同様に、画面の上部に総使用時間およびセルフタイムの選択オプションがあります。
- 上記 5 番目のステップでルートを設定したため、ホットスポット ビューには、特に関心のあるメソッドだけが表示されることになります。設定したルート以下の該当メソッドのみが表示されます。
- 時間のかかっているメソッドが限定できると、[Call Graph] オプションで着信/発信呼び出しを図式表示できます。
これらのヒントを参考にしていただけると幸いです。
JProfiler に関する概要、ライセンス、価格、ダウンロードなどの詳細は、こちらの弊社製品ページをご覧ください。
記事参照:
2018 年 2 月 14 日
Akshay Deshpande
Senior Performance Engineer at Oracle
Oracle India Pvt. Ltd
「Jprofiler – CPU profiling」