プログラムのパフォーマンス解析 ホーム目次前ページへ次ページへ索引


第 3 章

標本コレクタリファレンス

この章では、標本コレクタを紹介し、その使用方法を説明します。以下の各項目を取り上げます。

標本コレクタは、ターゲットアプリケーションおよびそのアプリケーションが実行されているカーネルのパフォーマンスデータを収集し、そのデータを実験レコードファイルに書き込みます。本書では、アプリケーションの実行中にデータを収集すること、または収集されたデータを、実験と呼ぶことがあります。

特に指定しない限り、標本コレクタで生成された実験レコードファイルには、.n.er という拡張子が付きます。n は 1 以上の整数です。デフォルトの実験ファイル名は、test.n.er になります。実験レコードファイルに filename.1.er という形式を使用する場合、標本コレクタは、以降の実験レコードファイル名を自動的にインクリメントします。たとえば、my_test.1.er に続いて、my_test.2.ermy_test.3.er となります。


注意 - 実験レコードフィルの削除に rm ユーティリティを使用しないでください。実際の実験情報は、.filename.n.er という隠れディレクトリに格納されており、このディレクトリは rm によって削除されないためです。実験レコードファイルと隠れディレクトリを削除するには、パフォーマンスツールユーティリティの er_rm を使用します。これは、標本コレクタとアナライザとともに提供されています。er_rm の使用方法については、er_rm のマニュアルページを参照してください。

標本コレクタが収集するデータ

標本コレクタは実験中に、パフォーマンスデータを記録し、そのデータを一定間隔ことの標本として編成します。標本コレクタは、以下の状況で標本を終了し、次の標本に移ります。

各標本に記録されるデータは、カーネルからの微小状態記録アカウンティング情報とカーネル内で保持されているその他のさまざまな統計情報とからなります。

標本ポイントで記録されるデータは、プログラムにとって大域的であり、関数レベルのメトリック (測定結果) が含まれていません。ただし、標本収集の合間に関数レベルのメトリックが記録された場合、標本コレクタはこれらの関数メトリックをそれが収集されたサンプリング間隔に関連付けます。

標本コレクタは、次に示す関数レベルの情報を収集できます。

排他メトリック、包含メトリック、寄与メトリック

標本コレクタは、関数および読み込みオブジェクトに対する、排他メトリック、包含メトリック、寄与 (属性) メトリックを収集します。

時間ベースのプロファイルデータ

時間ベースのプロファイリングは、次のメトリックをサポートするための情報を記録します。

この情報は、アナライザの「関数リスト」表示と「呼び出し元-呼び出し先」ウィンドウに表示されます (「関数およびロードオブジェクトの測定結果の検査」を参照)。この情報は、「概要メトリック」ウィンドウおよび注釈付きのソースと逆アセンブリコードにも表示されます。


注 - マルチプロセッサを使用した実験では、時計時間以外の時間は、プロセス内の全 LWP について合計されます。総時間は、時計時間に、プロセス内に含まれる平均 LWP 数を掛けた値に等しくなります。各レコードには、タイムスタンプ、およびごく短時間に実行していた LWP とスレッドの ID が含まれます。

時間ベースのプロファイリングは、次のような疑問を解消するのに役立ちます。

スレッド同期待ちの監視

マルチスレッドプログラムでは、スレッド同期待ちの監視機能は、スレッドライブラリ内にあるスレッド同期ルーチンによる待ち時間を追跡しています。リアルタイム遅延が、ある一定のユーザ定義しきい値を超えると、その呼び出しと待ち時間 (秒数) に関するイベントが記録されます。

各レコードには、タイムスタンプと、クロックスタンプ時に実行中であったスレッドと LWP の ID が含まれます。同期遅延情報は、次のメトリックをサポートしています。

この情報は、標本アナライザの「関数リスト」表示と「呼び出し元-呼び出し先」ウィンドウに表示されます (「関数およびロードオブジェクトの測定結果の検査」を参照)。この情報は、「概要メトリック」ウィンドウおよび注釈付きのソースと逆アセンブリコードにも表示されます。

ハードウェアカウンタのオーバフロープロファイル

ハードウェアカウンタのオーバフローのプロファイルは、LWP が動作している CPU の指定のハードウェアカウンタがオーバフローを起こしたときに、各 LWP の呼び出しスタックを記録します。

標本コレクタを使用すると、オーバフローが監視されているカウンタの種類を選択し、それにオーバフロー値を設定することができます。通常、カウンタは、命令キャッシュの消失、データキャッシュの消失、サイクル、発行または実行された命令などを追跡します。


注 - ハードウェアカウンタのオーバフロープロファイル機能が使用できるのは、SPARC (UltraSPARC III) マシンおよび Intel (Pentium II およびその互換製品) で実行される Solaris 8 だけです。その他のマシン上では使用できません。

ハードウェアカウンタのオーバフローのプロファイルは、カウンタメトリックをサポートするデータを生成します。

大域情報

プログラムに関する大域情報には、次のようなデータが含まれます。

Sun WorkShopでのパフォーマンスデータの収集

データを収集するにあたって、次の作業が必要です。

データ収集は、次の 2 段階で行います。

  1. 収集したいデータの種類と、データを格納したい場所を指定します。

  2. 標本コレクタを実行します。

収集したいデータの種類を指定するには、次の操作を行います。

1. WorkShop メインウィンドウから「ウィンドウ」 「標本コレクタ」を選択します。

「標本コレクタ」ウィンドウが表示されます。

図 3-1   「標本コレクタ」ウィンドウ

2. 「データ収集」ラジオボタンを使用して、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_name 

2. (dbx) のプロンプトが表示されるまで、スペースバーを押します。

3. 標本コレクタコマンドにさまざまな引数を指定してデータを収集し、実験レコードを生成します。

(dbx)collector argument 

表 3-1 に、collector コマンドの引数を示します。

表 3-1   collector コマンドの引数 
引数 機能
{ enable | enable_once | disable } データ収集を動作状態または非動作状態にする

  • モードが enable の場合、データ収集は、現在の実行と以降のすべての実行で行われる

  • モードが enable_once の場合、現在の実行についてはデータが収集されるが、その実行が終了すると、モードは disable にリセットされる

  • モードが disable の場合、パフォーマンスデータは収集されない

  • profile { on | off } プロファイルデータの収集をオンまたはオフにする。デフォルトはオン
    profile timer value プロファイルタイマ間隔に、ミリ秒単位で指定した value を設定する。デフォルト値は、10 ms
    address_space { on | off } アドレス空間データ (参照または修正されたページ) の収集をオンまたはオフにする。デフォルトはオフ
    synctrace { on | off } スレッド同期待ちの監視データの収集をオンまたはオフにする。デフォルトはオフ
    synctrace threshold value 同期遅延トレース機能のしきい値を、ミリ秒単位で指定した value に従って設定する。value には次のいずれかの値を設定できる

  • calibrate:実行時に決定されるキャリブレートされたしきい値を使用する

  • number:ミリ秒単位で指定した number のしきい値を使用する。numberゼロを設定すると、コレクタは、待ち時間に関係なくすべてのイベントをトレースする

    デフォルト設定値は calibrate
  • hwprofile { on | off } ハードウェアカウンタのオーバフロープロファイル機能をオンまたはオフにする。デフォルトはオフ。ハードウェアカウンタのオーバフロープロファイル機能をサポートしていないシステム上でこの機能をオンにしようとすると、dbx がエラーメッセージを返す
    hwprofile list 利用可能なカウンタ名の一覧が返される。各カウンタには、通常間隔と高解像度用間隔の値が示される。ハードウェアカウンタのオーバフロープロファイル機能がシステム上でサポートされていない場合は、dbx がエラーメッセージを返す
    hwprofile counter name interval ハードウェアカウンタのプロファイルにイベント名 (name) を、そのオーバフロー間隔に interval をそれぞれ設定する。name のデフォルトは、通常のプロファイル間隔における cycles である。
    status 読み込まれた実験の状態を報告する
    show あらゆるコレクタ制御の現在の設定値を示す
    close 現在の実験を閉じる
    quit 現在の実行のデータ収集を終了する
    sample { periodic | manual } 標本収集モードに periodic (定期的) または manual(手動) のどちらかを設定する。なお、periodic を指定した場合は、sample period 引数に値を設定しなければならない
    sample period value 標本収集頻度に、ミリ秒で指定した value を設定する
    store directory directory_name 実験レコードファイルが格納されるディレクトリに、directory_name を設定する
    store filename file_name 出力実験ファイル名に file_name を設定する

    利用可能な collector コマンド引数の一覧を取得するには、dbx プロンプトに対し次のように入力し、Enter キーを押します。

    (dbx) help collector
    

    実行中プロセスへの接続

    標本コレクタを使用すると、実行中プロセスに接続し、そのプロセスのパフォーマンスデータを収集できます。

    スレッド同期待ちの監視データを収集したい場合は、実行可能プログラムを起動する前に、libcollector.so というライブラリを読み込みます。これによって、実際のルーチンそのものではなく、同期ルーチンを囲むコレクタのラッパーが参照されます。プロファイルデータまたはハードウェアカウンタのオーバフロープロファイルだけを収集する場合は、コレクタライブラリを事前に読み込んでおく必要はありませんが、読み込んでも差し支えありません。

    libcollector.so を事前にロードするには、次の操作を行います。

    実行可能プログラムに接続し、データを収集するには、次の操作を行います。

    1. プログラムを起動します。

    2. プログラムの PID を決定し、その PID に dbx を接続させます。

    3. データ収集機能をオンにします。

      1. データ収集は、collector コマンドを使用して dbx から直接起動するか、または「標本コレクタ」ウィンドウから起動します。
      2. 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.scriptdbx スクリプトで、次の段落で説明します。

    この例を実行すると、実行可能オブジェクトの a.out から 2 つの MPI プロセスが実行され、test.M.ertest.N.er という 2 つの実験が作成されます。なお、MN は、2 つの MIP プロセスの PID です。

    作成される実験名が一意になるように、collection.script というファイルによって保証しなければなりません。実験名が一意でないと、実験を生成する dbx インスタンスが同時に実行されるため、複数の dbx インスタンスが同じ名前で実験を作成しようとします。ファイル名を確実に一意にする 1 つの方法は、MPI プロセスのプロセス ID が含まれたファイル名を各 dbx インスタンスが使用するように、collection.script で指定することです。

    stop in main 
    
    run [program_arguments]
    
    collector enable 
    
    collector store filename test.$[getpid()].er 
    
    cont 
    
    quit 
    

    また、名前の一部に MPI ランクが含まれた実験を作成することもできます。それには、dbx スクリプトを若干変更します。このスクリプトでは、MPI_Comm_rank () の呼び出し直後に、ターゲットプログラムを停止し、ランクを使用して実験ディレクトリを指定します。たとえば、MPI プログラムの 17 行目に次の文が記述されているものとします。

    collection.script を次のように変更します。

    stop at 18
    
    run [program_arguments]
    
    rank=$[me]
    
    collector enable
    
    collector store filename test.$rank.er
    
    cont
    
    quit
    

    このような修正を行うことによって、mprun が作成する実験には、その実験が対応する MPI プロセスのランクが含まれた名前が付けられます。

    MPI プロセスから収集されたデータを調べるには、アナライザで 1 つの実験を開き、別の実験を追加します。これによって、すべての MPI プロセスのデータが集計されます。詳細については、「標本アナライザの起動および実験の読み込み」および 「標本アナライザに実験を追加」を参照してください。

    er_print を使用してもデータを出力できます。er_print は、コマンド行から複数の実験を受け付けます。詳細については、第 5 章「er_print リファレンス」参照してください。


    サン・マイクロシステムズ株式会社
    Copyright information. All rights reserved.
    ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引