JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: パフォーマンスアナライザ     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  パフォーマンスアナライザの概要

2.  パフォーマンスデータ

3.  パフォーマンスデータの収集

4.  パフォーマンスアナライザツール

5.   er_print コマンド行パフォーマンス解析ツール

6.  パフォーマンスアナライザとそのデータについて

データ収集の動作

実験の形式

archives ディレクトリ

サブ実験

動的関数

Java 実験

実験の記録

collect 実験

dbx でプロセスを作成する実験

dbx による実行中のプロセスの実験

パフォーマンスメトリックの解釈

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

タイミングデータは統計データとして収集されます。

タイミングメトリックの比較

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

データ領域プロファイリングとメモリー領域プロファイリング

同期待ちトレース

ヒープトレース

MPI トレース

呼び出しスタックとプログラムの実行

シングルスレッド実行と関数呼び出し

共有オブジェクト間の関数の呼び出し

シグナル

トラップ

末尾呼び出しの最適化

明示的なマルチスレッド化

Java テクノロジーベースのソフトウェア実行の概要

Java 呼び出しスタックとマシン呼び出しスタック

時間ベースのプロファイリングとハードウェアカウンタオーバーフローのプロファイリング

Java プロファイリングの表示モード

Java プロファイリングデータのユーザー表示モード

Java プロファイリングデータの上級表示モード

Java プロファイリングデータのマシン表示モード

OpenMP実行の概要

OpenMP プロファイルデータのユーザー表示モード

擬似関数

ユーザーモード呼び出しスタック

OpenMP メトリック

OpenMP プロファイリングデータの上級表示モード

OpenMP プロファイリングデータのマシン表示モード

不完全なスタック展開

中間ファイル

プログラム構造へのアドレスのマッピング

プロセスイメージ

ロードオブジェクトと関数

別名を持つ関数

一意でない関数名

ストリップ済み共有ライブラリの静的関数

Fortran での代替エントリポイント

クローン生成関数

インライン関数

コンパイラ生成の本体関数

アウトライン関数

動的にコンパイルされる関数

<Unknown> 関数

OpenMP の特殊な関数

<JVM-System> 関数

<no Java callstack recorded> 関数

<Truncated-stack> 関数

<Total> 関数

ハードウェアカウンタオーバーフロープロファイルに関連する関数

インデックスオブジェクトへのパフォーマンスデータのマッピング

プログラムデータオブジェクトへのデータアドレスのマッピング

データオブジェクト記述子

<Total> データオブジェクト

<Scalars> データオブジェクト

<Unknown> データオブジェクトとその要素

メモリーオブジェクトへのパフォーマンスデータのマッピング

7.  注釈付きソースと逆アセンブリデータについて

8.  実験の操作

9.  カーネルプロファイリング

索引

パフォーマンスメトリックの解釈

各イベントのデータには、高精度のタイムスタンプ、スレッド ID、および CPU ID が含まれています。これらを使用すると、パフォーマンスアナライザ内のメトリックを時刻、スレッド、または CPU で絞り込むことができます。CPU ID については、getcpuid(2) のマニュアルページを参照してください。getcpuid を利用できないシステムでのプロセッサ ID は -1 であり、Unknown にマップされます。

各イベントでは、共通データ以外に、以降の節で説明する固有の raw データが生成されます。これらの節ではまた、raw データから得られるメトリックの精度と、データ収集がメトリックに及ぼす影響についても説明しています。

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

時間ベースのプロファイリングのイベント固有のデータは、プロファイル間隔カウント値の配列で構成されています。Oracle Solaris では、間隔カウンタが提供されます。プロファイル間隔の最後で適切な間隔カウンタが 1 増分され、別のプロファイル信号がスケジューリングされます。配列が記録およびリセットされるのは、Solaris スレッドが CPU ユーザーモードに入った場合だけです。配列のリセット時には、ユーザー CPU 状態の配列要素が 1 に設定され、ほかの全状態の配列要素が 0 に設定されます。配列データが記録されるのは、配列がリセットされる前にユーザーモードに入るときです。そのため、この配列には、前回ユーザーモードに入ってから開始された各マイクロステート (Solaris スレッドごとにカーネルによって保持されている 10 のマイクロステートのそれぞれ) のカウントの累計値が含まれます。Linux オペレーティングシステムでは、マイクロステートは存在しません。唯一の間隔カウンタがユーザー CPU 時間です。

呼び出しスタックは、データと同時に記録されます。プロファイル間隔の最後に Solaris スレッドがユーザーモードになっていない場合は、そのスレッドが再びユーザーモードに入るまで、呼び出しスタックを変更できません。すなわち、呼び出しスタックには、各プロファイル間隔の最後のプログラムカウンタの位置が常に正確に記録されます。

Oracle Solaris で各マイクロステートが貢献しているメトリックを表 6-1 に示します。

表 6-1 カーネルのマイクロステートとメトリックとの対応関係

カーネルのマイクロステート
内容の説明
メトリック名
LMS_USER
ユーザーモードで動作
ユーザー CPU 時間
LMS_SYSTEM
システムコールまたはページフォルトで動作
システム CPU 時間
LMS_TRAP
上記以外のトラップで動作
システム CPU 時間
LMS_TFAULT
ユーザーテキストページフォルトでスリープ
テキストページフォルト時間
LMS_DFAULT
ユーザーデータページフォルトでスリープ
データページフォルト時間
LMS_KFAULT
カーネルページフォルトでスリープ
ほかの待ち時間
LMS_USER_LOCK
ユーザーモードロック待ちのスリープ
ユーザーロック時間
LMS_SLEEP
ほかの理由によるスリープ
ほかの待ち時間
LMS_STOPPED
停止 (/proc、ジョブ制御、lwp_stop のいずれか)
ほかの待ち時間
LMS_WAIT_CPU
CPU 待ち
CPU 待ち時間

タイミングデータは統計データとして収集されます。

このため、ほかの統計的な標本収集手法と同様に、あらゆる誤差の影響を受けます。プログラムの実行時間が非常に短い場合は、少数のプロファイルパケットしか記録されず、多くのリソースを消費するプログラム部分が、呼び出しスタックに反映されないことがあります。このため、目的の関数またはソース行について数百のプロファイルパケットを蓄積するのに十分な時間または十分な回数に渡って、プログラムを実行するようにしてください。

統計的な標本収集の誤差のほかに、データの収集?関連付け方法、システムにおけるプログラムの実行の進み具合を原因とする誤差もあります。次に示す環境などでは、タイミングメトリックでデータに不正確さやひずみが生じる可能性があります。

これらの不正確さのほかに、データ収集処理そのものが原因でタイミングメトリックが不正確になります。記録はプロファイルシグナルによって開始されるため、プロファイルパケットの記録に費やされた時間が、プログラムのメトリックに反映されることはありません。これは、相関関係の別の例です。記録に費やされたユーザー CPU 時間は、記録されるあらゆるマイクロステート値に配分されます。この結果、ユーザー CPU 時間のメトリックが実際より小さくなり、その他のメトリックが実際より大きくなります。デフォルトのプロファイル間隔の場合、一般に、データの記録に費やされる時間は CPU 時間の 2、3% 未満です。

タイミングメトリックの比較

時間ベースの実験のプロファイリングで得られたタイミングメトリックと、その他の方法で得られた時間を比較する場合は、次の点に注意する必要があります。

シングルスレッドアプリケーションの場合、1 つのプロセスについて記録されたスレッドの合計時間は、同じプロセスについて gethrtime(3C) によって返される値と比較して、誤差は通常数十分の 1 パーセントです。CPU 時間の場合は、同じプロセスについて gethrvtime(3C) によって返される値と比較して、数パーセント程度異なることがあります。負荷が大きい場合は、差がさらに大きくなることがあります。ただし、CPU 時間の差は規則的なひずみを表すものではなく、関数、ソース行などについて報告される相対時間に大きなひずみはありません。

パフォーマンスアナライザの報告するスレッド時間は、vmstat が CPU 全体にまたがって集計した時間を報告するため、vmstat の報告する時間とかなり異なることがあります。たとえば、ターゲットプロセスの LWP 数が、そのプロセスが動作するシステムの CPU 数よりも多い場合、アナライザは、vmstat が報告する時間よりもずっと長い待ち時間を報告します。

パフォーマンスアナライザの「統計」タブと er_print 統計ディスプレイに表示されるマイクロステート時間値は、プロセスファイルシステムの /proc 使用報告に基づいており、この報告には、マイクロステートで費やされる時間が高い精度で記録されます。詳細は、proc (4) のマニュアルページを参照してください。これらのタイミング値と <Total> 関数 (プログラム全体を表す) のメトリックを比較することによって、集計されたタイミングメトリックのおおよその精度を知ることができます。ただし、「統計」タブに表示される値には、<Total> のタイミングメトリック値に含まれないそのほかの関連要素が含まれることがあります。その原因は、データ収集が一時停止される期間によるものです。

ユーザー CPU 時間とハードウェアカウンタサイクル時間は異なります。なぜなら、ハードウェアカウンタは、CPU モードがシステムモードへ切り替えられたときにオフにされるからです。詳細は、Trapsを参照してください。「トラップ」

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

ハードウェアカウンタオーバーフローのプロファイルデータには、カウンタ ID とオーバーフロー値が含まれます。この値は、カウンタがオーバーフローするように設定されている値よりも大きくなることがあります。これは、オーバーフローが発生して、そのイベントが記録されるまでの間に命令が実行されるためです。この値は特に、浮動小数点演算やキャッシュミスなどのカウンタよりも、ずっと頻繁に増分されるサイクルカウンタや命令カウンタの場合に大きくなる可能性があります。イベント記録時の遅延はまた、呼び出しスタックとともに記録されたプログラムカウンタのアドレスが正確にオーバーフローイベントに対応しないことを意味します。詳細は、Attribution of Hardware Counter Overflowsを参照してください。「ハードウェアカウンタオーバーフローの関連付け」また、Trapsも参照してください。「トラップ」トラップおよびトラップハンドラは、ユーザーの CPU 時間とサイクルカウンタによって報告される時間の間の、大きな相違の原因になることがあります。

動作クロック周波数が動的に変わるマシンで記録される実験では、サイクルベースのカウントから時間への変換で不正確さが生じます。

収集されるデータ量は、オーバーフロー値に依存します。選択した値が小さすぎると、次のような影響が出ることがあります。

データ領域プロファイリングとメモリー領域プロファイリング

データ領域プロファイリングは、メモリー参照に対して使用されるハードウェアカウンタプロファイリングの拡張版です。ハードウェアカウンタプロファイリングでは、メトリックをユーザー関数、ソース行、および命令に割り当てることができますが、参照されるデータオブジェクトに割り当てることはできません。デフォルトでは、コレクタはユーザー命令アドレスのみを取得します。データ領域プロファイリングが有効な場合、コレクタはデータアドレスも取得します。バックトラッキングとは、データ領域プロファイリングをサポートするパフォーマンス情報を取得するために一部のマシンで使用されるテクニックです。バックトラッキングが有効な場合、コレクタは、ハードウェアカウンタイベント前に発生したロード命名またはストア命令に戻って、そのイベントの原因になった可能性のある命令の候補を1つ見つけます。一部のシステムでは、カウンタが高精度で、バックトラッキングは必要ありません。そのようなカウンタは、collect -h コマンドの出力で precise という語で示されます。

データ領域プロファイルは、メモリー関連イベントが発生した命令だけではなく、イベントの原因となったデータオブジェクト参照に対してキャッシュミスなどのメモリー関連イベントが報告されるデータコレクションです。

メモリー領域プロファイルはデータ領域プロファイルに似ていますが、メモリー領域プロファイルでは、プログラムのデータオブジェクトではなく、キャッシュラインやページなどのメモリーサブシステムのコンポーネントに対してイベントが報告されます。メモリーに関連する高精度カウンタの先頭に + 記号を付けると、メモリー領域プロファイリングが実行されます。

データ領域プロファイリングを可能にするには、ターゲットは、-xhwcprof フラグと -xdebugformat=dwarf -g フラグを付けて SPARC アーキテクチャー用にコンパイルされた C、C++、または Fortran プログラムである必要があります。さらに、収集されるデータは、メモリー関係のカウンタのハードウェアカウンタプロファイルである必要があり、カウンタ名の前に + 記号が付いている必要があります。すべてではなく 1 つのメモリー関連カウンタの前にオプションの + を付加した場合、+ のないカウンタは、「データ収集中に Dataspace データが要求されていない」というサブタイプで、<Unknown> データオブジェクトに対するデータ領域データを報告します。

高精度割り込みを備えたマシンでは、バックトラッキングは不要で、メモリー領域プロファイリングにはコンパイル時の -xhwcprof フラグと -xdebugformat=dwarf -g フラグは必要ありません。そのようなマシンでも、データ領域プロファイリングにはフラグが必要です。

実験にデータ領域またはメモリー領域のプロファイルが含まれている場合、er_print ユーティリティーでは、メモリーオブジェクト関連の各種コマンドのほかに、3 つの追加コマンド data_objectsdata_single、および data_layout を使用できます。詳細は、「ハードウェアカウンタデータ領域およびメモリーオブジェクトリストを制御するコマンド」を参照してください。

さらに、パフォーマンスアナライザには、データ領域プロファイリング関係の 2 つのタブ「データオブジェクト」タブと「データレイアウト」タブと、メモリーオブジェクト用の各種のタブが含まれています。「「データオブジェクト」タブ」「「データレイアウト」タブ」、および 「メモリーオブジェクトのタブ」を参照してください。

ほかの引数なしで collect -h を実行すると、ハードウェアカウンタが一覧表示され、それらが、ロード関係なのか、ストア関係なのか、ロード-ストア関係なのか、および高精度かどうかが示されます。「ハードウェアカウンタオーバーフローのプロファイルデータ」を参照してください。

同期待ちトレース

コレクタは、スレッドライブラリ libthread.so 内の関数の呼び出し、またはリアルタイム拡張ライブラリ librt.so の呼び出しをトレースすることによって、同期遅延イベントを収集します。イベント固有のデータは、要求と許可 (トレース対象の呼び出しの始まりと終わり) の高分解能のタイムスタンプと、同期オブジェクト (要求された相互排他ロックなど) のアドレスとで構成されます。スレッド ID と LWP ID は、データが記録された時点での ID です。待ち時間は、要求時刻と許可時刻の時間差で示されます。記録されるイベントは、指定したしきい値を要求と許可の時間差が超えたものだけです。同期待ちトレースデータは、許可時に実験ファイルに記録されます。

遅延の原因となったイベントが完了しないかぎり、待ちスレッドがほかの作業を行うことはできません。この待ち時間は、「同期待ち時間」と「ユーザーロック時間」の両方に反映されます。同期遅延しきい値は短時間の遅延を排除するので、「ユーザーロック時間」が「同期待ち時間」よりも大きくなる可能性があります。

待ち時間は、データ収集のオーバーヘッドによってひずみます。そして、このオーバーヘッドは、収集されたイベントの個数に比例します。オーバーヘッドに費やされる待ち時間の一部は、イベント記録のしきい値を大きくすることによって最小化できます。

ヒープトレース

コレクタは、メモリーの割り当てと割り当て解除の関数である malloc、realloc、memalign、free に割り込むことによって、これらの関数の呼び出しに関するトレースデータを記録します。メモリーを割り当てるときにこれらの関数を迂回するプログラムの場合、トレースデータは記録されません。別のメカニズムが使用されている Java メモリー管理では、トレースデータは記録されません。

トレース対象の関数は、さまざまなライブラリから読み込まれる可能性があります。パフォーマンスアナライザで表示されるデータは、読み込み対象の関数が属しているライブラリに依存することがあります。

短時間で大量のトレース対象関数を呼び出すプログラムの場合、プログラムの実行に要する時間が大幅に長くなることがあります。延びた時間は、トレースデータの記録に使用されます。

MPI トレース

MPI トレースは、VampirTrace データコレクタの修正版をベースにしています。詳細は、Technische Universität Dresden Web サイトにある『VampirTrace User Manual』を参照してください。