Oracle® Solaris Studio 12.4: パフォーマンスアナライザ

印刷ビューの終了

更新: 2015 年 1 月
 
 

クロックプロファイリングデータ

クロックプロファイリング時に収集されるデータは、オペレーティングシステムが提供する情報によって異なります。

Oracle Solaris でのクロックプロファイリング

Oracle Solaris でのクロックプロファイリングでは、 各スレッドの状態が定期的な時間間隔で格納されます。この時間間隔は、 プロファイリング 間隔と呼ばれます。 収集されるデータは、プロファイリング間隔の分解能を使用して、それぞれの状態で経過した時間に変換されます。

デフォルトのプロファイル間隔は、約 10 ミリ秒 (10 ms) です。約 1 ms の高分解能のプロファイリング間隔と約 100 ms の低分解能のプロファイリング間隔を指定できます。オペレーティングシステムで許可されている場合は、カスタム間隔を指定することもできます。ほかの引数を指定せずに collect -h コマンドを実行して、システム上で許容可能な範囲と分解能を出力します。

次の表に、実験にクロックプロファイリングデータが含まれる場合に、パフォーマンスアナライザと er_print が表示できるパフォーマンスメトリックを示します。すべてのスレッドからのメトリックが同時に追加されることに注意してください。

表 2-1  Oracle Solaris でのクロックプロファイリングからのタイミングメトリック
メトリック
定義
スレッド合計時間
スレッドがすべての状態で費やした時間の合計。
合計 CPU 時間
ユーザーモード、カーネルモード、またはトラップモードの CPU での実行に費やされたスレッド時間
ユーザー CPU 時間
ユーザーモードの CPU での実行に費やされたスレッド時間。
システム CPU 時間
カーネルモードの CPU での実行に費やされたスレッド時間。
トラップ CPU 時間
トラップモードの CPU での実行に費やされたスレッド時間。
ユーザーロック時間
同期ロックの待機に費やされたスレッド時間。
データページフォルト時間
データページの待機に費やされたスレッド時間。
テキストページフォルト時間
テキストページの待機に費やされたスレッド時間。
カーネルページフォルト時間
カーネルページの待機に費やされたスレッド時間。
停止時間
停止に費やされたスレッド時間。
CPU 待ち時間
CPU の待機に費やされたスレッド時間。
スリープ時間
スリープに費やされたスレッド時間

タイミングメトリックは、プログラムがいくつかのカテゴリで時間を費やした部分を示し、プログラムのパフォーマンス向上に役立てることができます。

  • ユーザー CPU 時間が大きいということは、その場所で、プログラムが仕事の大半を行なっていることを示します。この情報は、アルゴリズムを再設計することによって特に有益となる可能性があるプログラム部分を見つけるのに使用できます。

  • システム CPU 時間が大きいということは、プログラムがシステムルーチンに対する呼び出しで多くの時間を使用していることを示します。

  • CPU 待ち時間が大きいということは、使用可能な CPU 以上に実行可能なスレッドが多いか、ほかのプロセスが CPU を使用していることを示します。

  • ユーザーロック時間が大きいということは、要求対象のロックをスレッドが取得できないことを示します。

  • テキストページフォルト時間が大きいということは、リンカーによって指定されたコードが、多数の呼び出しまたは分岐で新しいページの読み込みが発生するようなメモリー上の配置になることを意味します。

  • データページフォルト時間が大きいということは、データへのアクセスによって新しいページの読み込みが発生していること示します。この問題は、プログラムのデータ構造またはアルゴリズムを変更することによって解決できます。

Linux でのクロックプロファイリング

Linux プラットフォームでは、クロックデータは合計 CPU 時間としてのみ表示できます。Linux CPU 時間は、ユーザー CPU 時間とシステム CPU 時間の合計です。

OpenMP プログラム対応のクロックプロファイリング

クロックプロファイリングが OpenMP プログラムで実行される場合は、マスタースレッド時間、OpenMP 作業、および OpenMP 待機という追加メトリックが提供されます。

  • Oracle Solaris では、マスタースレッド時間はマスタースレッドで費やされた合計時間であり、時計時間に対応します。このメトリックは Linux では使用できません。

  • Oracle Solaris では、OpenMP 作業は、作業が直列または並列に実行されている場合に累積されます。OpenMP 待機は、OpenMP ランタイムが同期化を待機している場合に蓄積し、待機が CPU 時間またはスリーピングを使用しているか、または作業が並列実行中であるがスレッドが CPU 上にスケジュールされていない場合に蓄積します。

  • Linux オペレーティングシステムでは、OpenMP 作業および OpenMP 待機は、プロセスがユーザーモードまたはシステムモードでアクティブである場合にのみ累積されます。OpenMP でビジーウェイトを行う必要があるものとして指定しないかぎり、Linux での OpenMP は有用ではありません。

OpenMP プログラムのデータは、3 つの表示モードのいずれかで表示できます。「ユーザー」モードでは、スレーブスレッドが実際にマスタースレッドから複製され、呼び出しスタックがマスタースレッドからのスレーブスレッドに対応しているかのように表示されます。OpenMP 実行時コード (libmtsk.so) から来た、呼び出しスタック内のフレームは抑制されます。「上級」ユーザーモードでは、マスタースレッドとスレーブスレッドが異なる方法で表示され、コンパイラで生成された明示的な関数が表示され、OpenMP 実行時コード (libmtsk.so) からのフレームは抑制されます。「マシン」モードでは、実際のネイティブなスタックが表示されます。

Oracle Solaris カーネルに対するクロックプロファイリング

er_kernel ユーティリティーは、Oracle Solaris カーネルに関するクロックベースのプロファイルデータを収集できます。コマンド行から直接 er_kernel ユーティリティーを実行するか、パフォーマンスアナライザの「ファイル」メニューから「カーネルのプロファイル」を選択すると、カーネルのプロファイリングを行えます。

er_kernel ユーティリティーはカーネルプロファイルデータを取り込み、そのデータをパフォーマンスアナライザの実験として、ユーザープログラム上で collect ユーティリティーによって作成された実験と同じ形式で記録します。この実験は、er_print ユーティリティーまたはパフォーマンスアナライザによって処理できます。 カーネル実験は、関数データ、呼び出し元-呼び出し先データ、命令レベルのデータ、およびタイムラインを示すことができますが、ほとんどの Oracle Solaris モジュールが行番号テーブルを保持していないため、ソース行データを示すことはできません。

er_kernel は、ユーザーが権限を保持している、その時点で実行中のプロセスでのユーザーレベルの実験も記録できます。このような実験は、collect が作成する実験に似ていますが、ユーザー CPU 時間とシステム CPU 時間に関するデータだけを含み、Java および OpenMP プロファイリングはサポートしません。

詳細は、Chapter 9, カーネルプロファイリングを参照してください。

MPI プログラム対応のクロックプロファイリング

クロックプロファイリングデータは、Oracle Message Passing Toolkit (以前の Sun HPC ClusterTools) で実行される MPI 実験で収集できます。Oracle Message Passing Toolkit はバージョン 8.1 またはそれ以降である必要があります。

Oracle Message Passing Toolkit は、Oracle Solaris 11 リリースの一部として入手できます。システムにインストールされている場合は、/usr/openmpi にあります。まだ Oracle Solaris 11 システムにインストールされていない場合、システムにパッケージリポジトリが構成されていれば、コマンド pkg search openmpi を使用してこのパッケージを検索できます。Oracle Solaris 11 でのソフトウェアのインストールの詳細は、『Oracle Solaris 11 ソフトウェアパッケージの追加および更新』を参照してください。

    MPI 実験に関するクロックプロファイリングデータを収集するときに、次の 2 つの追加メトリックが表示されます。

  • MPI 作業: 要求やメッセージの処理など、プロセスが MPI ランタイム実行作業の内部にある場合に蓄積されます。

  • MPI 待機: プロセスが MPI ランタイムの内部にあり、イベント、バッファー、またはメッセージを待機している場合に蓄積されます。

Oracle Solaris では、MPI 作業は、作業が直列または並列に実行されている場合に累積されます。MPI 待機は、MPI ランタイムが同期化を待機している間に蓄積され、待機が CPU 時間またはスリーピングを使用しているか、または作業が並列実行中であるがスレッドは CPU 上にスケジュールされていない場合に蓄積します。

Linux では、MPI 作業および MPI 待機は、プロセスがユーザーモードまたはシステムモードでアクティブである場合にのみ累積されます。MPI がビジーウェイトを行う必要があるものとして指定しないかぎり、Linux での MPI 待機は有用ではありません。


注 -  Linux で Oracle Message Passing Toolkit 8.2 または 8.2.1 を使用する場合、回避策が必要になる場合があります。バージョン 8.1 または 8.2.1c では、または Oracle Solaris Studio コンパイラを使用している場合はすべてのバージョンで、回避策は必要ありません。

Oracle Message Passing Toolkit のバージョンは、/opt/SUNWhpc/HPC8.2.1 などのインストールパスで示されています。または、mpirun —V と入力して表示される次のような出力では、斜体の部分でバージョンが示されています。

mpirun (Open MPI) 1.3.4r22104-ct8.2.1-b09d-r70

アプリケーションを GNU または Intel コンパイラでコンパイルし、Oracle Message Passing Toolkit 8.2 または 8.2.1 を MPI 用に使用している場合、MPI の状態データを取得するには、Oracle Message Passing Toolkit の link コマンドで –WI および –-enable-new-dtags オプションを使用する必要があります。これらのオプションを使用すると実行可能ファイルで RPATH に加えて RUNPATH が定義され、MPI 状態ライブラリが LD_LIBRARY_PATH 環境変数で有効になります。