プログラムのパフォーマンス解析 | ![]() ![]() ![]() ![]() ![]() |
第 3 章
標本コレクタリファレンス
この章では、標本コレクタを紹介し、その使用方法を説明します。以下の各項目を取り上げます。
標本コレクタは、ターゲットアプリケーションおよびそのアプリケーションが実行されているカーネルのパフォーマンスデータを収集し、そのデータを実験レコードファイルに書き込みます。本書では、アプリケーションの実行中にデータを収集すること、または収集されたデータを、実験と呼ぶことがあります。
特に指定しない限り、標本コレクタで生成された実験レコードファイルには、.n
.er
という拡張子が付きます。n は 1 以上の整数です。デフォルトの実験ファイル名は、test
.n.er
になります。実験レコードファイルに filename.1.er
という形式を使用する場合、標本コレクタは、以降の実験レコードファイル名を自動的にインクリメントします。たとえば、my_test.1.er
に続いて、my_test.2.er
、my_test.3.er
となります。
注意 -実験レコードフィルの削除に
rm
ユーティリティを使用しないでください。実際の実験情報は、.filename.n.er
という隠れディレクトリに格納されており、このディレクトリはrm
によって削除されないためです。実験レコードファイルと隠れディレクトリを削除するには、パフォーマンスツールユーティリティのer_rm
を使用します。これは、標本コレクタとアナライザとともに提供されています。er_rm
の使用方法については、er_rm
のマニュアルページを参照してください。
標本コレクタが収集するデータ
標本コレクタは実験中に、パフォーマンスデータを記録し、そのデータを一定間隔ことの標本として編成します。標本コレクタは、以下の状況で標本を終了し、次の標本に移ります。
- ブレークポイントを見つけたとき (Sun WorkShop デバッガでのブレークポイントの設定については『Sun WorkShop の概要』を参照)
- サンプリング間隔を設定した場合は、設定間隔が経過とき
- 手動サンプリングを選択した場合は、「コレクタ」
「新規標本」を選択したとき、または「新規標本」ボタンをクリックしたとき
各標本に記録されるデータは、カーネルからの微小状態記録アカウンティング情報とカーネル内で保持されているその他のさまざまな統計情報とからなります。
標本ポイントで記録されるデータは、プログラムにとって大域的であり、関数レベルのメトリック (測定結果) が含まれていません。ただし、標本収集の合間に関数レベルのメトリックが記録された場合、標本コレクタはこれらの関数メトリックをそれが収集されたサンプリング間隔に関連付けます。
排他メトリック、包含メトリック、寄与メトリック
標本コレクタは、関数および読み込みオブジェクトに対する、排他メトリック、包含メトリック、寄与 (属性) メトリックを収集します。
- 排他データは、関数自身に費やされている時間に適用されます。
- 包含データは、関数自身に費やされている時間と、その関数が呼び出した任意の関数に費やされている時間に適用されます。呼び出された関数の時間は、その呼び出す側の関数から呼び出された場合にのみ加算されます。
- ある関数の寄与データは、その関数から呼び出された関数で発生したメトリックと、そのような呼び出しの結果、呼び出された関数が新たに呼び出した関数で発生したメトリックの合計で。寄与メトリックには、次の条件が適用されます。
- ある関数を呼び出した関数の寄与メトリックとは、呼び出された関数で発生したメトリック、およびそのような呼び出しの結果、呼び出された関数が呼び出した任意の関数 (複数も可) で発生したメトリックを指します。
- 呼び出し側の寄与メトリックは、呼び出された関数がその呼び出し側の包含メトリックに寄与分に相当します。
- ある関数のすべての呼び出し側の寄与メトリック合計は、その呼び出された関数の包含メトリックと同じ値です。
- ある関数に呼び出された関数の寄与メトリックは、呼び出された関数の、呼び出し側の関数から呼び出された結果としての、包含メトリックの一部となります。
- 呼び出された関数の寄与メトリックと包含メトリックとの差は、呼び出された関数の包含メトリックのうち、その呼び出し関数以外から呼び出された結果発生したものに相当します。
- ある関数の包含メトリックは、その排他メトリックに、その関数から呼び出された関数の全寄与メトリックの合計を加算したものになります。
時間ベースのプロファイルデータ
時間ベースのプロファイリングは、次のメトリックをサポートするための情報を記録します。
- ユーザー CPU 時間 - アプリケーションが CPU 上で動作している時間
- 総 LWP 時間 - 全 LWP (軽量プロセス) の実行時間の合計
- 時計時間 - スレッド 1 で経過した LWP 時間
- システム CPU 時間 - オペレーティングシステムが費やした総 CPU 時間 (LWP がトラップ状態にある総 CPU 時間)
- システム待ち時間 - CPU、ロックまたはカーネルページ待ちで経過した LWP 時間 (休眠や停止に費やされた時間)
- テキストページフォルト時間 - テキストページ待ちで経過した LWP 時間
- データページフォルト時間 - データページ待ちで経過した LWP 時間
この情報は、アナライザの「関数リスト」表示と「呼び出し元-呼び出し先」ウィンドウに表示されます (「関数およびロードオブジェクトの測定結果の検査」を参照)。この情報は、「概要メトリック」ウィンドウおよび注釈付きのソースと逆アセンブリコードにも表示されます。
注 - マルチプロセッサを使用した実験では、時計時間以外の時間は、プロセス内の全 LWP について合計されます。総時間は、時計時間に、プロセス内に含まれる平均 LWP 数を掛けた値に等しくなります。各レコードには、タイムスタンプ、およびごく短時間に実行していた LWP とスレッドの ID が含まれます。
時間ベースのプロファイリングは、次のような疑問を解消するのに役立ちます。
- アプリケーションは利用可能な資源のどのくらいを消費しているか
- どの関数が資源の大半を消費しているか
- どのソース行および逆アセンブリ命令が資源の大半を消費しているか
- プログラムはどのようにして実行のこの地点に到着したか
スレッド同期待ちの監視
マルチスレッドプログラムでは、スレッド同期待ちの監視機能は、スレッドライブラリ内にあるスレッド同期ルーチンによる待ち時間を追跡しています。リアルタイム遅延が、ある一定のユーザ定義しきい値を超えると、その呼び出しと待ち時間 (秒数) に関するイベントが記録されます。
各レコードには、タイムスタンプと、クロックスタンプ時に実行中であったスレッドと LWP の ID が含まれます。同期遅延情報は、次のメトリックをサポートしています。
この情報は、標本アナライザの「関数リスト」表示と「呼び出し元-呼び出し先」ウィンドウに表示されます (「関数およびロードオブジェクトの測定結果の検査」を参照)。この情報は、「概要メトリック」ウィンドウおよび注釈付きのソースと逆アセンブリコードにも表示されます。
ハードウェアカウンタのオーバフロープロファイル
ハードウェアカウンタのオーバフローのプロファイルは、LWP が動作している CPU の指定のハードウェアカウンタがオーバフローを起こしたときに、各 LWP の呼び出しスタックを記録します。
標本コレクタを使用すると、オーバフローが監視されているカウンタの種類を選択し、それにオーバフロー値を設定することができます。通常、カウンタは、命令キャッシュの消失、データキャッシュの消失、サイクル、発行または実行された命令などを追跡します。
注 - ハードウェアカウンタのオーバフロープロファイル機能が使用できるのは、SPARC (UltraSPARC III) マシンおよび Intel (Pentium II およびその互換製品) で実行される Solaris 8 だけです。その他のマシン上では使用できません。
ハードウェアカウンタのオーバフローのプロファイルは、カウンタメトリックをサポートするデータを生成します。
大域情報
プログラムに関する大域情報には、次のようなデータが含まれます。
- 実行統計 - ページフォルトおよび I/O データ、コンテキスト切り替え、およびさまざまなページ存在 (ワーキングセットおよびページング) 統計情報が含まれます。この情報は、標本アナライザの「実行統計」表示に表示されます (「実行の統計情報の検査」を参照)。
- アドレス空間データ (任意) - アプリケーションのアドレス空間の各セグメントに関するページ参照情報およびページ変更情報からなります。この情報は、標本アナライザの「アドレス空間」表示に表示されます (「アドレス空間情報の検査」を参照)。
Sun WorkShopでのパフォーマンスデータの収集
- プログラムを「デバッグ」ウィンドウに読み込みます (Sun WorkShop の起動方法および「デバッグ」ウィンドウへのアクセス方法については、『Sun WorkShop の概要』を参照)。
- ランタイムチェック機能がオフ (デフォルト) になっていることを確認します。
1. WorkShop メインウィンドウから「ウィンドウ」「標本コレクタ」を選択します。
- 「標本コレクタ」ウィンドウが表示されます。
![]()
図 3-1 「標本コレクタ」ウィンドウ2. 「データ収集」ラジオボタンを使用して、1 回の実行または全ての実行でデータを収集するかのいずれかを指定します。
- 「一度の実行のみ」を選択した場合は、プログラムを 1 回実行した後、標本コレクタを無効にして、その実行データを実験レコードファイルに格納します。
- 「すべての実行」を選択した場合は、プログラムの実行が終了しても、標本コレクタは動作状態のままです。以降の実行ごとに、標本コレクタは、新しい実験レコードファイルを作成し、その実行データを格納します。
- 「オフ」を選択した場合は、これ以外の「データ収集」ラジオボタンを押すまで標本コレクタを無効にして、データの収集と格納を行いません。
3. 「実験ファイル」フィールドに、データを格納したい実験レコードファイルのパスとファイル名を指定します。
- 標本コレクタが指定するデフォルトの実験レコードファイル名は、
test.1.er
です。別の名前を付けたい場合は、そのパス (デフォルトディレクトリに格納したくない場合) とファイル名を入力します。- 実験レコードファイル名に
.1.er
という接尾辞を使用すると、標本コレクタは、以降の実験レコードファイルの名前を自動的に 1 つずつ加算します。たとえば、test.1.er
の次は、test.2.er
になります。4. 時間ベースのプロファイル情報を収集するには、「時間ベースのプロファイリング」チェックボックス選択されていることを確認します (デフォルトで選択)。
- 「通常」プロファイル間隔 (10ミリ秒) をそのまま使用することも、リストボックスから「高解像度」 (1 ミリ秒) または「カスタム」を選択することもできます。「カスタム」を選択した場合は、独自の間隔をミリ秒単位で指定します。
- 高解像度プロファイルは、どのような実行に対しても、通常プロファイルと比較して 10 倍のデータを記録します。高解像度プロファイルをサポートするには、オペレーティングシステムが高解像度クロックルーチンを実行していなければなりません。高解像度ルーチンを指定するには、
/etc/system
というファイルに次の行を追加して、リブートします。
set hires_tick=1
注 - 高解像度プロファイルをサポートしていないオペレーティングシステム上で`この機能を設定しようとすると、標本コレクタは、警告メッセージを出力し、サポートされている解像度のうち、もっとも高いものを使用します。カスタム設定値がシステムでサポートされている解像度の倍数でない場合は、その解像度にもっとも近い倍数に丸められ、標本コレクタが警告メッセージを出力します。
5. スレッド同期待ち回数および待ち時間についての情報を収集するには、「同期待ちの監視」チェックボックスを選択します。
- 監視が開始するしきい値を指定するには、次の操作を行います。
6. ハードウェアカウンタオーバフローに関する情報を収集するには、「HW カウンタのオーバーフローのプロファイル」チェックボックスを選択します。7. 「カウンタの名前」からカウンタの種類を選択し、「表示」をクリックしてそのカテゴリで使用できる全カウンタの一覧を表示します。ユーザーが認識できるカウンタ名のうち、選択したものが「カウンタの名前」フィールドに表示されます。8. あるオーバフローイベントと次のオーバフローイベントとの間で加算される数値を指定するには、「収集の間隔」からデフォルトの「通常」(選択したカウンタによって値が異なる) を選択するか、または「カスタム」を選択して「収集の間隔」フィールドに値を入力します。
注 - すべてのハードウェアカウンタはプラットフォームに依存します。したがって、利用可能なカウンタの一覧は、システムごとに異なります。一部のシステムでは、ハードウェアカウンタのオーバフロープロファイルをサポートしていません。そのようなシステムでは、このオプションが使用不可になっています。
9. アドレス空間のメモリー割り当てに関する情報を収集するには、「アドレス空間データ」チェックボックスを選択します。10. 標本収集の間隔については、デフォルトの高解像度収集間隔 (1秒間隔) をそのまま使用するか、「標本収集の間隔」リストボックスから「通常」(10 秒間隔)、「カスタム」(独自の間隔を秒数で設定) または「手動」を選択することができます。なお、「手動」を選択した場合は、「標本コレクタ」ウィンドウの「コレクタ」「新規標本」を選択するか、または「新規標本」ボタンをクリックして現在の標本の終了と次の標本の開始を指定します。
![]()
以上で、データ収集を開始できる状態になりました。標本コレクタを実行するには、「標本コレクタ」ウィンドウで、次の作業を行います。
- 「コレクタ」
「開始」を選択するか、または「開始」ボタンをクリックします。
![]()
dbx
で標本コレクタ下のプロセスを起動標本コレクタは、「デバッグ」ウィンドウからだけでなく
dbx
からも起動できます。1.dbx
でプログラムを起動するには、次のように入力します。
%dbx
program_name2.(dbx)
のプロンプトが表示されるまで、スペースバーを押します。3.標本コレクタ
コマンドにさまざまな引数を指定してデータを収集し、実験レコードを生成します。
(dbx)collector argument
- 表 3-1 に、
collector
コマンドの引数を示します。
利用可能な
collector
コマンド引数の一覧を取得するには、dbx
プロンプトに対し次のように入力し、Enter キーを押します。
(dbx)help collector
実行中プロセスへの接続
標本コレクタを使用すると、実行中プロセスに接続し、そのプロセスのパフォーマンスデータを収集できます。
スレッド同期待ちの監視データを収集したい場合は、実行可能プログラムを起動する前に、
libcollector.so
というライブラリを読み込みます。これによって、実際のルーチンそのものではなく、同期ルーチンを囲むコレクタのラッパーが参照されます。プロファイルデータまたはハードウェアカウンタのオーバフロープロファイルだけを収集する場合は、コレクタライブラリを事前に読み込んでおく必要はありませんが、読み込んでも差し支えありません。
libcollector.so
を事前にロードするには、次の操作を行います。
- 表 3-2 に示すように、環境変数
LD_PRELOAD
がlibcollector.so
を指すように設定します。
- install_directory は、配布ソフトウェアが含まれているディレクトリです (通常は
/opt/
)。
注 - 実行が終了したら、LD_PRELOAD
の設定値を削除し、同じシェルから起動される他のすべてのプログラムに影響が出ないようにします。
実行可能プログラムに接続し、データを収集するには、次の操作を行います。
1. プログラムを起動します。2. プログラムの PID を決定し、その PID にdbx
を接続させます。
3. データ収集機能をオンにします。
- データ収集は、
collector
コマンドを使用してdbx
から直接起動するか、または「標本コレクタ」ウィンドウから起動します。cont
コマンドを使用して、dbx
から対象のプロセスを再開します。
注 - データ収集機能をオンにせずに、dbx
から実行可能プログラムを起動した場合は、dbx
からターゲットプロセスを一時停止させてから、前述の命令を実行して、プロセスの実行中にデータ収集を開始することができます。
MPI を使用するプログラム
Sun Cluster Runtime Environment (CRE) コマンドである
mprun
を使用して、並行ジョブを起動している場合、標本コレクタは、Sun Message Passing Interface (MPI) を使用するマルチプロセスプログラムのパフォーマンスデータを収集することができます。ClusterTools 3.1 またはそれと互換性のあるバージョンを使用します。詳細については、Sun HCP ClusterTools 3.1 のマニュアルを参照してください。MPI ジョブのデータを収集するには、
dbx
から MPI プロセスを 起動するか、またはdbx
を各プロセスに別個に接続します。たとえば、次のようなコマンドを使用して MPI ジョブを実行するとします。
%mprun -np 2 a.out
[program-arguments]
%mprun -np 2 dbx a.out < collection.script
collection.script
はdbx
スクリプトで、次の段落で説明します。この例を実行すると、実行可能オブジェクトの
a.out
から 2 つの MPI プロセスが実行され、test.
M.er
とtest.
N.er
という 2 つの実験が作成されます。なお、M と N は、2 つの MIP プロセスの PID です。作成される実験名が一意になるように、
collection.script
というファイルによって保証しなければなりません。実験名が一意でないと、実験を生成するdbx
インスタンスが同時に実行されるため、複数のdbx
インスタンスが同じ名前で実験を作成しようとします。ファイル名を確実に一意にする 1 つの方法は、MPI プロセスのプロセス ID が含まれたファイル名を各dbx
インスタンスが使用するように、collection.script で指定することです。
stop in mainrun [program_arguments]collector enablecollector store filename test.$[getpid()].ercontquitまた、名前の一部に MPI ランクが含まれた実験を作成することもできます。それには、
dbx
スクリプトを若干変更します。このスクリプトでは、MPI_Comm_rank () の呼び出し直後に、ターゲットプログラムを停止し、ランクを使用して実験ディレクトリを指定します。たとえば、MPI プログラムの 17 行目に次の文が記述されているものとします。
- C プログラムの場合
ier = MPI_Comm_rank(MPI_COMM_WORLD,&me);- Fortran プログラムの場合
call MPI_Comm_rank(MPI_COMM_WORLD, me, ier)
collection.script
を次のように変更します。
stop at 18run [program_arguments]rank=$[me]collector enablecollector store filename test.$rank.ercontquitこのような修正を行うことによって、
mprun
が作成する実験には、その実験が対応する MPI プロセスのランクが含まれた名前が付けられます。MPI プロセスから収集されたデータを調べるには、アナライザで 1 つの実験を開き、別の実験を追加します。これによって、すべての MPI プロセスのデータが集計されます。詳細については、「標本アナライザの起動および実験の読み込み」および 「標本アナライザに実験を追加」を参照してください。
er_print
を使用してもデータを出力できます。er_print
は、コマンド行から複数の実験を受け付けます。詳細については、第 5 章「er_print リファレンス」参照してください。
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |