dbx
collector という用語は、dbx でのデータ収集機能と、libcollector.so でのこれらの機能に対する実行時サポートを説明するために使用されます。
dbx collector は現在、Java(TM) プログラミング言語で記述されたアプリケーションで機能します。(用語「Java 仮想マシン」および「JVM」は、Java(TM) プラットフォームの仮想マシンを意味します。)
収集されるデータは、collect(1) のマニュアルページで説明されています。collect コマンドは、dbx を使用せずにデータを収集できます。
パフォーマンスデータの収集をサポートするために dbx によって受け入れられるコマンドは次のとおりです。
データ収集を有効または無効にします。
どのプロセスもアクティブでない場合は、プロセスの起動時に実験を収集するかどうかを制御します。モードが disable である場合は、パフォーマンスデータを収集しません。モードが enable である場合は、以降のすべての実行でデータを収集します。
プロセスは実行されているが、実験が収集されていないときに enable コマンドが受信された場合は、動作中のプロセスで実験を開始します。disable は指定されているが、実験が収集されていない場合は、警告を表示してコマンドを無視します。
プロセスが実行され、実験が収集されているときに disable コマンドが受信された場合は、実験を終了します。enable が指定されている場合は、警告を表示してコマンドを無視します。
実験は終了したが、プロセスが実行されたままのときに enable コマンドが受信された場合は、新しい実験を開始します。
実験中にデータの記録を一時的に停止します。データの記録がすでに一時停止されている場合は、警告なしでコマンドを無視します。実験が実行されていない場合は、警告を表示してコマンドを無視します。
実験中にデータの記録を再開します。データの記録が一時停止されていない場合は、警告なしでコマンドを無視します。実験が実行されていない場合は、警告を表示してコマンドを無視します。
クロックベースのプロファイリングデータの収集を有効または無効にします。実験がアクティブである場合は、警告を表示してコマンドを無視します。デフォルトは「on」です。
プロファイリングタイマーの間隔を value に設定します。この値には、マイクロ秒単位の値を示す u、またはミリ秒単位の値を示す m の接尾辞の付いた整数または浮動小数点数値を指定できます。接尾辞が使用されていない場合、値はミリ秒単位であると見なされます。デフォルトの間隔を 10 ミリ秒に設定します。
間隔値はまた、1 ミリ秒の間隔でのプロファイリングを示す「hi」または「high」、100 ミリ秒の間隔でのプロファイリングを示す「lo」または「low」、10 ミリ秒の間隔でのプロファイリングを示す「on」のいずれかの文字列として指定することもできます。これらの間隔値は概略の値です。
この値がシステムのクロックプロファイリングの最小値より小さい場合は、その値を最小値に設定します。この値がクロックプロファイリングの分解能の倍数でない場合は、クロック分解能のもっとも近い倍数に切り下げます。クロックプロファイリングの最大値を超えた場合は、エラーを報告します。負または 0 である場合は、エラーを報告します。
実験がアクティブである場合は、警告を表示してコマンドを無視します。
ハードウェアカウンタオーバーフロープロファイリングを有効または無効にします。ハードウェアまたはオペレーティングシステムがハードウェアカウンタオーバーフロープロファイリングをサポートしていないシステムでは、これを有効にする試みを検出するとエラーが返されます。実験がアクティブである場合は、警告を表示してコマンドを無視します。デフォルトは無効です。
実験のデフォルト構成を含む使用法のサマリーを出力します。プロセッサがハードウェアカウンタプロファイリングをサポートしている場合、ハードウェアカウンタに関する情報を含む 2 つのリストを出力します。最初のリストには、「別名を付けた」ハードウェアカウンタが含まれます。2 番目のリストには、raw ハードウェアカウンタが含まれます。そのリストのあとに、そのチップのリファレンスマニュアルの名前と、そのチップに対して定義されているデフォルトのカウンタセットが出力されます。
たとえば、collector hwprofile list コマンドが呼び出されると、次のような出力が生成されます。
プロファイリングに使用可能な別名を付けた HW カウンタ:
cycles[/{0|1}],9999991 (`CPU Cycles', alias for Cycle_cnt; CPU-cycles) insts[/{0|1}],9999991 (`Instructions Executed', alias for Instr_cnt; events) icm[/1],100003 (`I$ Misses', alias for IC_miss; events) ...
プロファイリングに使用可能な raw HW カウンタ:
Cycle_cnt[/{0|1}],1000003 (CPU-cycles) Instr_cnt[/{0|1}],1000003 (events) Dispatch0_IC_miss[/0],1000003 (CPU-cycles) ...
ハードウェアカウンタオーバーフロープロファイルを収集します。カウンタ定義 (ctr_def から ctr_n_def) の数はプロセッサに依存します。たとえば、UltraSPARC III システム上では、最大 2 つのカウンタをプログラムできます。ハイパースレッディングを備えた Intel Pentium 4 上では、最大 18 のカウンタを使用できます。ユーザーは、ほかのどの引数も指定せずに collect -h コマンドを実行するか、または collector hwprofile list コマンドを発行することによって、ターゲットシステム上でのプロファイリングのためのハードウェアカウンタ定義の最大数や、使用可能なハードウェアカウンタの完全なリストを確認できます。
カウンタには 4 つの特殊な名前を使用できます。on はチップで事前に定義されたカウンタセットの使用を指定し、hi|high はこのセットの高分解能での使用を指定し、lo|low はこのセットの低分解能での使用を指定し、off は HW カウンタプロファイリングを無効にすることを指定します。特殊な名前 hi または lo が使用される場合に、そのチップについてのデフォルトカウンタセットを高分解能プロファイリングまたは低分解能プロファイリングのいずれかに指定すると、デフォルトのクロックプロファイリング分解能も高分解能または低分解能に設定されます。クロック分解能の明示的な設定が推奨されます。
これらの特殊な名前を除き、各カウンタ定義は、ハードウェアカウンタの属性がプロセッサ上でサポートされているかどうかに応じて次のいずれかの形式を取ります。
[+|-]ctr[/reg#],interval [+|-]ctr[/reg#] interval
例:
collector hwprofile counter cycles,on,insts collector hwprofile counter cycles on insts
注: 歴史的な理由から、ハードウェアカウンタ間の区切り文字としてスペースを引き続き使用できます。
[+|-]ctr[~attr=val]...[~attrN=valN][/reg#],interval
例:
collector hwprofile counter FP_dispatched_fpu_ops~umask=0x3/2,10007
により、浮動小数点加算および乗算操作を追跡できるようになります。(有効な属性値の詳細は、プロセッサのドキュメントを参照してください)。「/2」の値は、ハードウェアの 2 番目のレジスタを使用して命令を実行するように指定します。CPU サイクルプロファイリングは、10007 回のイベントの間隔レートで実行されます。
カウンタ定義の各オプションの意味は次のとおりです。
メモリー関連のカウンタに適用できるオプションパラメータ。+ は、データ領域およびメモリー領域プロファイリングデータを記録するようにリクエストします。- は、それを記録しないようにリクエストします。
メモリー関連のカウンタのタイプは、ほかのどの引数も指定せずに collect -h コマンドを実行することによって取得されたカウンタリストで表示される load、store、または load-store です。このようなカウンタの一部には、precise というラベルも付けられます。
正確なカウンタの場合は、SPARC または x86 のどちらでも、+ は必要ありません。データ領域およびメモリー領域データがデフォルトで記録されます。- を指定すると、データ領域およびメモリー領域データが無効になります。
SPARC の場合のみ、正確でないメモリーカウンタに対して + を指定すると、collect は、オーバーフローをトリガーした命令とメモリー参照の仮想および物理アドレスを見つけようとしてバックトラックします。このようなデータはデフォルトでは記録されず、それを無効にするために - は必要ありません。
プロセッサ固有のカウンタ名。ユーザーは、ほかのどの引数も指定せずに collect -h コマンドを実行することによってカウンタ名のリストを確認できます。
一部のプロセッサでは、属性オプションをハードウェアカウンタに関連付けることができます。プロセッサが属性オプションをサポートしている場合は、ほかのどの引数も指定せずに collect -h を実行すると、上記の 2 番目の形式でカウンタ定義 ctr_def が指定され、attr に使用する属性名のリストが表示されます。val の値は、10 進数または 16 進数の形式で指定できます。16 進数の形式の数値は、数値の前に 0 と小文字の x が付加された C プログラムの形式 (0xhex_number) で指定します。
カウンタに使用するハードウェアレジスタ。指定されていない場合、collect は、カウンタを使用可能な最初のレジスタに配置しようとします。その結果、レジスタの競合のために以降のカウンタを配置できない可能性があります。ユーザーが複数のカウンタを指定する場合は、各カウンタで異なるレジスタを使用する必要があります。使用可能なレジスタ番号のリストは、ほかのどの引数も指定せずに collect -h コマンドを実行することによって確認できます。
標本収集間隔。カウンタオーバーフロー値を定義することによって設定されます。有効な値は次のとおりです。
デフォルトのレートを選択します。このレートは、ほかのどの引数も指定せずに collect -h コマンドを実行することによって確認できます。すべての raw カウンタのデフォルト値は同じであるため、特定のカウンタにもっとも適した値ではない可能性があることに注意してください。
間隔を on に比べて約 10 倍短い値に設定します。
間隔を on に比べて約 10 倍長い値に設定します。
間隔を 10 進数または 16 進数の形式で指定された特定の値に設定します。
実験では、ハードウェアカウンタプロファイリングとクロックベースのプロファイリングの両方を指定できます。ハードウェアカウンタプロファイリングを指定しても、デフォルトでは、クロックベースのプロファイリングは無効になりません。
ハードウェアカウンタオーバーフロープロファイルのためのカウンタを追加します。前述のように、カウンタ定義 (ctr_def から ctr_n_def) の数はプロセッサに依存します。hwprofile counter は、以前のカウンタセットをすべて破棄します。hwprofile addcounter は、古いリストのあとに新しいリストを付加します。
同期トレースデータの収集を有効または無効にします。デフォルトは off です。実験がアクティブである場合は、警告を表示してコマンドを無視します。
指定された value に従って、同期遅延トレースのしきい値を設定します。これには、次のいずれかを指定できます。
実行時に決定される、調整済みのしきい値を使用します。
同期遅延トレースを無効にします。
n マイクロ秒のしきい値を使用します。0 の値により、すべてのイベントのトレースが可能になります。
デフォルト設定は calibrate です。実験がアクティブである場合は、警告を表示してコマンドを無視します。
ヒープトレースデータの収集を有効または無効にします。デフォルトは off です。実験がアクティブである場合は、警告を表示してコマンドを無視します。
I/O トレースデータの収集を有効または無効にします。デフォルトは off です。実験がアクティブである場合は、警告を表示してコマンドを無視します。
Java データの収集を有効または無効にします。デフォルトは off です。実験がアクティブである場合は、警告を表示してコマンドを無視します。下記の「Java プロファイリング」のセクションを参照してください。
指定された期間だけデータを収集します。duration には、1 つの数値のあとに、分を指定する m か秒を指定する s (デフォルト)、または - 記号で区切られたこれらの 2 つの数値のいずれかを指定できます。1 つの数値が指定されている場合、データは実行の開始から指定された時間まで収集されます。2 つの数値が指定されている場合、データは最初の時間から 2 番目の時間まで収集されます。2 番目の時間が 0 である場合、データは実行の終了まで収集されます。0 以外の数値を 2 つ指定する場合、最初の数値は 2 番目の数値未満である必要があります。実験がアクティブである場合は、警告を表示してコマンドを無視します。
一時停止/再開シグナルを定義します。オプションの resume が追加された場合は再開状態で起動し、それ以外の場合は一時停止状態で起動します。実験がアクティブである場合は、警告を表示してコマンドを無視します。
標本シグナルを定義します。実験がアクティブである場合は、警告を表示してコマンドを無視します。
MPI トレースはサポートされなくなりました。
スレッドアナライザのデータの収集を制御します。デフォルトは off です。実験がアクティブである場合は、警告を表示してコマンドを無視します。データ競合検出のために、ターゲットの実行可能ファイルを計測する必要があります。詳細は、tha(1) のマニュアルページを参照してください。
<option> は、スレッドアナライザのデータオプションのコンマ区切りリストです。<option> の値には、race と deadlock が含まれます。これらは個別に、あるいは deadlock,race または race,deadlock として組み合わせて指定できます。詳細は、 collect (1) のマニュアルページを参照してください。
実験をアーカイブするためのモードを設定します。デフォルトは on です。これは、ターゲットと実験で参照されたすべての共有オブジェクトをコピーする通常のアーカイブに対応します。Java 実験の場合は、すべての .jar ファイルもコピーされます。モードが off に設定されている場合は、アーカイブしません。モードが src に設定されている場合は、見つかったすべてのソースファイルもアーカイブします。モードが usedsrc に設定されている場合は、データで参照されていて、見つかったすべてのソースファイルもアーカイブします。実験を別のマシンに移動するか、または実験を別のマシンから読み取るユーザーは、すべてのロードオブジェクトのアーカイブとコピーを有効にするようにしてください。実験がアクティブである場合は、警告を表示してコマンドを無視します。
記録されるプロファイリングデータの量を valueM バイトに制限します。この制限は、すべてのプロファイリングデータとトレースデータの合計に適用されますが、標本ポイントには適用されません。この制限値は概数にすぎないので、この値を超えることは可能です。この制限に達すると、それ以上のプロファイリングまたはトレースデータは記録しませんが、実験を開いたままにして、ターゲットプロセスが終了するまで標本を記録します。実験がアクティブである場合は、警告を表示してコマンドを無視します。
デフォルトでは、記録されるデータサイズに制限はありません。
開いているすべての実験のステータスに関して報告します。
すべてのコレクタ制御変数の現在の設定を表示します。
標本収集モードを periodic または manual のどちらかに設定します。periodic が指定されている場合は、現在の標本収集間隔で標本を記録します。manual が指定されている場合は、定期的な標本を記録します。指定されているモードには関係なく、collector sample record を使用して手動で標本を記録できます。実験がアクティブである場合は、警告を表示してコマンドを無視します。
オプションのラベル name を指定して標本を記録します。実験がアクティブでない場合は、警告を表示してコマンドを無視します。
標本収集間隔を value (秒単位で指定) に設定します。実験がアクティブである場合は、警告を表示してコマンドを無視します。
dbx がターゲットプロセスを停止した場合の標本の収集を制御します。on オプションの場合は、dbx がターゲットプロセスを停止するたびに標本を収集します。off の場合は、標本を収集しません。デフォルトは on です。
コレクタのディレクトリを name に設定します。実験がアクティブである場合は、警告を表示してコマンドを無視します。
出力の実験名を name に設定します。実験がアクティブである場合は、警告を表示してコマンドを無視します。名前が指定されていない場合は、デフォルト名を使用します。デフォルト名は、collect(1) のマニュアルページで説明されています。
実験グループ名を name に設定します。実験がアクティブである場合は、警告を表示してコマンドを無視します。
データを収集するために使用される libcollector.so のバージョンを報告します。
使用可能なさまざまな collector コマンドに関してユーザーに入力を要求します。
以前は dbx によって受け入れられていた次のいくつかのコマンドが廃止されました。
警告が表示されて無視されます。このコマンドは、データ収集を 1 回だけ実行できるようにするために使用されます。
実験が実行されている場合は、collector disable として扱われます。実験が実行されていない場合は、警告が表示されて無視されます。
実験が実行されている場合は、collector disable として扱われます。実験が実行されていない場合は、警告が表示されて無視されます。
アドレス空間データはサポートされなくなりました。このコマンドは、警告が表示されて無視されます。
互換性のために、collector store experiment として受け入れられます。出力の実験名を name に設定します。
パフォーマンスデータを収集しているプロセスが子孫プロセスを作成した場合、コレクタは、引き続き親プロセスに関するデータを収集しますが、次の例外があります。プロセスが exec のいずれかのバリアントを呼び出した場合、実験は、exec が成功した場合は異常終了し、exec が失敗した場合は続行します。いずれの場合も、この実験をパフォーマンス分析ツールで読み取ることができます。
子孫プロセスのデータを記録する場合は、dbx を新しく作成されたプロセスに接続してから、collector enable を使用して子孫プロセス上で実験を開始するようにしてください。すべての子孫プロセスに関するデータを自動的に収集する場合は、collect(1) コマンドを使用します。
dbx をプロセスに接続し、collector コマンドを使用して、そこからパフォーマンスデータを収集することができます。
実行可能ファイルが起動されたあと、その PID を確認し、dbx をそこに接続して、次のコマンドを使用します。
dbx executable-name PID
そのプロセスの実行可能ファイル名を必ず含めてください。その時点で、データ収集を有効にすることができます。
また、次のコマンドを使用して
collect -P PID
プロセスに接続し、データを収集することもできます。
dbx または collect -P を呼び出しているユーザー以外のユーザーによって所有されているプロセスに接続する場合、接続先のプロセスを所有しているユーザーによる書き込みを許可するには、そのプロセスに接続しようとしているユーザーの umask を設定する必要があります。それが正しく設定されていないと、ディレクトリが書き込み可能でないというメッセージが表示され、データ収集は失敗します。
データ収集を有効にしないで dbx から実行可能ファイルを起動した場合、いつでも dbx からその実行可能ファイルを一時停止してからデータ収集を有効にすることができますが、接続と同じ制限が適用されます。
dbx のバグ 7077536 のため、システムコールで一時停止されているマルチスレッド化されたターゲット上でコレクタを起動すると、その呼び出しがエラーを示すことなく途中で戻ったり、予測できない動作になったりする可能性があります。
シグナルハンドラをインストールするか、または libcpc.so を使用するアプリケーションへの接続によるデータの収集は、その機能が参照された実際のルーチン自体ではなく、それらのルーチンの周りにあるコレクタのラッパーをユーザーコードが呼び出すことに依存しているため、正しく機能しない可能性があります。同様に、トレースデータ (同期トレース、ヒープトレース、または MPI トレース) の収集や、子孫プロセスの追尾も機能しない可能性があります。dbx によって接続されたプロセス上では、クロックおよび HWC プロファイル実験だけが機能します。これらの問題を回避するには、collect に -y sig フラグを使用してプロセスを開始したあと、指定されたシグナル sig をターゲットに送信することによってデータ収集を有効にします。
Java アプリケーションをその開始時点から dbx の下でプロファイルするには、ともに実行する JVM を dbx のターゲットとして使用して「collector java on」コマンドを発行し、収集するデータのプロファイリングパラメータを設定し、「collector enable」コマンドを発行してから、「run」コマンドでターゲットを起動するようにしてください。run コマンドでは、Java アプリケーションのクラスや jar ファイルの名前を含む、JVM のすべての引数を指定するようにしてください。
実行中のアプリケーションをプロファイリングするには、そのアプリケーションを dbx の下で起動したか、または dbx を使用して実行中の JVM に接続したかにかかわらず、まずターゲットを停止してから (またはブレークポイントでの停止を待ってから)、「collector java on」、すべてのプロファイリングパラメータコマンド、次に「collector enable」と「cont」を発行します。
指定された PID で JVM に接続するために「-P <PID>」パラメータを指定して collect を使用するには、collect コマンドで「-j on」も設定するようにしてください。Java ランタイムパラメータを指定するために、JVM へのパスに「-j」を使用したり、「-J」引数を使用したりすることはできません。
analyzer (1) , collect (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)
パフォーマンスアナライザマニュアル