マニュアルページ collect.1
名前
collect - プログラムのパフォーマンスデータの収集に使用するコ
マンド
形式
collect collect-arguments target target-arguments
collect
collect -V
collect -R
説明
collect コマンドはターゲットプロセスを実行して、そのプロセス
に関するパフォーマンスおよびグローバルデータを記録します。パ
フォーマンスデータは、プロファイリングまたはトレース技 術 を
使っ て収集されます。このデータは、GUI プログラム (analyzer)
かコマンド行プログラム (er_print) を使って表示できます。col-
lect コマンドによって実行されるデータ収集ソフトウェアをここ
ではコレクタと呼びます。
collect コマンドを 1 回実行して収集されるデータを実験と呼 び
ます。実験は、ファイルシステムにディレクトリとして表示されま
す。このディレクトリにはさまざまな種類のファイルが含ま れ ま
す。
target は、パフォーマンスデータを収集したい実行可能ファイ ル
あるいは Java(TM) .jar ファイルまたは Java .class ファイルの
パス名です (Java プロファイリングの詳細につ い て は、 次 の
「Java プロファイリング」の項を参照してください)。collect コ
マンドのターゲットとなる実行可能ファイルは、どの最適化レベル
でコンパイルされたものでもかまいませんが、動的リンクを使用し
たものでなければなりません。プログラムが静的にリンクされてい
る 場 合は、collect コマンドはエラーメッセージを出力します。
analyzer または er_print を使用して注釈付きソースを表示す る
には、ターゲットを -g フラグ付きでコンパイルし、ストリップし
ないでください。
データ領域プロファイリングを有 効 に す る に は、 -xhwcprof
-xdebugformat=dwarf -g フラグを指定して、実行可能ファイをコ
ンパイルする必要があります。これらのフラグは、C、C++、および
Fortran コンパイラでのみ、また SPARC[R] プラットフォーム上で
のみ有効です。下記の「データ領域プロファイリング」参照してく
ださい。
collect コマンドは、次の方法を用いてターゲットを検索します。
et:
- ターゲット名を持つ、実行可能とマークされたファイルが存在す
る 場合は、ターゲットマシンで実行可能な ELF 実行可能ファイ
ルかどうかが確認されます。ファイルが有効な ELF 実 行 可 能
ファイルでない場合は、collect コマンドは失敗します。
- ターゲット名のファイルが存在し、そのファイルが実行可能ファ
イ ル で ない場合、collect は、そのファイルが Java[tm] jar
ファイルまたは class ファイルのどちらであるかを調べま す。
Java jar または class ファイルの場合は、ターゲットとして、
必要なフラグとともに Java[tm] 仮想マシン(JVM) ソフトウェア
が 挿 入 さ れ、その JVM マシン上でデータが収集されます。(
「Java 仮想マシン」および「JVM」の語は、Java[TM] プラッ ト
フォーム用仮想マシンを指します)。「Java プロファイリング」
の項を参照してください。
- ターゲット名を持つファイルが存在しない場合、実行可能ファイ
ルを探してユーザーのパスが検索されます。実行可能ファイルが
見つかると、上記の確認が行われます。
- 現在の名前のファイルが見つからない場合は、その名前に文字列
.class を付加した名前を持つファイルを検索し、見つかった場
合は、上記のように適切なフラグをすべて付けて JVM の ター
ゲットが挿入されます。
- 以上の手順でターゲットが見つからない場合、コマンドは失敗と
なります。
オプション
引数なしで呼び出された場合は、実験のデフォルト設定を含めて簡
単な使用法を出力します。プロセッサがハードウェアカウンタオー
バーフロープロファイリングをサポートしている場合は、 ハー ド
ウェ ア カ ウンタに関する情報を含む 2 つのリストが出力されま
す。1 つ目のリストは「既知 (well known)」のハードウェアカ ウ
ン タ、2 つ目のリストは raw ハードウェアカウンタの情報です。
詳細は、後述の「ハードウェアカウンタのオーバーフローの プ ロ
ファイリング」を参照してください。
データ指定
-p option
時間ベースのプロファイリングデータ収集 を 行 い ま す。
option には次の値を指定できます。
値 意味
off 時間ベースのプロファイリングは行われません。
on デフォルトの約 10 ミリ秒のプロファイリング 間
隔 で 時 間ベースのプロファイリングが行われま
す。
lo[w] 約 100 ミリ秒の低分解能プロファイリング間隔で
時間ベースのプロファイリングが行われます。
hi[gh] 約 1 ミリ秒の高分解能プロファイリング間隔で時
間ベースのプロファイリングが行われます。
n n のプロファイリング間隔で時間ベース の プ ロ
ファ イリングが行われます。n のプロファイリン
グ間隔で時間ベースのプロファイリングが行わ れ
ま す。 n には、整数または浮動小数点数を指定
し、接尾辞 u を使用してマイクロ秒、接尾 辞 m
を 使用してミリ秒を指定することができます。接
尾辞を省略すると、ミリ秒を指定したと見なさ れ
ます。
プロファイリング間隔の下限値よりも小さな値 を
指 定すると、下限値がプロファイリング間隔とし
て設定されます。プロファイリング間隔の分解 能
の 倍 数 でない値を指定すると、切り捨てが行わ
れ、もっとも近い倍数値に設定されま す。 プ ロ
ファ イリング間隔の上限値を超える値を指定する
と、エラーが報告されます。負の値や 0 (ゼ ロ )
を 指定した場合も、エラーが報告されます。引数
なしで起動された場合は、時間プロファイル間 隔
が報告されます。
時間プロファイル間隔の前にオプションの + を指定 し て、
collect によるデータ領域データの収集を指定することがで
きます。これは、1 つの命令をバックトラックする こ と に
よっ て行われます。命令がメモリー命令の場合は、遅延の原
因がその命令にあったとみなされ、メモリー参照の仮想お よ
び物理アドレスを含めてイベントが記録されます。
時間ベースのデータ領域のデータの解釈には注意が 必 要 で
す。 これは、そのメモリー命令が遅延にまったく関係なく、
時間プロファイルでヒットした命令にたまたま先行した命 令
で あることがあるためです。たとえばメモリー命令がキャッ
シュでヒットし、その命令が何回も実行されたループ内に あ
る 場合、その命令のカウントは大きくなり、実際にはそうで
はなくても、メモリーストールによる遅延があるようにみ え
る ことがあります。この状況は、このメモリーストールを示
す命令の前後の逆アセンブリを調べることによって明確に す
る ことができます。前後の命令もまた時間プロファイルメト
リック値が大きい場合、そのメモリー遅延は、おそらく誤 り
です。
時間ベースのデータ領域プロファイリングは、メモリーを 使
用 するカウンタに対するハードウェアカウンタプロファイリ
ングをサポートしていないマシンでのみ使用するようにし て
ください。
このあとの「データ領域プロファイリング」の節を参照し て
ください。
-p off 引数が明示的に指定されず、ハードウェアカウ ン タ
オー バーフロープロファイリングも指定されない場合は、時
間ベースのプロファイリングが行われます。
-h ctr_def...[,ctr_n_def]
ハードウェアカウンタオーバーフローのプロファイルを収 集
します。カウンタの定義数、( ctr_def から ctr_n_def まで
の個数) は、プロセッサによって異なりま す。 た と え ば
UltraSPARC III システムの場合は、カウンタを 2 つまでプ
ログラミングできます。ハイパースレッディング機能を持 つ
Intel Pentium IV の場合は、最高 18 個のカウンタを使用で
きます。ターゲットシステムでのプロファイリングに指定 で
き る 最 大ハードウェアカウンタ定義数と使用可能なハード
ウェアカウンタの全一覧は、引数なしで collect コマンドを
実行することによって得ることができます。
Linux OS が動作するシステムで、このオプションを使用でき
るようになりました。ただし、このためには Perfctr パッチ
をシステムに手動でインストールする必要があります。こ の
パッチは次の場所からダウンロードできます。
http://user.it.uu.se/~mikpe/linux/perfctr/2.6/perfctr-2.6.15.tar.gz
この tar ファイルには、インストールに関する説明が含まれ
ています。
各カウンタの定義は、ハードウェアカウンタの属性 が プ ロ
セッ サでサポートされているかどうかに従って次の形式のい
ずれかを取ります。
1. [+]ctr[/reg#][,interval]
2. [+]ctr[~attr=val]...[~attrN=valN][/reg#][,interval]
カウンタ定義オプションの意味は次のとおりです。
値 意味
+ メモリー関係のカウンタに適用可能なオプショ ン
のパラメータ。 collect は、オーバーフローを発
生させた命令を検出し、メモリー参照の仮想お よ
び 物理アドレスを検出するためのバックトラック
を行うことによってデータ領域データを収集し ま
す。 バックトラックは、SPARC プロセッサでコマ
ンド行引数を付けずに collect を実行することに
よっ て得られるカウンタリストに表示されるよう
な ロード、ストア、ロード-ストアと表示され る
タ イプのカウンタでのみ機能します。以降にある
「データ領域プロファイリング」を参照してく だ
さい。
ctr プロセッサ固有のカウンタ名。カウンタ名の一 覧
は、コマンド行引数を付けずに collect コマンド
を実行することによって得ることができます。
attr=val 一部プロセッサでは、ハードウェアに属 性 オ プ
ショ ンを関連付けることができます。プロセッサ
が属性オプションをサポートしている場合、コ マ
ンド行引数を付けずに collect を実行すると、上
記の 2 つ目の形式のカウント定義、 ctr_defの指
定 になり、 attr に使用する属性名の一覧が提供
されます。値 val は 10 進または 16 進表記のど
ちらでもかまいません。16 進表記は、C プログラ
ムの形式、すなわち、数値の前にゼロと小文字 の
x (0xhex_number) の形式にします。
reg# カウンタに使用するハードウェアレジスタ。指 定
さ れなかった場合、B collect は最初に使用可能
なレジスタにカウンタを書き込もうとします。 こ
の ため、レジスタの衝突のために以降のカウンタ
を書き込めないことがあります。複数のカウン タ
を 指定する場合は、それぞれに異なるレジスタを
使用する必要があります。使用可能なレジスタ 番
号 の一覧は、コマンド行引数を付けずに collect
コマンドを実行することによって得ることがで き
ます。
interval カウンタオーバーフロー値を定義することに よっ
て 設定される標本周波数。有効な値は次のとおり
です。
値 意味
on デフォルトのレートを選択します。 こ
れは、コマンド行引数を付けずに col-
lect コマンドを実行することによって
確 認できます。raw カウンタのデフォ
ルト値はどれも同じで、特定のカウ ン
タ に最適な値ではない可能性があるこ
とに注意してください。
hi onの約10分の1の間隔に設定します。
lo onの約10倍長い間隔に設定します。
value 特定の値を間隔に設定します。10 進ま
たは 16 進表記で指定します。
実験には、ハードウェアカウンタオーバーフロープロファ イ
リ ン グ と時間ベースのプロファイリングを両方指定できま
す。ハードウェアカウンタオーバーフロープロファイリン グ
が 指定され、時間ベースのプロファイリングが明示的に指定
されない場合、時間ベースのプロファイリングは行われま せ
ん。
詳細は、下記の「ハードウェアカウンタのオーバーフロー の
プロファイリング」を参照してください。
-s option
同期トレースデータを収集します。
トレースイベントの最小遅延しきい値は、option を使用して
設定します。option には次の値を指定できます。
値 意味
on 同期遅延トレースが行われ、実行時に決定され る
測定されたしきい値が設定されます。
calibrate on と同じ
off 同期遅延トレースは行われません。
n n マイクロ秒のしきい値で同期遅延トレースが 行
わ れます。n がゼロの場合、すべてのイベントが
トレースされます。
all 同期遅延トレースが行われ、すべての同期イベ ン
トがトレースされます。
デフォルトでは、同期遅延トレースは行われません。
同期イベントは Java モニター用に記録されますが、JVM マ
シン内でのネイティブの同期用には記録されません。
-H option
ヒープトレースデータを収集します。option には次の値を指
定できます。
値 意味
on 記憶域割り当て要求がトレースされます。
off 記憶域割り当て要求のトレースは行われません。
デフォルトでは、ヒープトレースは行われません。
ヒープトレースイベントはネイティブ呼び出しのために記 録
さ れます。 mmap への呼び出しは、メモリー割り当てとして
扱われます。
Java プログラムに対するヒーププロファイリングはサポート
されていません。指定すると、エラーとして処理されます。
ヒープトレースでは、非常に大きな実験ファイルが生成さ れ
る 可能性があることに注意してください。このような実験の
読み込みとブラウズは非常に時間がかかります。
-m option
MPI トレースデータを収集します。
option には次の値を指定できます。
値 意味
on MPI コールのトレースを行います。
off MPI コールのトレースは行われません。
デフォルトでは、MPI トレースは行われません。
-c option
bit(1) 計測機構を使用してカウントデータを収集します。こ
のオプションは、SPARC システムでのみ使用できます。
option に指定できる値は次のとおりです。
値 意味
on カウントデータを有効にします。
static あらゆる命令が 1 回だけ実行されたという仮定に
基 づいて、シミュレートされたカウントデータを
有効にします。
off カウントデータを無効にします。
デフォルトでは、カウントデータは無効です。カウント デー
タ の収集とほかの種類のデータの収集を組み合わせることは
できません。カウントデータまたはシミュレートされたカ ウ
ン トデータの場合は、実行可能ファイルと、計測機構が組み
込まれて静的にリンクされた共有オブジェクトがカウント さ
れ ます。動的にロードされた共有オブジェクトに計測機構は
組み込まれず、カウントもされません。
カウントデータを収集するには、-xbinopt=prepare フラグを
使用して実行可能ファイルをコンパイルします。
-r option
スレッドアナライザデータを収集します。
option に指定できる値は次のとおりです。
値 意味
on スレッドアナライザのデータ競合検出データを 有
効にします。
all すべてのスレッドアナライザデータを有効にし ま
す。
off スレッドアナライザデータを無効にします。
dt1,...,dtN
dt* パラメータに指定された特定の種類のス レッ
ドアナライザデータを有効にします。
要求できる特定の種類のスレッドアナライザデータは次の と
おりです。
値 意味
race データ競合データを収集します。
deadlock デッドロックおよび潜在的デッドロックデータ を
収集します。
デフォルトでは、すべてのスレッドアナ ラ イ ザ
デー タは無効です。スレッドアナライザデータの
収集は、トレースデータの収集と組み合わせる こ
と はできませんが、時間プロファイルデータまた
はハードウェアカウンタプロファイルデータの 収
集 とは組み合わせることができます。スレッドア
ナライザデータはターゲットの実行速度を大幅 に
低 下させるため、ユーザーコードに適用したとき
プロファイルが無意味であることがあります。
スレッドアナライザ実験は、analyzer まはた tha
の いずれかを使用して検証できます。後者は、デ
フォルトのタグが簡素化されているだけで、そ の
他は同じです。
データ競合の検出を有効にするには、コンパイ ル
時 またはポストプロセッサを呼び出すことによっ
て、実行可能ファイルに計測機構を組み 込 み ま
す。 ター ゲッ トに計測機構が組み込まれておら
ず、かつ、そのライブラリリストにある共有オ ブ
ジェ クトのどれにも計測機構が組み込まれていな
い場合は、警告が表示されますが、実験は実行 さ
れ ます。その他のスレッドアナライザデータは、
計測機構を必要としません。
OpenMP の競合検出には、新しい バー ジョ ン の
libmtsk.so が必要です。このバージョン用のパッ
チが、FCS 時に発行される予定です。それより 前
の ものでは、そのライブラリのコピーが bits と
もにインストールされ、collect によって自動 的
に収集されます。
詳細は、tha(1) のマニュアルページを参照してく
ださい。
-S interval
指定された間隔 (秒単位) で定期的に標本を収 集
し ます。プロセスからデータ標本を記録します。
カーネルからのタイムスタンプと実行統計など の
情報も含まれます。interval には次の値を指定で
きます。
値 意味
off 定期的な標本収集を行いません
on デフォルトの間隔 (1 秒) で定期的 な
標本収集を行います
n n (秒) の間隔で定期的な標本収集を行
い ます。n には正の値を指定する必要
があります。
デフォルトでは、定期的な標本収集が行われます。
データを指定する引数がない場合は、デフォルトの分解能 で
時間ベースのプロファイリングデータを収集します。
時間ベースのプロファイリングが明示的に無効にさ れ て い
て、 ハードウェアオーバーフロープロファイリングまたはど
の種類のトレースも有効にされていない場合は、関数レベ ル
の データが収集されないことを示す警告が表示されて、ター
ゲットが実行され、グローバルデータが記録されます。
実験の制御
-L size
記録されるプロファイリングデータとトレースデータの量 を
size メ ガバイトに制限します。この制限は、すべてのプロ
ファイリングデータとトレースデータの合計に適用されま す
が、 標 本 収集ポイントには適用されません。制限に達する
と、データのプロファイリングおよびトレースが停止され ま
す が、ターゲットプロセスが終了するまで実験は開いたまま
になり、標本が記録されます。size には次の値を指定できま
す。
値 意味
unlimited または none
記録されるデータ量を制限しません
n 記録されるデータ量を n メガバイトに制限 し ま
す。 n には 0 (ゼロ) 以外の正の値を指定する必
要があります。
記録されるデータ量のデフォルトの制限値は、2,000 メガ バ
イトです。
-F option
派生プロセスのデータが記録されるか否かを制御 し ま す。
option には次の値を指定できます。
値 意味
on fork および exec からの派生プロセスに関する実
験を記録します
all すべての派生プロセスに関する実験を記録します
off 派生プロセスに関する実験を記録しません。
=<regex> 正規表現に一致する系統または実行可能ファイ ル
名 (a.out 名) を持つすべての派生プロセスに関
する実験を記録します。
デフォルトでは、派生プロセスは記録されません。詳細 は、
下記の「派生プロセスのフォロー」を参照してください。
-A option
ターゲットプロセスによって使用されるロードオブジェク ト
を、 記 録 された実験に保管またはコピーするかを制御しま
す。option には次の値を指定できます。
値 意味
on ロードオブジェクトを実験に保管します。
off ロードオブジェクトを実験に保管しません。
copy ロードオブジェクトを実験にコピーし、保管し ま
す。
実験を別のマシンにコピーしたり、別のマシンから読み取 り
たい場合には、 -A copy と指定する必要があります。この場
合、ソースおよびオブジェクトファイルはコピーさ れ ま せ
ん。 そのため、ユーザー自身が、実験を実行するマシン上か
らそれらのファイルにアクセスできるようにしておく必要 が
あります。
-A のデフォルトの設定は on です。
-j option
ターゲットが JVM マシンの場合、Java プロファイリング を
制御します。option には次の値を指定できます。
値 意味
on JVM マシンに関するプロファイリングデータを 記
録して、Java HotSpot[TM] 仮想マシンによってコ
ンパイルされたメソッドを検出しま す。 ま た、
Java 呼び出しスタックを記録します。
off Java プロファイリングデータを記録しません。
<path> JVM に関するプロファイリングデータを記録し ま
す。 <path> にインストールされている JVM を使
用します。
次の「Java プロファイリング」の項を参照してください。
ターゲットが JVM マシンの場合、プロファイリングデータを
取得するには -j on を使用する必要があります。ターゲット
が class または jar ファイルの場合は、-j on オプショ ン
は 不要です。64 ビット JVM マシンのユーザーは、ターゲッ
トとしてそのパスを明示的に指定する必要があり ま す。 32
ビッ ト JVM マシンには、-d64 オプションは使いません。-j
on オプションを指定しても、ターゲットが JVM マシンで は
な い場合は、無効な引数がターゲットに渡される可能性があ
り、データは記録されません。collect コマンド に よ り、
Java プロファイリングに指定された JVM マシンのバージョ
ンの妥当性検査が行われます。
-J java_arg
プロファイリングに使用する JVM に渡す引数を 1 つ指定 し
ます。 -J が指定されて、Java プロファイリングが指定され
ていない場合は、エラーが生成され、実験は実行さ れ ま せ
ん。この引数は、単一引数として JVM に渡されます。複数の
引数が必要な場合は、 -J を使用しないで、JVM へのパス を
明 示的に指定して、-j on を使用し、JVM へのパスのあとに
JVM 用の引数を追加してください。
-l signal
指定されたシグナルがプロセスに送られるたびに、標本収 集
ポイントを記録します。
-y signal[,r]
signal を使用して、データの記録を制御します。指定された
シ グナルがプロセスに配信されるときはいつでも、一時停止
(データ記録なし) と再開 (データを記録) の間でステータス
を 切り替えます。任意の ,r フラグが指定された場合、コレ
クタはステータスを再開にして起動されます。それ以外の 場
合 は、ステータスは一時停止で起動されます。このオプショ
ンは、標本収集ポイントの記録には影響しません。
出力の制御
-o experiment_name
記録される実験の名前として experiment_name を使用 し ま
す。experiment_name の末尾は文字列 .er でなければなりま
せん。そうでない場合はエラーが報告され、実験は実行さ れ
ません。
-o が指定されなかった場合は、実験に stem.n.er の形式 の
名 前が付けられます。stem は文字列で、n は番号です。 -g
を使ってグループ名が指定された場合、stem には、.erg な
し のグループ名が設定されます。グループ名が指定されない
場合は、stem は文字列 "test" に設定されます。
MPI ジョブを実行するためのコマンドの 1 つから呼び出され
て、 -o が指定されていない場合は、そのプロセスの MPI ラ
ンクを定義するための環境変数から、名前で使用されてい る
n 値が取られます。それ以外の場合は、n は使用されている
最大の整数よりも 1 つ大きい値に設定されます。
stem.n.er 型で名前が指定されておらず、指定の名前が使 用
さ れている場合は、エラーメッセージが出力され、実験は実
行されません。名前が stem.n.er 型であり、指定されている
名前が使用されている場合、実験は、使用されている n の値
よりも 1 つ大きい値に対応する名前で記録されます。名前が
変更された場合、警告が出力されます。
-d directory_name
実験をディレクトリ directory_name に保存します。ディ レ
ク トリが指定されなかった場合は、実験は現在の作業ディレ
クトリに保存されます。グループを指定した場合 (次 の -g
を参照)、 -d で指定されたディレクトリには、グループファ
イルも書き込まれます。
-g group_name
実験を実験グループ group_name に追加します。 group_name
文 字列の末尾は .erg でなければなりません。そうでない場
合はエラーが報告され、実験は実行されません。
グループファイルの先頭行には必ず、文字列
#analyzer experiment group
を含めてください。以降、実験名を 1 行に 1 つ指 定 し ま
す。
-O file
collect からのすべての出力を指定された名前のファイル の
最 後に追加しますが、生成されたターゲットからの出力はリ
ダイレクトされません。file に /dev/null が設定されて い
る 場合は、エラーメッセージを含めて、collect からのすべ
ての出力が抑止されます。
-t duration
指定の時間の間、データを収集します。duration には、1 つ
の 数値に続けて、分を意味する m か、秒を意味する s を指
定するか (デフォルト)、- 符号で区切って 2 つの数値を 指
定します。数値が 1 つ指定された場合は、実行開始からその
時間が経過するまでデータ収集されます。2つの数値が指定さ
れた場合は、1 つ目の時間から 2 つ目の時間までデータ収集
されます。2 つ目の時間がゼロの場合は、実行終了まで デー
タ収集されます。ゼロ以外の 2 つの数値を指定する場合、最
初の数値は 2 つ目の数値より小さい値にします。
その他の引数
-P <pid>
指定の PID を持つプロセスに接続し、そのプロセスからデー
タを収集するための dbx スクリプトを作成します。プロファ
イリングデータのみ指定でき、トレースデータは指定でき ま
せん。実行の時間指定 (-t) はサポートされていません。
-C comment
notes ファイルに実験に関するコメントを書き込みます。 最
大 10 個の -C 引数を指定できます。
-n dry run。ターゲットは実行されませんが、実行予定の実験の
すべての詳細が出力されます。-v 引数がオンになります。
-R パフォーマンスツール README のテキスト版が端末ウィン ド
ウに表示されます。README が見つからない場合は、警告が出
力されます。その他の引数の検査は行われず、その他の処 理
も行われません。
-V 現在のバージョンを出力します。その他の引数のチェック は
行われず、その他の処理も行われません。
-v 現在のバージョンと、実行中のエクスペリメントに関する 追
加の詳細情報を出力します。
-x デバッガをターゲットプロセスにアタッチさせるため、 exec
シ ステムコールからの終了時にターゲットプロセスを停止さ
せます。collect コマンドは、プロセスの PID とともにメッ
セージを出力します。
collect によって停止されたターゲットにデバッガを接続 す
るには、下記の手順に従う必要があります。
- collect -x コマンドによって出力されたメッセージからプ
ロセスの PID を取得します。
- デバッガを起動します。
- デバッガが SIGPROF を無視するように設定します。ハード
ウェ ア カ ウンタデータの収集が選択されている場合は、
Solaris では SIGEMT、Linux では SIGIO も無視するよ う
に設定します。
- PID を使用してプロセスに接続します。
プロセスはデバッガの制御の下で実行され、実験はコレク タ
により記録されます。
派生プロセスのフォロー
collect によって生成された初期プロセス (親プロセスという) か
ら の データは、必ず収集されます。プロセスは、fork や exec、
system、etc. の派生関数を含めて、システムライブラリ関数を 呼
び 出 すことによって派生プロセスを作成することができます。-F
引数が使用された場合、コレクタは派生プロセスのデータを収集す
ることができ、親の実験内に各派生プロセス用の新しい実験を開き
ます。これらの新しい実験には、次のような名前が付けられます。
- 作成者の実験名の最後に下線が付けられます。
- コード文字が追加されます。fork は "f"、exec は "x"、その他
の派生は "c" です。
- コード文字のあとに番号 (fork または exec のインデック ス )
が付けられます。この番号の割り当ては、プロセスの起動に成功
したかどうかに関係なく行われます。
- 系統には実験接尾辞の ".er" が付加されます。
たとえば、初期プロセスの実験名が "test.1.er" の場合、その 3
番目の fork によって生成された派生プロセスの実験名は
"test.1.er/_f3.er" になります。派生プロセスが新しいイメージ
を exec した場合、対応する実験名は "test.1.er/_f3_x1.er" に
なります。
-F on が使用された場 合 は、 fork(2)、 fork1(2)、 fork(3F)、
vfork(2)、 および exec(2) とその派生関数への呼び出しによって
開始された派生プロセスが追尾されます。vfork への呼び出しは、
内 部 的 に は fork1 へ の 呼 び 出 しに置き換えられます。
system(3C)、system(3F)、sh(3F)、popen(3C) とその類似関数への
呼び出しによって作成された派生プロセスとそれらに関係する派生
プロセスは追尾されません。
-F all 引数が使用された 場 合 は、 system(3C)、 system(3F)、
sh(3F)、popen(3C) とその類似関数からのものを含めて、すべての
派生プロセスが追尾されます。
-F =<regex> 引数が使用された場合は、正規表現に一致する名前ま
たは系統名を持つすべての派生プロセスが追尾されます。系統名の
検索では、".er" は省略します。名前の検索では、コマンドとその
引数の両方が正規表現に含まれます。
たとえば親の system への最初の呼び出しを起点に、その最 初 の
fork か ら の最初の exec の派生プロセスのデータを収集するに
は、次を使用します。
collect -F '=_c1_f1_x1'
fork を除いて、exec のすべての派生関数のデータだけを収集する
には、次を使用します。
collect -F '=.*_x[0-9]/*'
system("goodbye") を除いて、system("echo hello") への呼び出
しからのデータを収集するには、次を使用します。
collect -F '=echo hello'
アナライザおよび er_print は、親の実験を読み取るとき、派生プ
ロ セ スの実験を自動的に読み取りますが、派生プロセスの実験は
データ表示の対象としては選択されません。
表示するデータをコマンド行から選択するには、er_print また は
ア ナ ライザにそのパス名を明示的に指定します。指定するパスに
は、親の実験名と親の実験ディレクトリ内の派生プロセスの実験名
が含まれている必要があります。
たとえば、実験 test.1.er の 3 番目のフォーク用のデータを見る
場合は、次のように入力します。
er_print test.1.er/_f3.er
analyzer test.1.er/_f3.er
派生の実験の明示的な名前を使って、実験グループファイルを作成
することができます。
アナライザで派生プロセスを確認するには、親の実験を読み込み、
「表示」メニューから「データをフィルタ」を選択します。アナラ
イザが、親の実験だけ選択した状態で実験のリストを表示します。
親の実験を選択解除して、確認したい派生の実験を選択します。
Java プロファイリング
Java プロファイリングでは、ユーザーの .class ま た は .jar
ファ イルを実行する JVM マシンでパフォーマンス実験の収集が行
われます。また、可能であれば、Java モデル、マシンモデル内 で
呼び出しスタックの収集が行われます。
データは、表示モードを「user」、「expert」、「machine」の い
ず れかに設定して表示することができます。user モードでは、各
メソッドの名前とともに、インタプリタ形式と HotSpot コンパ イ
ル形式の両方メソッドを一体にしたデータが表示され、非ユーザー
Java スレッドのデータは抑止されます。expert モー ド で は、
HotSpot コンパイル形式のメソッドとインタプリタ形式のメソッド
が分離され、非ユーザーJava スレッドは抑止されません。machine
モードでは、インタプリタ形式の Java メソッドのデータが、解釈
を実行している JVM マシンを背景に表示され、Java HotSpot 仮想
マシンでコンパイルされたメソッドのデータは、メソッド名ごとに
報告されます。すべてのスレッドが表示されます。Java ター ゲッ
ト によって OpenMP 以外の C、C++、Fortran コードのどれが呼び
出されたかに関係なく、3 つの表示モードのどれでも、データは通
常 の方法で報告されます。そうしたコードは、Java ネイティブメ
ソッドに対応しています。アナライザおよび er_print ユーティリ
ティーでは、user、expert、machine 表示モードを切り替えること
ができます。デフォルトは user です。アナライザの画面上では、
user、 expert、 machine は、それぞれ「ユーザー」、「上級」、
「マシン」と表示されます。
時間ベースのプロファイリングとハードウェアカウンタオーバーフ
ロー プ ロファイリングがサポートされています。同期トレースで
は、Java モニター呼び出しと、ネイティブコードからの同期呼 び
出しのデータのみ収集されます。JVM 内の内部同期呼び出しに関す
るデータは収集されません。
Java に関するヒープトレースはサポートされていないため、指 定
すると、エラーになります。
引数リストに java というターゲット名がある場合、collect は、
JDK_HOME、JAVA_PATH 環境変数の順に java ターゲットへのパスが
設定されていないか調べます。これらの環境変数のいずれかが設定
さ れている場合、生成されるターゲットが ELF 実行可能ファイル
かどうかが確認されます。どちらも設定されていない場合は、col-
lect はエラーになり、使用した環境変数と試したフルパス名を示
します。
どちらの環境変数も設定されていない場合、collect コマンドは、
こ のリリースとともに、Java[TM] 2 Platform, Standard Edition
がインストールされているデフォルトのパスを使用します。インス
トールされていない場合は、ユーザーの PATH に設定されている場
所になります。
Java プロファイリングには、Java[TM] 2 SDK の バー ジョ ン
1.5.0_03 以 降 が必要です。これより前のバージョン (古くても
Java[TM] 2 SDK 1.4.2_02 までのバージョン) にも機能するものが
ありますが、サポートされていません。
OpenMP プロファイリング
OpenMP プログラムに関するデータ収集では、Java プログラムのと
きと同じで、3 つの表示モードのどれでも表示可能なデータが収集
されます。user モードと expert モードの表示方法はまったく 同
じです。スレーブスレッドは、マスタースレッドから実際にフォー
クし、呼び出しスタックがマスタースレッドに対応しているかのよ
う に表示されます。呼び出しスタック内の、OpenMP 実行時コード
(libmtsk.so) から生じたフレームは抑止されます。machine モー
ドの場合は、実際のネイティブスタックが表示されます。
user モードでは、実行時ライブラリがいくつかの状態のどれか に
なるたびに、さまざまな疑似関数が呼び出しスタックのリーフ関数
として導入されます。そうした関数として は、 <OMP-overhead>、
<OMP-idle>、 <OMP-reduction>、 <OMP-implicit_barrier>、<OMP-
explicit_barrier>、 <OMP-lock_wait>、 <OMP-
critical_section_wait>、および <OMP-ordered_section_wait> が
あります。
時間プロファイル実験のデータには、OMP Work および OMP Wait
と いう 2 つの時間プロファイルメトリックがさらに追加されてい
ます。OMP Work は、OpenMP 実行時コードによってプロセスが仕事
を行なっているとみなされた場合にカウントされます。これには、
プロセスが User-CPU 時間を消費している時間が含まれま す が、
System-CPU 時間、ページフォルト待ち時間、および CPU 待ち時間
(etc.) が含まれることもあります。このため、 OpenMP Work は
User-CPU 時 間を超えることがあります。OpenMP 実行時コードに
よってプロセスが待ち状態にあるとみなされると、OpenMP Wait は
累 積されます。これには、ビジー待ち (スピン待ち) の User-CPU
時間が含まれることがありますが、スリープ待ちの Other-Wait 時
間も含まれます。
デフォルトでは、包括的メトリックが表示され、排他的メトリック
は 表示されません。これらの 2 つのメトリックの合計が、総 LWP
時間メトリックに等しくなります。これらのメトリックは、すべて
の時間およびハードウェアカウンタ実験で追加されます。
データ領域プロファイリング
データ領域プロファイルはキャッシュミスなどのメモリー関係のイ
ベントの報告データをまとめたもので、メモリー関係のイベントが
発生する命令だけではなく、イベントを発生させるデータオブジェ
クト参照についても報告します。データ領域プロファイリングは、
Linux OSおよび x86 Solaris システムでは使用できません。
データ領域プロファイリングが行えるようにするには、ターゲット
が C、C++、または Fortran のいずれかで作成されていて、前述の
ように、-xhwcprof -xdebugformat=dwarf -g フラグを指 定 し て
SPARC アーキテクチャー向けにコンパイルされている必要がありま
す。また、収集データがハードウェアカウンタプロファイルで、カ
ウ ンタ名の前にオプションの + を付加する必要があります。すべ
てではなくても、少なくとも 1 つのメモリー関係のカウンタに オ
プ ショ ンの+ 付加された場合は、+ のないカウンタにによって、
(Dataspace data not requested during data collection) という
サブタイプで、<Unknown> データオブジェクトに対するデータ領域
データが報告されます。
データが収集されると、er_print ユーティリティーで は、 メ モ
リー オ ブ ジェ ク ト に関係するさまざまなコマンドのほかに、
data_objects、data_single、および data_layout という 3 つ の
追 加 コマンドが使用できるようになります。詳細は er_print(1)
のマニュアルページを参照してください。
また、アナライザには、メモリーオブジェクトに関係する一群のタ
ブのほかに、データ領域プロファイリングに関係する「データオブ
ジェクト」および「データレイアウト」という 2 つのタブも追 加
さ れました。詳細は analyzer(1) のマニュアルページを参照して
ください。
時間ベースのデータ領域プロファイリングは、メモリーベースのカ
ウンタでハードウェアカウンタプロファイリングをサポートしてい
ないマシンでのみ使用するようにしてください。このため に は、
ハードウェアカウンタプロファイリングに対するのと同じコンパイ
ルフラグを使用します。前述したように、データの解釈には注意し
てください。
MPI を指定した collect の使用
MPI で collect コマンドを使用することができます。このため に
は 単に、MPI ジョブを開始するコマンド行で collect コマンドと
その引数の前にターゲットとその引数を指定します。たと え ば、
SMP マシン上での、
% mprun -np 16 a.out 3 5
は、次のものに置き換えることができます。
% mprun -np 16 collect -m on -d /tmp/mydirectory -g
run1.erg a.out 3 5
このコマンドは、16 個の MPI プロセスのそれぞれに MPI ト レー
ス 実験を実行し、そのすべての実験を 1 つのグループとして、指
定されたディレクトリに収集します。上記の -o オプションで説明
し ているように、個々の実験には MPI ランクの名前が付けられま
す。上述したように実験には時間ベースのプロファイイングデータ
(デフォルトで有効) と MPI トレースデータが含まれます。
クラスタでは、/tmp などのローカルファイルシステムが 1 つ の
ノードの専用であることがあります。ノード専用のファイルシステ
ムで実験を収集する場合は、実験が完了したあと、グローバルに可
視のファイルシステムにそれら実験を集めて、その新しい場所に合
わせてグループファイルを編集することを推奨します。
PPGSZ を指定した collect の使用
ppgsz で collect コマンドを使用することができます。このた め
に は、ppgsz コマンドで collect コマンドを実行し、-F on フラ
グを指定します。親の実験は ppgsz 実行可能ファイル上にあ り、
無関係です。パスに 32 ビット版の ppgsz があり、64 ビットプロ
セス対応のシステムで実験を実行する場合、collect コマンドが最
初 に 行 う ことは、その 64 ビット版に exec 関数を実行して、
_x1.er を作成することです。この実行可能ファイル が フォー ク
し、 _x1_f1.erが作成されます。派生プロセスは、パス上の最初の
ディレクトリ、次に 2 つ目のディレクトリというように、exec 関
数 の 1 つの実行が成功するまで、指定された名前のターゲットに
exec 関数の実行を試みます。たとえば 3 回目の試みが成功した場
合、 最 初 の 2 つ の 派 生実験にはそれぞれ _x1_f1_x1.er、
_x1_f1_x2.er という名前が付けられ、両者は完全に空です。 ター
ゲットに対する実験は、実行が成功した exec (この例では 3 番目
) から得られたもので、この実験は _x1_f1_x3.er という名前で、
親 の 実 験 の 下 に 格 納 さ れ ま す。 こ の 実 験 は、
test.1.er/_x1_f1_x3.er でアナライザまたは er_print ユー ティ
リティーを呼び出すことによって直接処理できます。
上記の例と同じパスプロパティーの設定と仮定して、最初に実行さ
れ た プ ロセスが 64 ビット ppgsz であるか、または 32 ビット
ppgsz が 32 ビットカーネルで呼び出された場合、実際のターゲッ
ト に exec を実行する fork の派生のデータは _f1.er 内に存在
し、実際のターゲットの実験は _f1_x3.er にあります。
上記の「派生プロセスのフォロー」の項を参照してください。詳細
は、後述の「ハードウェアカウンタのオーバーフローのプロファイ
リング」を参照してください。
collect コマンドは、共有ライブラリ libcollector.so を ター
ゲットのアドレス空間 (LD_PRELOAD) に挿入することで操作可能に
なります。また、2 つ目の共有ライブラリ collaudit.so を使用す
ることで、実行時リンカーの監査インタフェース (LD_AUDIT) と共
に使用する共有オブジェクトを記録できます。これらの共有ライブ
ラリにより、実験を構成するファイルを作成します。
collect を setuid または setgid である実行ファイル上で起動し
た 場合、または、setuid または setgid となる派生プロセスを作
成する実行ファイル上で起動した場合、問題が発生することがあり
ます。実験を実行するユーザーが root でない場合、収集は失敗し
ます。これは、共有ライブラリが信頼できるディレクトリにインス
トー ル されていないためです。この問題を回避するには、実験を
root ユーザーで実行します。
また、collect コマンドを実行するユーザーに対する umask は、
そのユーザーと、exec されるプログラムの setuid/setgid 属性に
よって設定されているすべてのユーザーまたはグループ、さ ら に
は、 プ ログラムが自身を設定しているすべてのユーザーまたはグ
ループに対して書き込みアクセス権が許可されるように設定 し ま
す。マスクが正しく設定されていない場合、一部ファイルが実験に
書き込まれず、実験の処理ができなくなることがあります。 ロ グ
ファイルを書き込める場合は、ユーザーが実験を処理しようとした
ときにエラーが表示されます。
ターゲットそのものが UID または GID を設定するためのシステム
コー ルを行うか、その umask を変更してフォークするか、ほかの
プロセスに exec を実行した場合、あるいは crle を使用して、実
行時リンカーによる共有オブジェクトの検索方法を設定していた場
合は、そのほかの問題が発生する可能性があります。
収集されるデータ
プロファイリングデータ、トレースデータ、標本収集データ の 3
種類のデータが収集されます。プロファイリングとトレースで記録
されるデータパケットには、各 LWP の呼び出しスタック、LWP、ス
レッド、CPU ID、およびイベント固有のデータが含まれます。標本
収集で記録されるデータパケットは、実行統計などのグロー バ ル
データで、プログラム固有のデータやイベント固有のデータは含ま
れません。すべてのデータパケットには時刻表示が含まれます。
時間ベースのプロファイリング
時間ベースのプロファイリングで記録されるイベント固有 の
デー タは、各アカウンティングマイクロステートのカウント
配列です。このマイクロステート配列は、指定された周波 数
で 自動的に増分し、プロファイリングシグナルが処理される
とコレクタにより記録されます。
時間ベースのプロファイリングは、1 つの周波数範囲で実 行
で きます。この周波数範囲は、プロファイリングタイマーの
クロック分解能の倍数でなければなりません。高分解能プ ロ
ファ イリングをサポートしない OS を持つマシンで高分解能
プロファイリングを設定しようとした場合には、 警 告 メッ
セー ジが返され、サポート可能な最も高い分解能値が使用さ
れます。同様に、カスタム設定がそのシステムでサポート さ
れる分解能値の倍数でない場合には、その値に最も近い 0 以
外の倍数に丸められ、警告メッセージが出力されます。
時間ベースのプロファイリングデータは、次のメトリック に
変換されます。
ユーザー CPU 時間
時計時間
LWP 合計時間
システム CPU 時間
CPU 待ち時間
ユーザーロック時間
テキストページフォルト時間
データページフォルト時間
そのほかの待ち時間
マルチスレッドアプリケーションの実験では、時計時間を 除
くすべての時間は、プロセス内のすべての LWP にわたって合
計されます。時計時間は、LWP 1 のすべての状態において 消
費 された時間です。LWP 合計時間は、実際の経過時間にプロ
セス内の LWP の平均数を乗じたものです。
時間ベースのデータ領域プロファイリングが指定された場 合
は、追加メトリック
Max. Mem Stalls (最大メモリーストール)
が提供されます。
ハードウェアカウンタのオーバーフローのプロファイリング
ハードウェアカウンタのオーバーフローのプロファイリン グ
は、 オーバーフローシグナルが処理されたときにハードウェ
アカウンタによりカウントされたイベントの数を記 録 し ま
す。Linux OS が動作するシステムでも、この種のプロファイ
リングが使用できるようになりました。ただし、そのため に
は、 Perfctr パッチがインストールされている必要がありま
す。
ハードウェアカウンタのオーバーフローのプロファイリン グ
は、 オーバーフロープロファイリングをサポートし、ハード
ウェアカウンタ共用ライブラリ libcpc.so(3) を含むシス テ
ム で 実 行 可 能です。Solaris 8 より新しいバージョンの
Solaris を使用する必要があります。 UltraSPARC[R] コ ン
ピュータの場合は、UltraSPARC III より新しいバージョンの
ハードウェアを使用する必要があります。オーバーフロー の
プ ロファイリングをサポートしていないコンピュータでハー
ドウェアカウンタのオーバーフローのプロファイリングを 選
択しようとすると、エラーになります。
使用できるカウンタは、個々の CPU プロセッサとオ ペ レー
ティングシステムによって異なります。引数を付けずに col-
lect コマンドを実行すると、カウンタ名を含む使用法のメッ
セー ジが表示されます。既知 (well-known) と見なされたカ
ウンタが一覧の先頭に表示され、そのあとに raw ハードウェ
アカウンタの一覧が続きます。
出力行は、次に示すような書式で表示されます。
プロファイリングに使用できる既知の H/W カウンタ:
cycles[/{0|1}],9999991 ('CPU サイクル', Cycle_cnt の別名; CPU サイクル)
insts[/{0|1}],9999991 ('命令の実行', Instr_cnt の別名; イベント)
dcrm[/1],100003 ('D$ 読み取り失敗', DC_rd_miss の別名; ロード イベント)
...
プロファイリングに使用できる raw H/W カウンタ:
Cycle_cnt[/{0|1}],1000003 (CPU サイクル)
Instr_cnt[/{0|1}],1000003 (イベント)
DC_rd[/0],1000003 (ロード イベント)
SI_snoop[/0],1000003 (非プログラム関連 イベント)
...
既知のカウンタ出力先頭行の最初のフィールド、 「cycles」
は、 -h counter... 引数で使用可能な既知のカウンタ名を示
します。このあとに、そのカウンタに使用可能なレジスタ の
指定が続きます。次のフィールドの「9999991」は、そのカウ
ンタのデフォルトのオーバーフロー値です。括弧に囲まれ た
次 のフィールド、「CPU サイクル」はメトリック名で、その
あとが raw ハードウェアカウンタ名です。最後のフィールド
の 「CPU サイクル」は、カウントの単位の種類を示します。
この種の情報は、最大 2 つの単語で表されることがあ り ま
す。種類情報の 2 つ目の単語 (単語 1 つの場合はその単語)
は、「CPU サイクル」か「イベント」のいずれかです。カ ウ
ン タを使用して、時間ベースのメトリックを提供できる場合
は CPU サイクル、そうでない場合はイベントになります。
上記の既知のカウンタ出力の 2 行目の最後は「CPU サ イ ク
ル」 ではなく「イベント」で、イベントをカウント可能であ
ることを示しています。時間に変換することはできません。
上記の 3 行目の最後は、2 つの単語からなる 種 類 情 報、
「ロー ドイベント」です。種類情報の最初の単語は、「ロー
ド」か「ストア」、「ロード-ストア」、「非プログラ ム 関
連」 のいずれかの値をとることができます。これらの種類値
のうちの最初の 3 つは、カウンタがメモリー関係であること
を 示し、 collect -h コマンドで使用する場合は、カウン
タ名の前に正号 (+) を付けることができます。 「+」 符 号
は、 そのカウンタでオーバーフローイベントを発生させた命
令および仮想アドレスを正確に検出するようにというデー タ
収集要求を示します。
値「非プログラム関連」は、ほかのプログラムによって開 始
さ れた、CPU 間のキャッシュスヌープなどのイベントをカウ
ンタで収集する指定です。プロファイリングにカウンタを 使
用 す る と警告が生成され、プロファイリングで呼び出しス
タッ ク は 記 録 さ れ ま せ ん。 た だ し、
「collector_not_program_related」という疑似関数に費やさ
れた時間が示されます。スレッド ID と LWP ID が記録さ れ
ますが、意味はありません。
RAW ハードウェアカウンタリストに含まれる情報は、 「well
known」 カ ウンタリストのサブセットです。すべての行に、
cputrack(1) が使用するとおりの内部カウンタ名とそのカ ウ
ン タ を 使用可能なレジスタ番号、デフォルトのオーバーフ
ロー値、カウンタの単位 (CPU サイクルかイベント) が示 さ
れます。
EXAMPLES:
例 1:上記の出力例に示された既知のカウンタ情報を使 用 し
て、次のコマンドを使用すると、
collect -h cycles/0,hi,+dcrm,9999
レジスタ 0 での CPU サイクルのプロファイリングが有効 に
な り ま す。 値 「hi」は、デフォルトの標本収集レートの
9999991 より約 10 倍速いレートを 有 効 に し ま す。 値
「dcrm」は、レジスタ 1 での D$ 読み取りミスのプロファイ
リングを有効にし、先行する「+」によって dcrm に関 す る
デー タ 領 域 の プ ロ ファイリングも有効になります。値
「9999」は、デフォルト値の 100003回の読み取りミスではな
く、9999 回の読み取りミスおきに標本収集を行う設定です。
例 2:
AMD Opteron マシンで引数を付けずに collect を実行 す る
と、次に示すような raw ハードウェアカウンタ出力が生成さ
れます。
FP_dispatched_fpu_ops[/{0|1|2|3}],1000003 (events)
FP_cycles_no_fpu_ops_retired[/{0|1|2|3}],1000003 (CPU-cycles)
...
上記の raw ハードウェアカウンタ出力を使用して、次のコマ
ンドを使用すると、
collect -h FP_dispatched_fpu_ops~umask=0x3/2,10007
10007 個のイベントおきに 1回収集の間隔で浮動小数点加 算
お よび乗算演算の追跡が有効になります (有効な属性値の詳
細は、プロセッサのマニュアルを参照 )。"/2" は、データの
収 集 にハードウェアのレジスタ 2 を使用するよう指示しま
す。
同期遅延トレース
同期遅延トレースは、呼び出しの実時間遅延が指定された し
き い値を超える、さまざまなスレッド同期ルーチンへの呼び
出しをすべて記録します。データパケットには、同期ルー チ
ン へのエントリと終了の時刻表示、リクエストが発行された
時点でのスレッド ID と LWP ID が含まれます (同じス レッ
ドからの同期リクエストでも、ある LWP 上で実行されるもの
が別の LWP で完了することもあるため)。
同期遅延トレースデータは、次のメトリックに変換 さ れ ま
す。
同期遅延イベント
同期待ち時間
ヒープトレース
ヒープトレー ス は、 malloc、 free、 realloc、 お よ び
memalign への呼び出しを、要求されたブロックのサイズ、そ
のアドレス、および realloc については以前のアドレスとと
もにすべて記録します。
ヒープトレースデータは、次のメトリックに変換されます。
リーク
リークされたバイト
割り当て
割り当てられたバイト
リークは、解放されない割り当てとして定義されます。長 さ
ゼ ロのブロックが割り当てられると、ゼロバイトを割り当て
られた割り当てとしてカウントされます。長さゼロのブ ロッ
ク が解放されない場合、ゼロバイトがリークされたリークと
してカウントされます。
Java[TM] で記述されたアプリケーションでは、リーク は ガ
ベー ジコレクトされていない割り当てとして定義されます。
このようなアプリケーションに関するヒープのプロファイ リ
ン グは廃止される予定で、将来のリリースでサポートされな
くなります。
ヒープトレースを行うと実験が非常に大きくなり、処理に 時
間がかかる可能性があります。
MPI トレース
MPI トレースは、完了までにかなりの時間を要する関数に 対
す る MPI ライブラリの呼び出しを記録します。Linux OS が
稼働するシステムでは、MPI のトレースは行えません。
MPI ライブラリの次の関数がトレースされます。
MPI_Allgather
MPI_Allgatherv
MPI_Allreduce
MPI_Alltoall
MPI_Alltoallv
MPI_Barrier
MPI_Bcast
MPI_Bsend
MPI_Gather
MPI_Gatherv
MPI_Irecv
MPI_Isend
MPI_Recv
MPI_Reduce
MPI_Reduce_scatter
MPI_Rsend
MPI_Scan
MPI_Scatter
MPI_Scatterv
MPI_Send
MPI_Sendrecv
MPI_Sendrecv_replace
MPI_Ssend
MPI_Wait
MPI_Waitall
MPI_Waitany
MPI_Waitsome
MPI_Win_fence
MPI_Win_lock
MPI トレースデータは、次のメトリックに変換されます。
MPI 時間
MPI 送信
MPI 送信バイト
MPI 受信
MPI 受信バイト
その他の MPI 呼び出し
MPI 時間とは、MPI 関数で消費される LWP 合計時間のことで
す。
MPI 受信バイトメトリックは、ブロック化呼び出しには実 際
の バイト数を使用しますが、非ブロック化呼び出しにはバッ
ファサイズを使用します。gather、scatter、reduce など の
集 合操作について計算されるメトリックには、これらの操作
の最大可能値が設定されています。集合操作の最適 化 の た
め、値の削減は行われません。
非ブロック受信用のバッファが実際の送信サイズよりもか な
り 大きい場合、MPI 受信バイトは実際よりもかなり大きく報
告される可能性があることに注意してください。
カウントデータ
カウントデータは、実行可能ファイルに計測機構を 組 み 込
み、 各命令が実行された回数をカウントすることによって記
録されます。また、関数内の最初の命令が実行された回数 も
カウントし、これを関数実行カウントと呼びます。
カウントデータは次のメトリックに変換されます。
Bit Func Count (ビット関数カウント)
Bit Inst Exec (ビット命令実行)
Bit Inst Annul (ビット命令無効)
データ競合検出データ
データ競合検出データは、競合を構成するアクセスイベン ト
のペアで構成されます。2 つのアクセスイベントが 1 つの競
合となり、2 つのアクセスの呼び出しスタックが同じ競合 が
1 つの競合グループにマージされます。
データ競合検出データは次のメトリックに変換されます。
競合アクセス
デッドロック検出データ
デッドロック検出データは、競合するロックを持つスレッ ド
のペアで構成されます。
デッドロック検出データは次のメトリックに変換されます。
デッドロック
標本収集とグローバルデータ
標本収集とは、実行の時間軸に沿ってマーカーを生成する プ
ロ セスです。各標本収集ポイントでは、実行統計が記録され
ます。標本収集ポイントで記録されたデータはすべて、プ ロ
グ ラムに対してグローバルなものとなり、関数レベルのメト
リックにはマップされません。
標本は常に、プロセスの開始時と終了時に収集されます。 デ
フォ ルトで、またはゼロでない -S 引数が指定されると、標
本は指定された間隔で定期的に収集されます。また、libcol-
lector(3) の API を使用して収集することもできます。
各標本収集ポイントで記録されたデータは、カーネルから 送
ら れるマイクロステートアカウンティング情報とそのカーネ
ル内で保持されるさまざまな統計情報です。
制約事項
コレクタはいくつかのシグナル処理ルーチンに割り込んで、 時 間
ベー ス のプロファイリングでは SIGPROF、ハードウェアカウンタ
オーバーフロープロファイリングでは SIGEMT (Solaris の場 合 )
ま た は SIGIO (Linux の場合) の使用がターゲットプログラムに
よって中断されないようにします。ターゲットプログラムがシグナ
ルハンドラをインストールすると、コレクタライブラリは独自のシ
グナルハンドラを再インストールします。コレクタのシグナルハン
ドラは、フラグを設定して、システムコールが妨げられることなく
シグナルを送信できるようにします。この設定により、ターゲット
プログラムの動作が異なる可能性があります。
時間ベースのプロファイリングが有効な場合には、コレク タ は、
setitimer(2) に割り込み処理をして、プロファイリングタイマー
をターゲットプログラムに対して使用不可にします。
コレクタは、ハードウェアカウンタライブラリ libcpc.so 内の 関
数に割り込み処理をして、コレクタがパフォーマンスデータを収集
しているときは、ハードウェアカウンタをアプリケーションに対し
て 使用不可にします。割り込み処理された関数は、-1 の値を返し
ます。
Linux OS システムでは、データ領域プロファイリングは使用で き
ません。
このリリースの場合、Linux OS が稼働するシステムでは、信頼 で
きる定期標本の収集データは得られません。
このリリースでは、RedHat Enterprise Linux OS が動作するシ ス
テムでマルチスレッドアプリケーションをプロファイリングしたと
きに、大幅なデータの食い違いが観察されています。
ハードウェアオーバーフローカウンタプロファイリングは、 cpus-
tat を実行中のシステムでは実行できません。これは、cpustat が
カウンタを制御しており、ユーザープロセスがカウンタを使用でき
ないためです。
Java プロファイリングには、Java[TM] 2 SDK version 1.5.0_03
(1.5.0 を 1.5.0_03 以 上 に 更 新 したものも可)、あるいは
Java[TM] 2 SDK version 1.6.0 (1.6.0 をそれ以降のバージョンに
更新したものも可) が必要です。
setuid を設定するために作成された派生プロセスや、動的にリ ン
クされない実行可能ファイルに対して実行された exec 関数で作成
された派生プロセスに関するデータは収集されません。さらに、そ
れ以降の派生プロセスは実験の破損や読み取れない実験の生成の原
因となる可能性があります。問題を回避するには、すべての派生プ
ロ セスが動的にリンクされ、setuid 属性を持たないようにする必
要があります。
vfork(2) を呼び出すアプリケーションは、これらの呼び 出 し が
fork1(2) の呼び出しに置き換えられます。
関連項目
analyzer(1)、 collector(1)、 dbx(1)、 er_archive(1)、
er_cp(1)、 er_export(1)、 er_mv(1)、 er_print(1)、
er_rm(1)、 tha(1)、 libcollector(3)、およびマニュアル 『プロ
グラムのパフォーマンス解析』