COLLECT(1)

名前
collect - パフォーマンスデータの収集に使用するコマンド

形式
collect collect-arguments target target-arguments

説明

collect コマンドは、プロファイルまたはトレース技術およびプロセスのグローバルデータを使用して、ターゲットプロセスを実行し、パフォーマンスデータを記録します。データは、GUI プログラム (analyzer) またはコマンド行プログラム (er_print) を使用してチェックすることができます。collect コマンドによって実行されるデータ収集ソフトウェアをここではコレクタと呼びます。

注: GUI プログラムの実行にはライセンスが必要です。

collect コマンドを 1 回実行して収集されるデータを実験と呼びます。実験は、ファイルシステムにディレクトリとして表示されます。このディレクトリにはさまざまな種類のファイルが含まれます。

target は、パフォーマンスデータを収集したい実行可能ファイルあるいは Java(TM) .jar ファイルまたは Java .class ファイルのパス名です (Java プロファイルの詳細については、以下の「Java プロファイル」の項を参照してください)。collect コマンドのターゲットとなる実行可能ファイルは、どの最適化レベルでコンパイルされたものでもかまいませんが、動的リンクを使用したものでなければなりません。プログラムが静的にリンクされている場合は、collect コマンドはエラーメッセージを出力します。analyzer または er_print を使用して注釈付きソースを表示するには、ターゲットを -g フラグ付きでコンパイルし、ストリップしないでください。

collect コマンドは、次の方法を用いてターゲットを検索します。
• ターゲット名を持つ、実行可能とマークされたファイルが存在する場合は、ターゲットマシンで実行可能な ELF 実行可能ファイルかどうかが確認されます。ファイルが有効な ELF 実行可能ファイルでない場合は、collect コマンドは失敗します。
• ターゲット名を持つファイルが存在するが、実行可能ファイルではない場合、Java(TM) jar ファイルか class ファイルかがチェックされます。そのいずれかであれば、必要なフラグとともに java のターゲット名が挿入され、データは JVM(TM) マシンに収集されます (「Java 仮想マシン」および「JVM」の語は、Java(TM) プラットフォーム用仮想マシンを指します)。
• ターゲット名を持つファイルが存在しない場合、実行可能ファイルを探してユーザーのパスが検索されます。実行可能ファイルが見つかると、上記の確認が行われます
• 現在の名前のファイルが見つからない場合、その名前に文字列 .class の付加された名前を持つファイルが検索されます。これが見つかると、上記のように該当するフラグとともに java のターゲット名が挿入されます。
• 以上の手順でターゲットが見つからない場合、コマンドは失敗となります。

引数
引数なしで実行された場合は、collect から使用方法を示すメッセージが出力されます。このメッセージには、デフォルトの実験構成と、プロファイルに使用できるハードウェアカウンタの名前も含まれています。

  データ指定

-p option
    クロックに基づいたプロファイルデータ収集を行います。option には次の値を指定できます。

    値   意味

    off クロックに基づくプロファイルは行われません。

    on  デフォルトの約 10 ミリ秒のプロファイル間隔でクロックに基づくプロファイルが行われます。

    lo[w]
        約 100 ミリ秒の低分解能プロファイル間隔でクロックに基づくプロファイルが行われます。

    hi[gh]
        約 1 ミリ秒の高分解能プロファイル間隔でクロックに基づくプロファイルが行われます。

    n   n のプロファイル間隔でクロックに基づくプロファイルが行われます。n には、整数または浮動小数点数を指定し、接尾辞「u」を使用してマイクロ秒、接尾辞「m」を使用してミリ秒を指定することができます。接尾辞を省略すると、ミリ秒を指定したと見なされます。

        プロファイル間隔の下限値よりも小さな値を指定すると、下限値がプロファイル間隔として設定されます。プロファイル間隔の分解能の倍数でない値を指定すると、切り捨てが行われ、もっとも近い倍数値に設定されます。プロファイル間隔の上限値を超える値を指定すると、エラーが報告されます。負の値や 0 (ゼロ) を指定した場合も、エラーが報告されます。collect を引数を指定せずに起動すると、サポートされているプロファイル間隔の範囲が表示されます。

-p off 引数が明示的に指定されず、ハードウェアカウンタプロファイルも指定されない場合は、クロックに基づくプロファイルが行われます。

-h counter[,value[,counter2[,value2]]]
    ハードウェアカウンタのオーバーフローのプロファイルデータを収集します。counter に指定する名前は、標準のカウンタ名でも、cputrack(1) で使用される内部名でもかまいません。標準名と内部名を一覧表示するには、コマンド行に collect を入力します。名前が内部名で、末尾がスラッシュ (/) と 1 桁の数字 (0 または 1) である場合は、その数字によって特定されるイベントレジスタが使用されます。そうでない場合は、その名前のカウンタをサポートする任意のイベントレジスタが使用されます。

    オーバーフロー値は、どの時点でカウンタがオーバーフローして、オーバーフローイベントが記録されるかを示す、カウントされるイベントの数です。以下のいずれかの値に設定できます。

    値   意味

    on または NULL 文字列
        デフォルトのオーバーフロー値が使用されます。

    hi[gh]
        高分解能オーバーフロー値が使用されます。高分解能を表す値 h も、互換性のためにサポートされています。

    lo[w]
        低分解能オーバーフロー値が使用されます。

    n   n のオーバーフロー値が使用されます。n には正の値を指定する必要があります。

任意の 2 番目のカウンタおよび 2 番目のオーバーフロー値を指定する場合は、最初のカウンタのオーバーフロー値を上記のいずれかの値に指定する必要があります。指定された 2 つの名前付きカウンタは、異なるイベントレジスタに置かれる必要があります。

実験には、ハードウェアカウンタプロファイルとクロックに基づくプロファイルを両方指定できます。ハードウェアカウンタプロファイルが指定され、クロックに基づくプロファイルが明示的に指定されない場合、クロックに基づくプロファイルは行われません。

ロードまたはストアを参照するカウンタの場合、カウンタの名前がプラス (+) 記号で始まる場合には、コレクタはオーバーフローの原因となった命令の真の PC と参照された仮想アドレスを確認します。

-s option
    同期トレースデータを収集します。トレースイベントの最小遅延しきい値は、option を使用して設定します。option には次の値を指定できます。

    値   意味

    on  同期遅延トレースが行われ、実行時に決定される測定されたしきい値が設定されます。

    calibrate
        on と同じ

    off 同期遅延トレースは行われません。

    n   n マイクロ秒のしきい値で同期遅延トレースが行われます。n がゼロの場合、すべてのイベントがトレースされます。

    all 同期遅延トレースが行われ、すべての同期イベントがトレースされます。

デフォルトでは、同期遅延トレースは行われません。

同期イベントは Java モニター用に記録されますが、JVM マシン内でのネイティブの同期用には記録されません。

-H option
    ヒープトレースデータを収集します。option には以下の値を指定できます。

    値   意味

    on  記憶域割り当て要求がトレースされます。

    off 記憶域割り当て要求のトレースは行われません。

デフォルトでは、ヒープトレースは行われません。

ヒープトレースイベントは Java の記憶域割り当てとネイティブ呼び出しのために記録されます。

特に Java で記述されたアプリケーションの場合、ヒープトレースを行うと非常に大きな実験が生成される可能性があることに注意してください。このような実験の読み込みとブラウズは非常に時間がかかります。

-m option
    MPI トレースデータを収集します。option には以下の値を指定できます。

    値   意味

    on  MPI コールのトレースを行います。

    off MPI コールのトレースは行われません。

デフォルトでは、MPI トレースは行われません。

-S interval
    指定された間隔 (秒単位) で定期的に標本を収集します。 標本に記録されるデータはプロセスに関するデータで、特に時刻表示やカーネルの実行統計などが含まれます。 interval には次の値を指定できます。

    値   意味

    off 定期的な標本収集を行いません

    on  デフォルトの間隔 (1 秒) で定期的な標本収集を行います

    n   n (秒) の間隔で定期的な標本収集を行います。n には正の値を指定する必要があります。

デフォルトでは、定期的な標本収集が行われます。

データ指定引数が指定されない場合は、クロックに基づくプロファイルデータがデフォルトの分解能で収集されます。

クロックに基づくプロファイルが明示的に使用不可にされ、ハードウェアカウンタのオーバーフローのプロファイルもトレースも有効になっていない場合は、関数レベルのデータが収集できませんという警告が collect コマンドから出力されます。その場合でも、ターゲットは実行され、グローバルデータは収集されます。

  実験の制御

-L size
    記録されるプロファイルデータとトレースデータの量を size メガバイトに制限します。この制限は、すべてのプロファイルデータとトレースデータの合計に適用されますが、標本収集ポイントには適用されません。この制限は近似値にすぎず、超過してもかまいません。制限値に達すると、プロファイルデータとトレースデータは記録されなくなりますが、ターゲットプロセスが終了するまで、実験は開かれていて、サンプルを記録できます。size には次の値を指定できます。

    値   意味

    unlimited" または none"
        記録されるデータ量を制限しません

    n   記録されるデータ量を n メガバイトに制限します。 n には 0 (ゼロ) 以外の正の値を指定する必要があります。

記録されるデータ量のデフォルトの制限値は、2,000 メガバイトです。

-F option
    子孫プロセスのデータが記録されるか否かを制御します。option には以下の値を指定できます。

    値   意味

    on  すべての子孫プロセスに関する実験を記録します。

    off 子孫プロセスに関する実験を記録しません。

デフォルトでは、子孫プロセスのフォローは行われません。 以下の「子孫プロセスのフォロー」の項を参照してください。

-A option
    ターゲットプロセスによって使用されるロードオブジェクトを、記録された実験に保管またはコピーするかを制御します。option には次の値を指定できます。

    値   意味

    on  ロードオブジェクトを実験に保管します。

    off ロードオブジェクトを実験に保管しません。

    copy
        ロードオブジェクトを実験にコピーし、保管します。

実験を別のマシンにコピーしたり、別のマシンから読み取りたい場合には、-A copy と指定する必要があります。この場合、ソースファイルやオブジェクトファイルはコピーされないことに注意してください。実験をコピーするマシンでソースファイルやオブジェクトファイルにアクセスできるようにする必要があります。

-A のデフォルトの設定は on です。

-j option
    ターゲットが JVM マシンの場合、Java プロファイルを制御します。 option には以下の値を指定できます。

    値   意味

    on  JVM マシンのプロファイルデータを記録し、Java HotSpot(TM) 仮想マシンによるコンパイル方式を認識します。JVM マシンが 1.4.1 以降の場合、Java の呼び出しスタックも記録します。

    off Java プロファイルデータを記録しません。

以下の「Java プロファイル」の項を参照してください。

ターゲットが JVM マシンの場合、プロファイルデータを取得するには -j を使用する必要があります。JVM ソフトウェアのバージョンは 1.4 以降でなければなりません。Java プロファイルデータは、これより前の JVM ソフトウェアでは使用できません。ターゲットが class または jar ファイルの場合は、-j オプションは不要です。64 ビット JVM マシンを使用している場合は、そのパスをターゲットとして明示的に指定する必要があります。-j オプションが設定されても、ターゲットが JVM マシンではない場合は、ターゲットのデータは記録されません。collect コマンドにより、Java プロファイルに指定された 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 に設定されます。

    collect コマンドが MPI ジョブの実行に使用されるコマンドの 1 つから起動され、-o が指定されていない場合、名前に使用される n の値は、そのプロセスの MPI ランクを定義するのに使用される環境変数から取られます。それ以外の場合は、n は未使用の最小の整数に設定されます。

    stem.n.er 型で名前が指定されておらず、指定の名前が使用されている場合は、エラーメッセージが出力され、実験は実行されません。名前が stem.n.er 型であり、使用されている場合、実験は、使用されていない n の最初の有効な値に対応する名前で記録されます。名前が変更された場合、警告が出力されます。

-d directory_name
    実験をディレクトリ directory_name に保存します。ディレクトリが指定されなかった場合は、実験は現在の作業ディレクトレイに保存されます。

-g group_name
    実験を実験グループ group_name に追加します。group_name 文字列の末尾は .erg でなければなりません。そうでない場合はエラーが報告され、実験は実行されません。

  その他の引数

-n  dry run。ターゲットは実行されませんが、実行予定の実験のすべての詳細が出力されます。-v 引数がオンになります。

-R  パフォーマンスツール README のテキスト版が端末ウィンドウに表示されます。README が見つからない場合は、警告が出力されます。その他の引数の検査は行われず、その他の処理も行われません。

-V  現在のバージョンを出力します。その他の引数のチェックは行われず、その他の処理も行われません。

-v  現在のバージョンと、実行中のエクスペリメントに関する追加の詳細情報を出力します。

-x  デバッガをターゲットプロセスにアタッチさせるため、exec システムコールからの終了時にターゲットプロセスを停止させます。

    collect コマンドによりターゲットが停止した時点でデバッガをターゲットに接続させるには、プロセスの PID を決定し、デバッガを起動し、SIGPROF を (ハードウェアカウンタデータを収集する場合は SIGEMET も) 無視するようにデバッガを構成し、PID を使用してプロセスに接続します。プロセスはデバッガの制御の下で実行され、実験はコレクタにより記録されます。

子孫プロセスのフォロー
プロセスは、システムライブラリ関数を呼び出して子孫プロセスを作成できます。コレクタは、fork(2)、fork1(2)、fork(3F)、vfork(2)、および exec(2) ならびにその派生関数の呼び出しにより起動される子孫プロセスのデータを収集できます。vfork の呼び出しは内部で fork1 の呼び出しに置き換えられます。system(3C)、system(3F)、sh(3F)、popen(3C)、および類似の関数、ならびに関連する子孫プロセスの呼び出しはコレクタにより無視されます。引数 -F on が使用される場合、コレクタは各子孫プロセスの新規実験を親実験内に開きます。これらの新規実験には、次のようにその系統名が付けられます。子孫プロセスの実験名は、子孫プロセスを作成する実験の名前に下線、コード文字、および数字を追加して構成します。fork のコード文字は「f」、exec のコード文字は「x」です。数字は fork または exec のインデックス (成功かどうかにかかわらず) です。たとえば、初期プロセスの実験名が「test.1.er」である場合、その 3 番目の fork により作成される子プロセスの実験名は「test.1.er/_f3.er」になります。その子プロセスが新規イメージを実行する場合、対応する実験名は「test.1.er/_f3_x1.er」になります。

アナライザと er_print は、親実験の読み取り時に子孫プロセスの実験を自動的に読み取りますが、データ表示の際には子孫プロセスの実験は選択されません。

マルチスレッドアプリケーションのプロファイル
collect は、すべてのマルチスレッドアプリケーションで使用することができますが、Solaris 7 および 8 のデフォルトのスレッド (T1) はプロファイルの際にさまざまな問題の原因となります。LWP でスレッドがスケジュールされていない場合、T1 はプロファイル割り込みを破棄する可能性があります。この場合、全 LWP 時間が本当の LWP 時間よりも非常に短く報告される可能性があります。また、場合によっては、内部ライブラリ mutex へのセグメント違反アクセスを行い、アプリケーションがクラッシュする可能性があります。

Solaris 8 では、LD_LIBRARY_PATH の設定の先頭に /usr/lib/lwp を付加し、代替のスレッドライブラリ (T2) を使用することによって問題を回避することができます。Solaris 9 以降では、T2 がデフォルトのライブラリになっています。Solaris 7 では、回避策はありません。

コレクタは T1 の使用を検出し、実験に警告を挿入します。

Java プロファイル
Java プロファイルでは、ユーザーの .class または .jar ファイルを実行する JVM マシンでパフォーマンス実験の収集が行われます。また、可能であれば、Java モデル、マシンモデル内で呼び出しスタックの収集が行われます。Java モデルは、各メソッドの名前と、解釈され、HotSpot を使用してコンパイルされたメソッドのデータを表示します。マシンモデルは、解釈を行なった JVM マシンに対して、解釈された Java メソッドのデータを表示し、指定されたメソッドに関して、Java HotSpot 仮想マシンを使用してコンパイルしたメソッドのデータを報告します。どちらのモデルでも、Java ターゲットによって呼び出される C、C++、または Fortran のコードの通常の方法でデータが報告されます。これらのコードは、Java のネイティブメソッドに対応するものです。アナライザと er_print では、Java モデルとマシンモデルを切り替えることができます。デフォルトは Java モデルです。

クロックに基づくプロファイルとハードウェアカウンタプロファイルがサポートされています。同期トレースでは、Java モニター呼び出しとネイティブコードからの同期呼び出しのデータのみを収集します。JVM マシン内での内部同期呼び出しに関するデータは収集しません。ヒープトレースでは、Java 割り当て、ガーベジコレクション、ユーザーコードまたは JVM マシンから記憶域割り当てルーチンへのネイティブ呼び出しのデータを収集します。

collect コマンドによって java のターゲット名が引数リストに挿入されると、java ターゲットへのパスの環境変数が JDK_1_4_HOME、JDK_HOME、次に JAVA_PATH、最後にユーザーの PATH の順序でチェックされます。設定される最初のパスについて、結果のターゲットが ELF 実行可能ファイルかどうかが確認されます。ELF 実行可能ファイルでなければ、collect コマンドは失敗となり、使用された環境変数と試行されたフルパス名を示すエラーを出力します。

これらの環境変数が設定されない場合、collect は、ユーザーの PATH を使用して解決したターゲット名として java を使用します。

Java プロファイルは、Java[tm] 2 SDK のバージョン 1.4 以前ではサポートされません。1.4 以前のバージョンを使用して Java コードのプロファイルを試みると、プロファイルは失敗します。これらのバージョンの java 実行可能ファイルは ELF 実行可能ファイルではなくシェルスクリプトであり、Java プロファイルのサポートに必要な機能が使用できないためです。 マシンモデル内の Java プロファイルのデータは Java 2 SDK のバージョン 1.4.0 以降でのみ、Java モデル内のデータは Java 2 SDK のバージョン 1.4.1 以降でのみ使用できます。

MPI を指定した collect の使用

collect は、MPI ジョブを開始するコマンド行に collect とその引数の前にターゲットとその引数を指定するだけで、MPI を指定して使用できます。以下に例を示します。
% 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 トレース実験を実行し、すべての実験を指定のディレクトリにグループとして収集することができます。上記のように、各実験は、MPI ランクで指定されます。上記のように指定される実験には、デフォルトで実行されるクロックに基づくプロファイルデータと、MPI トレースデータが含まれます。

収集されるデータ
プロファイルデータ、トレースデータ、標本収集データの 3 種類のデータが収集されます。プロファイルとトレースで記録されるデータパケットには、各 LWP の呼び出しスタック、LWP、スレッド、CPU ID、およびイベント固有のデータが含まれます。標本収集で記録されるデータパケットは、実行統計などのグローバルデータで、プログラム固有のデータやイベント固有のデータは含まれません。すべてのデータパケットには時刻表示が含まれます。

クロックに基づいたプロファイル
    クロックに基づいたプロファイルで記録されるイベント固有のデータは、各アカウンティングマイクロステートのカウント配列です。このマイクロステート配列は、指定された周波数で自動的に増分し、プロファイルシグナルが処理されるとコレクタにより記録されます。

    クロックに基づくプロファイルは一定の範囲の頻度 (プロファイルタイマー用に使用されるクロック分解能の倍数である必要があります) で行うことができます。Solaris 7 環境と Solaris 8 のアップデートの一部では、システムクロックが使用されます。これらのシステムで高分解能間隔でプロファイルを行うには、マシン上のオペレーティングシステムが高分解能クロックルーチンで動作している必要があります。このルーチンを実行するには、次の行を /etc/system ファイルに設定してリブートしてください。

    set hires_tick=1

    高分解能プロファイルをサポートしない OS を持つマシンで高分解能プロファイルを設定しようとした場合には、警告メッセージが返され、サポート可能な最も高い分解能値が使用されます。同様に、カスタム設定がそのシステムでサポートされる分解能値の倍数でない場合には、その値に最も近い 0 以外の倍数に丸められ、警告メッセージが出力されます。

    クロックに基づくプロファイルデータは、以下のメトリックに変換されます。

    ユーザー CPU 時間
    時計時間
    LWP 合計時間
    システム CPU 時間
    CPU 待ち時間
    ユーザーロック時間
    テキストページフォルト時間
    データページフォルト時間
    そのほかの待ち時間

    マルチスレッドアプリケーションの実験では、時計時間を除くすべての時間は、プロセス内のすべての LWP にわたって合計されます。時計時間は、LWP 1 のすべての状態において消費された時間です。LWP 合計時間は、実際の経過時間にプロセス内の LWP の平均数を乗じたものです。

ハードウェアカウンタのオーバーフローのプロファイル
    ハードウェアカウンタのオーバーフローのプロファイルは、オーバーフローシグナルが処理されたときにハードウェアカウンタによりカウントされたイベントの数を記録します。

    ハードウェアカウンタのオーバーフローのプロファイルは、オーバーフロープロファイルをサポートし、ハードウェアカウンタ共用ライブラリ libcpc.so(3) を含むシステムで実行可能です。Solaris 8 以降の Solaris[tm] オペレーティング環境バージョンを使用してください。UltraSPARC[tm] コンピュータでは、UltraSPARC III 以降のハードウェアバージョンを使用してください。オーバーフローのプロファイルをサポートしていないコンピュータでハードウェアカウンタのオーバーフローのプロファイルを選択しようとすると、エラーになります。

    使用可能なカウンタは、CPU チップおよびオペレーティング環境によって異なります。使用可能なカウンタを調べるには、collect コマンドを引数なして実行してください。使用方法を示すメッセージが出力され、その中にカウンタ名も表示されます。最初に別名を持つカウンタが、それに続いてすべてのカウンタが一覧表示されます。

    別名を持つカウンタの出力行の書式は以下のとおりです。

    CPU サイクル (cycles = Cycle_cnt/*) 9999991 hi=1000003, lo=100000007 (CPU-cycles)
    命令の実行 (insts = Instr_cnt/*) 9999991  hi=1000003, lo=100000007 (Events)
    D$ 読み込み失敗 (dcrm = DC_rd_miss/1) 100003  hi=10007, lo=1000003 load (Events)

    最初の行で、最初のフィールド「CPU サイクル」はメトリック名を示します。2 番目のフィールド「cycles」は -h counter... の引数として使用できる別名を示します。3 番目のフィールド「Cycle_cnt/*」は、cputrack(1) で使用される内部名と、カウンタを使用できるレジスタの番号を示します。レジスタの番号は 0、1、* のいずれかです。* は、どちらのレジスタでもカウンタを使用できることを示します。 その次のフィールドはデフォルトのオーバーフロー間隔で、その次のフィールドはデフォルトの高分解能オーバーフロー間隔、最後のフィールドはデフォルトの低分解能オーバーフロー間隔です。 (CPU-cycles) は、カウンタは CPU-cycles の単位でカウントし、時間に変換することができることを示しています。2 行目の終わりにある (Events) は、カウンタはイベントをカウントし、時間に変換することができないことを示しています。3 行目のように、低分解能オーバーフロー間隔とカウンタの単位の間に、カウンタがロード、ストア、ロードまたはストアによって起動するか、プログラムに関係なく動作するかを示すフィールドが表示される場合があります。

    別名を持たないカウンタの出力行の書式は以下のとおりです。

    Cycle_cnt Events (reg. 0) 1000003 hi=100003, lo=9999991 (CPU-cycles)
    Instr_cnt Events (reg. 0) 1000003 hi=100003, lo=9999991 (Events)
    DC_rd Events (reg. 0) 1000003 hi=100003, lo=9999991 load (Events)

    この行で、最初のフィールド「Cycle_cnt/0」は、cputrack(1) で使用される内部名と、カウンタを使用できるレジスタの番号を示します。文字列「Cycle_cnt/0 events」は、このカウンタに対するメトリック名です。 次のフィールドでは、レジスタ番号が括弧内に表示されます。その次のフィールドはデフォルトのオーバーフロー間隔で、その次のフィールドはデフォルトの高分解能オーバーフロー間隔、その次のフィールドはデフォルトの低分解能オーバーフロー間隔です。最後のフィールドでは、カウンタの単位として CPU-cycles または Events が括弧内に表示されます。2 行目は、時間に変換することができないカウンタを示しています。3 行目のように、低分解能オーバーフロー間隔とカウンタの単位の間に、カウンタがロード、ストア、ロードまたはストアによって起動するか、プログラムに関係なく動作するかを示すフィールドが表示される場合があります。

    行の最後に「(CPU-cycles)」で示す、サイクルでカウントするカウンタの場合、報告されるメトリックはデフォルトで包括的メトリック時間と排他的メトリック時間に変換されますが、任意でイベントカウントとして表示することもできます。行の最後に「(Events)」で示す、イベントでカウントするカウンタの場合、報告されるメトリックは、包括的メトリックのイベントカウントと排他的メトリックのイベントカウントです。

    名前の後ろに「ロード」、「ストア」、「ロード-ストア」と表示されるメモリーオペレーションに関係するハードウェアカウンタのうち、名前の先頭に「+」記号が付くカウンタは、オーバーフローの原因となった命令や仮想アドレスを正確に特定するためのデータ収集を要求します。

    プログラムに関係なく動作するカウンタを使用してプロファイルを行うと警告が発生し、呼び出しスタックを記録するかわりに、疑似関数「collector_not_program_related」を使用して消費時間が表示されます。スレッドと LWP の ID は記録されますが、意味がありません。

同期遅延トレース
    同期遅延トレースは、呼び出しの実時間遅延が指定されたしきい値を超える、さまざまなスレッド同期ルーチンへの呼び出しをすべて記録します。データパケットには、同期ルーチンへのエントリと終了の時刻表示、リクエストが発行された時点でのスレッド ID と LWP ID が含まれます (同じスレッドからの同期リクエストでも、ある LWP 上で実行されるものが別の LWP で完了することもあるため)。

    同期遅延トレースデータは、以下のメトリックに変換されます。

    同期遅延イベント
    同期待ち時間

ヒープトレース
    ヒープトレースは、malloc、free、realloc、および memalign への呼び出しを、要求されたブロックのサイズ、そのアドレス、および realloc については以前のアドレスとともにすべて記録します。

    ヒープトレースデータは、以下のメトリックに変換されます。

    リーク
    リークされたバイト
    割り当て
    割り当てられたバイト

    リークは、解放されない割り当てとして定義されます。長さゼロのブロックが割り当てられると、ゼロバイトを割り当てられた割り当てとしてカウントされます。長さゼロのブロックが解放されない場合、ゼロバイトがリークされたリークとしてカウントされます。

    Java で記述されたアプリケーションでは、リークはガベージコレクトされていない割り当てとして定義されます。

    ヒープトレースを行うと実験が非常に大きくなり、処理に時間がかかる可能性があります。

MPI トレース
    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 受信バイトは実際よりもかなり大きく報告される可能性があることに注意してください。

標本収集とグローバルデータ
    標本収集とは、実行の時間軸に沿ってマーカーを生成するプロセスです。各標本収集ポイントでは、実行統計が記録されます。標本収集ポイントで記録されたデータはすべて、プログラムに対してグローバルなものとなり、関数レベルのメトリックにはマップされません。

    標本は常に、プロセスの開始時と終了時に収集されます。デフォルトで、またはゼロでない -S 引数が指定されると、標本は指定された間隔で定期的に収集されます。また、libcollector(3) の API を使用しても収集できます。

    各標本収集ポイントで記録されたデータは、カーネルから送られるマイクロステートアカウンティング情報とそのカーネル内で保持されるさまざまな統計情報です。

制約事項

コレクタは、一部のシグナル処理ルーチンに割り込み処理をして、ターゲットプログラムによって妨げられることなく、クロックに基づくプロファイルには SIGPROF シグナルを、ハードウェアカウンタのオーバーフロープロファイルには SIGEMT を使用します。ターゲットプログラムがシグナルハンドラをインストールすると、コレクタライブラリは独自のシグナルハンドラを再インストールします。コレクタのシグナルハンドラは、フラグを設定して、システムコールが妨げられることなくシグナルを送信できるようにします。この設定により、ターゲットプログラムの動作が異なる可能性があります。

クロックに基づくプロファイルが有効な場合には、コレクタは、setitimer(2) に割り込み処理をして、プロファイルタイマーをターゲットプログラムに対して使用不可にします。

コレクタは、ハードウェアカウンタライブラリ libcpc.so 内の関数に割り込み処理をして、コレクタがパフォーマンスデータを収集しているときは、ハードウェアカウンタをアプリケーションに対して使用不可にします。割り込み処理された関数は、-1 の値を返します。

ハードウェアカウンタプロファイルは、cpustat を実行中のシステムでは実行できません。これは、cpustat がカウンタを制御しており、ユーザープロセスがカウンタを使用できないためです。

Java プロファイルは、Java 2 SDK の 1.4 より以前のバージョンではサポートされていません。Java モードプロファイルは、Java 2 SDK の 1.4.1 より以前のバージョンではサポートされていません。

setuid 属性を使用するように作成された子孫プロセスや、動的にリンクされていない実行可能ファイルの exec を使用して作成された子孫プロセスのデータは収集されません。さらに、それ以降の子孫プロセスは実験の破損や読み取れない実験の生成の原因となる可能性があります。問題を回避するには、すべての子孫プロセスが動的にリンクされ、setuid 属性を持たないようにする必要があります。

vfork(2) を呼び出すアプリケーションは、これらの呼び出しが fork1(2) の呼び出しに置き換えられます。

関連項目
collector(1)、 dbx(1)、 er_archive(1)、 er_cp(1)、 er_export(1)、 er_mv(1)、 er_print(1)、 er_rm(1)、 libcollector(3)、 およびマニュアル
『プログラムのパフォーマンス解析』