Identity Manager ではプロファイラユーティリティーが提供され、配備におけるフォーム、Java、規則、ワークフロー、および XPRESS に関連するパフォーマンスの問題のトラブルシューティングに利用できます。
フォーム、Java、規則、ワークフロー、および XPRESS はどれも、パフォーマンスやスケールの問題の原因となる場合があります。プロファイラは、これらのさまざまな領域で消費される時間のプロファイルを作成することにより、これらのフォーム、Java、規則、ワークフロー、または XPRESS オブジェクトがパフォーマンスやスケールの問題の原因となっているかどうか、また、その場合はこれらのオブジェクトのどの部分が問題の原因となっているかを判断できるようにします。
ここでは、Identity Manager のプロファイラの使用方法を説明し、配備におけるパフォーマンス問題のトラブルシューティング方法の学習に役立つチュートリアルを提供します。
これらの情報は、次のトピックで構成されています。
Identity Manager プロファイラは version 7.1 Update 1 以降でのみサポートされています。
ここでは、Identity Manager のプロファイラ機能の概要を説明します。説明する内容は次のとおりです。
プロファイラユーティリティーを使用すると、次のことが可能です。
プロファイリングデータのスナップショットを作成する。
「スナップショット」は、収集されたすべてのプロファイリング結果を最後にリセットした時点から累積された、プロファイリングの結果です。
スナップショット結果を、4 つの異なるデータビューで表示する。
「Call Tree」ビューでは、システム全体での呼び出し時間と呼び出し回数が、ツリーテーブルに表示されます。
「Hotspots」ビューでは、親にかかわらず集計された呼び出し時間が、フラット化されたノードリストに表示されます。
「Back Traces」ビューでは、そのノード (「ルートノード」と呼ばれる) が呼び出されたすべての呼び出しチェーンを、逆向きの呼び出しスタックとして表示します。
「Callees」ビューでは、親チェーンにかかわらず集められた、ルートノードの呼び出しツリーが表示されます。
スナップショットに含める情報の種類を指定する。
フォーム、ワークフロー、および XPRESS のすべての要素を含めることも、特定の要素セットだけを含めることもできます。
特定の Java メソッドやコンストラクタを選択して、計測に含めたり計測から除外したりできます。Identity Manager クラスとカスタムクラスの計測がサポートされています。
プロジェクトのスナップショットを次のように管理する。
プロジェクトの nbproject/private/idm-profiler ディレクトリまたはプロジェクト外部の任意の場所に、スナップショットを保存します。
「IDM Profiler」ビューの「Saved Snapshot」セクションで、保存されているスナップショットの一覧を表示できます。
プロジェクトからスナップショットを開くか、プロジェクト外部の任意の場所からスナップショットを読み込みます。
スナップショットを削除します。
特定のノードを名前で検索する。
ここでは、プロファイラが次の Identity Manager オブジェクトのソースをどのように検索して管理するかを説明します。
「Call Tree」ビューと「Hotspots」ビューでは、Java メソッド、ワークフロー、フォーム、規則、または XPRESS に対応する任意のノードをダブルクリックすると、そのノードのソースを表示できます。
プロファイラでスナップショットが作成されるとき、サーバーはすべてのプロファイリングデータを評価し、データがどのソースに依存しているかを調べます。次に、サーバーはこれらのソースすべてをリポジトリから取得して、スナップショットに含めます。したがって、スナップショットに表示される Identity Manager オブジェクトは、スナップショットが作成された時点の状態を正確に反映していることが保証されます。
この処理によってスナップショットのサイズは増加しますが、実際のソースのサイズは合計サイズに比べてわずかな部分にすぎません。したがって、Sun のカスタマサポートに送信するのはスナップショットのみで、ソースファイルを個別に送信する必要はありません。
Java ソースのスナップショットを作成するとき、クライアントはそのスナップショットをダウンロードし、プロジェクトより参照されるすべての Java ソースを取り込むためにスナップショットを検索します。スナップショットを保存するとき、クライアントはソースを圧縮して、スナップショットの末尾に追加します。
スナップショットを表示し Java ソースにアクセスするときは、クライアントは最初にスナップショットの内容を確認します。スナップショットに内容が見つからない場合、クライアントはプロジェクトの内容を確認します。この処理により、ユーザーのカスタム Java コードと Identity Manager コードの、両方のプロファイリングデータを含むスナップショットを送信できます。
Java ソースのスナップショットでは、ソースがサーバーで最新になっていること、または常に使用可能であることを前提としないでください。
次の節では、プロファイラから提供される結果を評価する際に考慮すべき情報について説明します。
ルートノードのセルフタイム統計を計算する場合、プロファイラは、ルートノードの合計時間からすべての子ノードの時間を減算します。
したがって、計測されていない子ノードの時間がルートノードのセルフタイムに反映されます。ルートノードのセルフタイムがかなり多い場合は、その理由を必ず調査するようにしてください。適切なメソッドで計測していないために、間違った場所を見ている可能性もあります。
たとえば、メソッド A がメソッド B を呼び出すとします。
メソッド A に合計 10 秒 (この合計時間には B の呼び出しも含まれる)、B の呼び出しに合計 10 秒がかかっています。
A と B の両方を計測していれば、呼び出しスタックにその情報が反映されます。A のセルフタイムは 0 秒、B のセルフタイムは 10 秒と表示されます (10 秒は実際に B で消費された時間)。これに対し、B を計測していない場合は、A の呼び出しに 10 秒かかり、A のセルフタイムは 10 秒であると表示されます。したがって、B ではなく A に直接問題があると考える可能性があります。
特に、最初のコンパイルで JSP のセルフタイムが多いことに気づく場合があります。収集された結果をリセットしてからページを再表示すると、セルフタイムの値はかなり少なくなります。
Java の計測方針には制限があるため、this() または super() の最初の呼び出しは、コンストラクタ呼び出しの子としてではなく兄弟として表示されます。次の例を参照してください。
class A { public A() { this(0); } public A(int i) { } } and: class B { public static void test() { new A(); } } The call tree will look like this: B.test() -A.<init>(int) -A.<init>() Rather than this: B.test() -A.<init>() -A.<init>(int) |
ReconTask.WorkerThread.run() や TaskThread.WorkerThread.run() など、Identity Manager のいくつかのデーモンスレッドで大量の時間が消費されたように見えますが、これに惑わされないでください。この時間の大部分は、イベントを待機しているスリープ中に消費されたものです。イベントの処理中に実際に消費された時間を確認するには、これらのトレースを調査する必要があります。
ここでは、プロファイラを起動する方法と、プロファイラのグラフィカルユーザーインタフェースの各種機能を使用する方法について説明します。この情報は、次のように構成されています。
プロファイラはメモリーを集中的に使用するため、サーバーと Netbeans Java 仮想マシン (JVM) 両方のためにメモリーをかなり増やす必要があります。
サーバーのメモリーを増やすには、次の手順に従います。
Netbeans ウィンドウを開き、「実行時」タブを選択します。
「サーバー」ノードを展開し、「バンドル版 Tomcat」を右クリックし、ポップアップメニュー から「プロパティー」を選択します。
「サーバーマネージャー」ダイアログが表示されたら、「接続」タブの「HTTP モニターを有効化」ボックスのチェックマークを外します。
「プラットフォーム」タブを選択し、VM オプションを -Xmx1024M に設定して「閉じる」をクリックします。
Netbeans JVM のメモリーを増やすには、次の手順を使用します。
netbeans-installation-dir\etc\netbeans.conff ファイルを開き、次の行を見つけます。
netbeans_default_options="-J-Xms32m -J-Xmx ...
-J-Xmx の値を -J-Xmx 1024M に変更します。
ファイルを保存してから閉じます。
完了したら、次の節の説明に従ってプロファイラを起動します。
次の方法のいずれかを使用して、Identity Manager IDE ウィンドウからプロファイラを起動できます。
メニューバーにある「Start Identity Manager Profiler on Main Project」アイコンをクリックします。
「Start Identity Manager Profiler on Main Project」アイコンは、Identity Manager メインプロジェクトのバージョンが 7.1 Update 1 以降の場合に使用可能になります。
メニューバーから「ウィンドウ」>「IDM Profiler」の順に選択します。
「Identity Manager Profiler」ウィンドウが Explorer に表示されます。このウィンドウで、「Current Project」ドロップダウンメニューから Identity Manager プロジェクトを選択し、「コントロール」セクションにある「Start Identity Manager Profiler」アイコンをクリックします。
「プロジェクト」ウィンドウでプロジェクトを右クリックし、ポップアップメニューから「Start Identity Manager Profiler」を選択します。
「プロジェクト」ウィンドウでプロジェクトを選択し、メニューバーから「IDM」>「Start Identity Manager Profiler」を選択します。
プロファイラを起動すると「Profiler Options」ダイアログが表示されるので、使用するプロファイリングオプションを指定できます。これらのオプションの設定方法については、「プロファイラオプションの指定」を参照してください。
この節では、プロファイラのグラフィカルユーザーインタフェースの機能と、これらの機能の使用方法について説明します。説明する内容は次のとおりです。
「Profiler Options」ダイアログは次のタブで構成されています。
これらのタブにあるオプションを使用して、どのオブジェクトのプロファイルを作成するか、およびどの要素をプロファイルに表示するかを指定します。
プロファイラのオプションを指定したら、「OK」をクリックしてプロファイラを起動します。プロジェクトの設定に応じて、プロファイラは 2 つの処理のどちらかを実行します。
通常の Identity Manager プロジェクトを「組み込み」の Identity Manager インスタンスで使用する場合、プロファイラは完全なビルドを実行して NetBeans アプリケーションサーバーに配備し、プロファイラを起動します。
通常の Identity Manager プロジェクトを「外部」の Identity Manager インスタンスで使用する場合、またはリモートの Identity Manager プロジェクトを使用する場合、プロファイラはそのプロジェクト用に設定されている Identity Manager インスタンスに接続します。
「IDM」>「Set Identity Manager Instance」を選択して、プロジェクトに対する Identity Manager インスタンスの動作を制御できます。
「Mode」タブには次のオプションがあります。
「IDM Objects Only」: フォーム、規則、ワークフロー、および XPRESS オブジェクトのプロファイルを作成する場合に選択します。Java オブジェクトはプロファイルから除外されます。
「Java and IDM Objects」: フォーム、Java、規則、ワークフロー、および XPRESS オブジェクトのプロファイルを作成する場合に選択します。
通常の Identity Manager プロジェクトを「外部」の Identity Manager インスタンスで使用する場合、またはリモートの Identity Manager プロジェクトを使用する場合、「Java and IDM Objects」オプションは使用できません。
プロファイラの実行中に「Mode」オプションを変更することはできません。オプションを変更するには、プロファイラを停止する必要があります。
「IDM Object Filters」タブには次のオプションがあります。
Show IDM Object details
Include Anonymous Sources
「匿名ソース」は、一時的に生成されるフォーム (またはフォームの一部) であり、Identity Manager リポジトリに常駐する持続的フォームとは対応しません。匿名ソースの例には、ログインフォームや MissingFields フォームがあります。
匿名ソースをスナップショットに含める場合は、このボックスを選択します。
匿名ソースをスナップショットから除外する場合は、このボックスの選択を解除します。
「Java Filters」タブは次の場合に選択します。
Java フィルタを含める、または除外する
新しいフィルタを作成する
既存のフィルタを削除する
デフォルトのフィルタを復元する
Java フィルタは、メソッドパターンの形で指定され、「正規メソッド名」に基づいて含めるか除外するかを示すパターンで表現されます。正規メソッド名は次のとおりです。
fully-qualified-class-name.method-name( parameter-type-1, parameter-type-2, ... )
コンストラクタの場合、method-name は <init> です。
次に、いくつかの例を示します。
すべてのコンストラクタを除外するには、「Exclude」ボックスを有効にし、次のフィルタを追加します。
*.<init>(*)
単一の org.w3c.dom.Element パラメータを持つすべてのコンストラクタを除外するには、「Exclude」ボックスを有効にし、次のフィルタを追加します。
*.<init>(org.w3c.dom.Element)
すべての Identity Manager クラスを除外するには、「Exclude」ボックスを有効にし、次のフィルタを追加します。
"com.waveset.*" "com.sun.idm.*"
カスタムコードだけを計測するには、「Exclude」ボックスを無効にし、最初の * include フィルタを削除してから、次のフィルタを追加します。
"com.yourcompany.*"
現在では、フィルタはカスタムクラスと Identity Manager クラスだけに適用されるため、最後の 2 つの例は等価です。
必要な場合は、build.xml の次の行を適切に編集すると、ほかの JAR を計測できます。次に例を示します。
<instrument todir="${lighthouse-dir-profiler}/WEB-INF" verbose="${instrumentor.verbose}" includeMethods="${profiler.includes}" excludeMethods="${profiler.excludes}"> <fileset dir="${lighthouse-dir}/WEB-INF"> <include name="lib/idm*.jar"/> <include name="classes/**/*.class"/> </fileset> </instrument> |
デフォルトの設定では、ユーザーのすべてのカスタムクラスとほとんどの Identity Manager クラスが含められます。いくつかの Identity Manager クラスは、有効にするとプロファイラで障害が発生するため、強制的に除外されています。
たとえば、ワークフロー、フォーム、および XPRESS の各エンジンのクラスは除外されています。そうしないと、プロファイラが Java および Identity Manager オブジェクトのプロファイルを作成する際に、理解不能なスナップショットが生成されます。
「Java Filters」では、「IDM Object Filters」よりはるかに詳細なフィルタリングが提供されます。Java 計測では、かなりのオーバーヘッドが実行時間に追加され、それによってプロファイリング結果が大幅に歪曲される可能性があります。Identity Manager オブジェクトはコンパイルされるのではなく解釈されるので、計測のオーバーヘッドは無視できるほどの大きさです。したがって、ワークフロー A を除外してワークフロー B を含めるなどには、基本的に理由がありません。
プロファイラの実行中に Java Filters を変更することはできません。Java Filters を変更する前に、プロファイラを停止する必要があります。
「Miscellaneous」タブには次のオプションがあります。
Prune snapshot nodes where execution time is 0:
実行時間がゼロのエンティティーも含め、実行されたすべてのエンティティーの呼び出し情報をスナップショットに含めるには、このオプションを無効にします (デフォルトで無効)。
実行時間が 0 のノードについても、呼び出し回数の情報が役立つことがあります。
このようなノードを削除するには、このオプションを有効にします。 この場合、もっとも関連のあるプロファイリングデータに焦点を当てることができます。また、このオプションを有効にすると、プロファイラのスナップショットサイズを大幅に節約できます。
Automatically Open Browser Upon Profiler Start:
プロファイラの起動時に、プロファイルを作成する Identity Manager インスタンスを指すブラウザを自動的に開くようにするにはこのオプションを有効にします (デフォルト)。
ブラウザを開かないようにするには、このオプションを無効にします。
Include Java Sources in Snapshot:
プロファイリングデータで参照されているすべての Java メソッドの Java ソースをスナップショットに含めるには、このオプションを有効にします (デフォルト)。フィールドでは常にこのスナップショットの設定を使用するようにしてください。カスタム Java は比較的小さく、その情報があるとサポートには大変役立ちます。
Identity Manager のプロファイルを作成する場合で、Identity Manager の完全なソースが利用可能なときだけ、このオプションを無効にします。
この場合、Identity Manager のソースを含めるとスナップショットがきわめて大きくなるので、それは望ましくありません。詳細は、「プロファイラがソースを見つけて管理するしくみ」を参照してください。
「IDM Profiler」ビューは次の領域で構成されています。
「Current Project」領域は、ユーザーの現在のプロジェクトを一覧表示するドロップダウンメニューで構成されています。このメニューを使用して、プロファイルを作成するプロジェクトを選択します。
「Controls」領域には、次の表で説明する 4 つのアイコンがあります。
アイコン |
名前 |
目的 |
---|---|---|
|
Start Identity Manager Profiler |
プロファイラを起動し、「Profiler Options」ダイアログを開きます。 |
|
Stop Identity Manager Profiler |
プロファイラを停止します。 |
|
Reset Collected Results |
この時点までに収集されたプロファイリング結果をすべてリセットします。 |
|
Modify Profiling |
「Profiler Options」ダイアログを再度開き、現在のプロファイリング結果を修正するために設定を変更できるようにします。 |
「Status」領域は、ホストに接続しているかどうかを報告し、プロファイラの起動時、実行中、および停止時にはステータス情報を表示します。
「Profiling Results」領域には、次の表で説明する 2 つのアイコンがあります。
アイコン |
名前 |
目的 |
---|---|---|
|
Start Identity Manager Profiler |
プロファイラを起動し、「Profiler Options」ダイアログを開きます。 |
|
Reset Collected Results |
この時点までに収集されたプロファイリング結果をすべてリセットします。 |
「Saved Snapshot」領域には、保存されているスナップショットの一覧が表示されます。
スナップショットを保存する手順については、「スナップショットの保存」を参照してください。
また、次のボタンを使用して、これらのスナップショットを管理することもできます。
Open: このボタンをクリックすると、保存されているスナップショットを「スナップショットビュー」ウィンドウで開くことができます。
「Saved Snapshot」リストでスナップショットをダブルクリックして、そのスナップショットを開くこともできます。
Delete: 「Saved Snapshot」リストでスナップショットを選択してからこのボタンをクリックすると、選択したスナップショットを削除できます。
Save As: リストでスナップショットを選択してからこのボタンをクリックすると、外部の任意の場所にスナップショットを保存できます。
Load: このボタンをクリックすると、任意の場所にあるスナップショットを「スナップショットビュー」ウィンドウで開くことができます。
スナップショットを開くと、Identity Manager IDE の右上にある「スナップショットビュー」ウィンドウに結果が表示されます。
スナップショットにはいくつかのデータビューがあり、これらについて次の節で説明します。
「Call Tree」ビューは、システム全体での呼び出し時間と呼び出し回数を表示するツリーテーブルで構成されています。
このツリーテーブルには、次の 3 つの列があります。
「Call Tree」列: すべてのノードを一覧表示します。
トップレベルのノードは次のいずれかです。
システムの各種バックグラウンドスレッドに対応する Thread.run() メソッド。
たとえば、Java プロファイリングを有効にした場合は、ReconTask.WorkerThread.run() メソッドが表示されます。
要求時間
たとえば、idm/login.jsp という URL を表示した場合は、idm/login.jsp に対応するトップレベルエントリが表示されます。このエントリに関して、「Time」列に表示されるデータはその要求の合計時間を表します。「Invocations」列に表示されるデータは、そのページに対する呼び出しの合計回数を表します。次に、そのデータをさらに詳細に調べて、どの呼び出しに時間がかかったかを確認できます。
「Call Tree」には「Self Time」ノードもあります。「Self Time」の値は、そのノード自体で消費された時間を表します。詳細は、「統計の警告」を参照してください。
「Time」列: 各ノードが親から呼び出されたときにそのノードで消費された時間を表示します。パーセント値は、親の時間に対する相対値です。
「Invocations」列: 各ノードが親から呼び出された回数を表示します。
「Hotspots」ビューでは、親にかかわらず集計された呼び出し時間が、フラット化されたノードリストに表示されます。
このビューには、次の列があります。
Self Time: 各ノードで消費された合計時間を表示します。
Invocations: 各ノードが親から呼び出された合計回数を表示します。
Time: 各ノードおよびそのすべての子で消費された合計時間を表示します。
「Back Traces」ビューでは、各ノードが呼び出されたすべての呼び出しチェーンが、逆転した呼び出しスタックに表示されます。
これらの統計を使用すると、そのノードから特定の呼び出しチェーンを削除した場合に、どれだけの時間が節約されるかがわかります。
「Back Traces」ビューにアクセスするには、ほかのスナップショットビューのいずれかでノード (「ルートノード」と呼ばれる) を右クリックし、ポップアップメニューから「Show Back Traces」を選択します。
「Back Traces」ビューの「Time」および「Invocations」のデータ値は少し意味が異なります。
Time: この列の値は、ルートノードが特定の呼び出しチェーンから呼び出されたときにそのノードで消費された時間を表します。
Invocations: この列の値は、ルートノードが特定の呼び出しチェーンから呼び出された回数を表します。
「Callees」ビューでは、親チェーンにかかわらず集められた、ノード (「ルートノード」と呼ばれる) の呼び出しツリーが表示されます。
これらの統計は、問題のある領域がマスター呼び出しツリー全体のさまざまな部分から呼び出されている場合に、そのノードの全体的なプロファイルを確認するのに役立ちます。
「Callees」ビューにアクセスするには、ほかのスナップショットビューのいずれかでノード (「ルートノード」と呼ばれる) を右クリックし、ポップアップメニューから「Show Callees」を選択します。
「Callees」ビューで使用される「Time」および「Invocations」のデータ値の意味は、「Call Tree」ビューで使用されるものと同じです。
「Call Tree」ビューまたは「Hotspots」ビューで任意のノードを右クリックすると、次の表に示すオプションがポップアップメニューに表示されます。
メニューオプション |
説明 |
---|---|
GoTo Source |
Java メソッド、ワークフロー、フォーム、規則、または XPRESS に対応するノードの XML ソースを表示する場合は、このオプションを選択します。このビューの詳細は、「プロファイラがソースを見つけて管理するしくみ」を参照してください。 |
Show Back Traces |
「Back Traces」ビューにアクセスする場合は、このオプションを選択します。このビューの詳細は、「「Back Traces」ビュー」を参照してください。 |
Show Callees |
「Callees」ビューにアクセスする場合は、このオプションを選択します。このビューの詳細は、「「Callees」ビュー」を参照してください。 |
Find In Hotspots |
「Hotspots」ビューでノードを検索する場合は、このオプションを選択します。このビューの詳細は、「「Hotspots」ビュー」を参照してください。 |
オプションを表示 > ソート > |
このオプションには次のいずれかを選択します。
|
オプションを表示 > 表示項目を変更 |
Call Tree または Hotspots のリストに表示される列を変更する場合は、このオプションを選択します。 「表示項目を変更」ダイアログが表示されたら、次のオプションを 1 つ以上選択できます。
|
「スナップショットビュー」ウィンドウの上部にある「検索」アイコン を使用すると、「Call Tree」ビューまたは「Hotspots」ツリーからノードを名前で検索できます。
あるいは、「Call Tree」ビューまたは「Hotspots」ビューで任意のノードを右クリックし、ポップアップメニューからそれぞれ「Find in Call Tree」または「Find in Hotspots」を選択すると、ノードを検索できます。
プロファイラには、スナップショットを保存するためのオプションがいくつか用意されています。これらのオプションについては、次の表を参照してください。
アイコン |
名前 |
目的 |
---|---|---|
|
「Save the Snapshot in the Project」アイコン (「スナップショットビュー」ウィンドウの上部にある) |
プロジェクトの nbproject/private/idm-profiler ディレクトリにスナップショットを保存します。プロジェクトに保存されているスナップショットは、「Profiler」ビューの「Saved Snapshot」セクションに一覧表示されます。 |
|
「Save the Snapshot Externally」アイコン (「スナップショットビュー」ウィンドウの上部にある) |
外部の任意の場所にスナップショットを保存します。 |
|
「Save As」ボタン (「Saved Snapshot」領域にある) |
外部の任意の場所にスナップショットを保存します。 |
Identity Manager ではチュートリアル (profiler-tutorial.zip) が用意されており、プロファイラを使用してフォーム、Java 規則、ワークフロー、および XPRESS のトラブルシューティングを行う方法の学習に利用できます。
チュートリアルを完了するには、次の手順を使用します。
「ファイル」>「新規プロジェクト」の順に選択します。
新規プロジェクトウィザードが表示されたら、次のように設定し、「次へ」をクリックします。
「Name and Location」パネルで次のフィールドに入力し、「次へ」をクリックします。
Project Name: プロジェクト名として Idm80 と入力します。
Project Location?: デフォルトの場所を使用するか、別の場所を指定します。
Project Folder?: デフォルトのフォルダを使用するか、別のフォルダを指定します。
「Identity Manager WAR File Location」パネルが表示されたら、Identity Manager 8.1 の war ファイルの場所を入力します。通常、このファイルを解凍すると、同じディレクトリに idm.war ファイルが作成されます。
「次へ」をクリックして「Repository Setup」パネルに進みます。
このパネルではデフォルト設定を変更する必要はないので、そのまま「完了」をクリックします。Identity Manager の出力ウィンドウに「BUILD SUCCESSFUL」というメッセージが表示されたら、プロファイラのチュートリアルファイルを抽出できます。手順については、「手順 2: プロファイラチュートリアルの解凍」を参照してください。
profiler-tutorial.zip をプロジェクトルートに解凍します。抽出されるファイルには次のものがあります。
<project root>/custom/WEB-INF/config/ProfilerTutorial1.xml <project root>/custom/WEB-INF/config/ProfilerTutorial2.xml <project root>/src/org/example/ProfilerTutorialExample.java <project root>/PROFILER_TUTORIAL_README.txt
プロファイラを起動します。「手順 3: プロファイラの起動」に進みます。
「開始する前に」で説明されている手順を使用して、サーバーおよび Netbeans JVM のメモリーを増設します。
「概要」で説明されているいずれかの方法で、プロファイラを起動します。
「Profiler Options」ダイアログが表示されたら、プロファイリングオプションを指定できます。
「手順 4: プロファイラオプションの設定」に進みます。
その他のプロファイラオプションの詳細は、「プロファイラオプションの指定」を参照してください。
このチュートリアル用には、次のプロファイラオプションを指定します。
「Mode」タブで「Java and IDM Objects」を選択して、フォーム、Java、規則、ワークフロー、および XPRESS オブジェクトのプロファイルを作成することを指定します。
「Java Filters」タブを選択します。
次の手順を使用して、カスタム Java クラス (ここでは org.example.ProfilerTutorialExample) を除くすべての Identity Manager Java クラスを無効にします。
「了解」をクリックしてプロファイラを実行します。
プロジェクトではじめてプロファイラを実行する場合や、プロジェクトのクリーンアップ操作を最近実行した場合は、プロファイラの処理の完了に数分かかります。
処理が完了すると、ログインを求めるプロンプトが表示されます。
パスワード configurator を入力し、「Remember Password」ボックスを選択してから、「了解」をクリックして続行します。
Identity Manager ウィンドウが表示されたらログインします。
通常は、再度 configurator としてログインするのではなく、別のユーザーで Identity Manager にログインするようにしてください。Identity Manager セッションプールで使用できるのは 1 ユーザーにつき 1 つのエントリだけですが、すでに Configurator としてプロファイラにログインしています。複数のエントリを使用すると、セッションプールの表示が壊れ、パフォーマンスの問題をより詳細に調査するためのプロファイリング結果が歪曲される可能性があります。
ただし、この単純な例では、セッションプールは重要でないので、configurator/configurator としてログインしてかまいません。
Identity Manager で、「サーバータスク」>「タスクの実行」を選択し、ProfilerTutorialWorkflow1 をクリックします。
チュートリアルが応答するまでに少し時間がかかることがあります。
この時点でスナップショットを作成することもできますが、ここでは結果をリセットし、プロファイラを実行し、プロファイラを再度実行してから、スナップショットを作成します。
スナップショットを作成する前に、すべてのキャッシュの準備が完了したこと、すべての JSP がコンパイルされていることなどを確実にするために、プロファイラを数回実行することが最良の方法です。
プロファイラを数回実行することで、実際のパフォーマンスの問題に焦点を当てることができます。この方法が推奨されないのは、キャッシュ自体の生成に問題がある場合だけです。
Identity Manager IDE で 「IDM Profiler」ビューに戻ります。「Profiling Results」セクション (または「Controls」セクション) の「Reset Collected Results」アイコン をクリックして、この時点までに収集された結果をすべてリセットします。
Identity Manager で、「サーバータスク」>「タスクの実行」を再度選択し、ProfilerTutorialWorkflow1 をクリックします。
処理ダイアグラムが表示されたら、Identity Manager IDE に戻り、「Profiling Results」セクションの「Take Snapshot」をクリックします。
Identity Manager IDE でユーザーのスナップショットがダウンロードされ、結果がウィンドウの右側に表示されます。
この領域が「Call Tree」ビューです。呼び出しツリーの最上部に /idm/task/taskLaunch.jsp が表示され、「Time」列に時間が表示されます。その時間は、要求全体に 6 秒強かかったことを示しています。
/idm/task/taskLaunch.jsp ノードを展開すると、ProfilerTutorialWorkflow1 に 6 秒かかったことがわかります。
ProfilerTutorialWorkflow1 ノードを展開します。activity2 に 4 秒、activity1 に 2 秒かかっています。
activity2 を展開します。
action1 に 2 秒、action2 に 2 秒かかっています。
action1 を展開すると、<invoke> にも 2 秒かかったことがわかります。
<invoke> をダブルクリックすると、ProfilerTutorialWorkflow1.xml が開き、次の行が強調表示されます。
<invoke name=’example’ class=’org.example.ProfilerTutorialExample’/> |
ProfilerTutorialExample メソッドの呼び出しに 2 秒かかったことがわかります。
実際には、プロジェクト内のソースではなく、スナップショットに取り込まれた XML ソースを参照しています。スナップショットには必要なものがすべて含まれています。詳細は、「プロファイラがソースを見つけて管理するしくみ」を参照してください。
「CPU:<date><time>」タブを選択して、スナップショットに戻ります。
<invoke> ノードを展開すると、プロファイラが ProfilerTutorialExample.example() Java メソッドで 2 秒消費したことがわかります。
メソッド名をダブルクリックすると、ProfilerTutorialExample.java ソースが開き、次の行が強調表示されます。
Thread.sleep(2000); |
ここに問題があります。このメソッドには 2 秒のスレッドスリープが含まれています。
Call Tree に戻ると、2 秒のパスはすべてこのメソッドにつながっていることがわかります。3 つのパスがあり、合計 6 秒になっています。
「Call Tree」領域の下部にある「Hotspots」タブを選択して、「Hotspots」ビューを開きます。ProfilerTutorialExample.example() の合計セルフタイムは 6 秒になっています。
「Hotspots」の詳細は、「「スナップショットビュー」の操作」を参照してください。
ProfilerTutorialExample.example() を右クリックし、ポップアップメニューから「Show Back Traces」を選択します。
領域の下部に、新しい「Back Traces」タブが表示されます。
「Back Traces」タブで ProfilerTutorialExample.example() ノードを展開すると、このメソッドが 3 箇所から呼び出されたことと、各箇所からの呼び出しに 2 秒かかったことがわかります。
「Back Traces」の詳細は、「「スナップショットビュー」の操作」を参照してください。
「Save the snapshot in the project」アイコンをクリックして、スナップショットを保存して閉じます。
「IDM Profiler」タブの「Saved Snapshot」セクションを確認すると、このスナップショットが表示されるはずです。場合によっては、スクロールダウンする必要があります。
保存したスナップショットを選択し、「Open」をクリックして再度開きます。
「Save As」ボタンを使用するとスナップショットを外部に保存でき、「Load」ボタンを使用するとプロジェクト外部からスナップショットを読み込むことができます。
スナップショットをふたたび閉じます。
このチュートリアルの次の部分では、ワークフロー ManualAction のプロファイルを作成する方法を示します。
Identity Manager で、「サーバータスク」>「タスクの実行」を選択し、ProfilerTutorialWorkflow2 をクリックします。
しばらくすると、空のフォームが表示されます。
「保存」をクリックすると、処理ダイアグラムが表示されます。
「サーバータスク」>「タスクの実行」を再度選択します。
Identity Manager IDE の「IDM Profiler」ビューに戻り、「Profiling Results」セクションの「Reset Collected Results」アイコンをクリックします。
Identity Manager で ProfilerTutorialWorkflow2 をクリックします。
空のフォームが再度表示されたら、「保存」をクリックします。
「IDM Profiler」ビューで、「Take Snapshot」をクリックします。
数秒後、「Call Tree」領域にスナップショットが表示されます。/idm/task/workItemEdit.jsp に 6 秒強かかったことがわかります。この結果は、ワークフローでの手動操作に対応します。
/idm/task/workItemEdit.jsp ノードを展開すると、ManualAction フォーム内のすべての Derivations の実行に合計 6 秒かかったことがわかります。
Derivation、displayNameForm、variables.dummy、および <block> ノードを展開します。
<block> に 6 秒かかったことと、その時間のうちで ProfilerTutorialExample.example() メソッドの 3 回の呼び出しにそれぞれ 2 秒かかったことがわかります。
<block> をダブルクリックすると、ソースを表示できます。