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

印刷ビューの終了

更新: 2016 年 6 月
 
 

データ収集に関する制限事項

このセクションでは、ハードウェア、オペレーティングシステム、プログラムの実行方法、またはコレクタ自体によって課される、データ収集の制限事項について説明します。

異なるデータ型の同時収集について制限はありません。任意のデータ型をそれ以外の任意のデータ型とともに収集できますが、カウントデータは除きます。

デフォルトで、コレクタは深さ上限 256 フレームまでスタックを収集します。スタックがさらに深い場合は、er_print とパフォーマンスアナライザに <Truncated-stack> 関数が表示されることがあります。詳細は、<Truncated-stack> 関数を参照してください。これよりも深いスタックをサポートするには、SP_COLLECTOR_STACKBUFSZ 環境変数に設定されている値を増やします。

クロックプロファイリングに関する制限事項

プロファイリング間隔の最小値と、プロファイリングに使用するクロック分解能は、オペレーティング環境により異なります。最大値は 1 秒に設定されています。プロファイル間隔の値は、時間の分解能のもっとも近い倍数に切り捨てられます。最小値と最大値、およびクロック分解能を表示するには、collect コマンドをほかの引数を指定せずに入力します。

プロファイリングタイマーを使用するプログラムではクロックプロファイリングを行えません。コレクタは、プロファイリングクロックパラメータを設定する setitimer(3) の呼び出しをインターセプトし、ほかのプログラムで使用できないようにします。

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

Linux システムでは、マルチスレッドアプリケーションの時間プロファイリングによって、スレッドの不正確なデータが報告される可能性があります。プロファイルシグナルは、必ずしもカーネルから各スレッドに指定された間隔で配信されるとは限りません。シグナルが間違ったスレッドに配信される場合もあります。使用可能な場合は通常、サイクルカウンタを使用したハードウェアカウンタプロファイリングによって、スレッドのより正確なデータが提供されます。

クロックプロファイリングによる実行時のひずみと実行時間の拡大

クロックプロファイリングでは、SIGPROF シグナルがターゲットに送られたときにデータが記録されます。それによってシグナルを処理するための実行時間の拡大が発生し、呼び出しスタックが展開されます。呼び出しスタックが深く、シグナルが頻繁なほど、実行時間の拡大は大きくなります。一定の範囲までは、クロックプロファイリングにより、ある程度の実行時間の拡大が生じますが、これはもっとも深いスタックで実行するプログラムの各部分の実行時間の拡大が大きくなることから生まれます。

可能な場合、デフォルト値は正確なミリ秒数でなく、システムクロックとの相関を回避するために、正確な数値と多少異なる値 (たとえば、10.007ms または 0.997ms など) に設定されます。システムクロックとの相関はデータのひずみをもたらす場合もあります。Oracle Solaris プラットフォームでは、同じ方法でカスタム値を設定してください (Linux プラットフォーム上では不可能)。

トレースデータの収集に関する制限事項

コレクタライブラリ libcollector.so が事前読み込みされていないかぎり、すでに稼働中のプログラムからはトレースデータを収集できません。詳細は、動作中のプロセスからのトレースデータの収集を参照してください。

トレースによる実行時のひずみと実行時間の拡大

データのトレースは、トレースされるイベント数に比例して実行時間を拡大させます。クロックプロファイリングを同時に行うと、イベントのトレースに起因する実行時間の拡大により、クロックデータにひずみが生じます。

ハードウェアカウンタプロファイリングに関する制限事項

    ハードウェアカウンタプロファイリングには、次のような制限があります。

  • ハードウェアカウンタデータの収集は、ハードウェアカウンタが用意されていてハードウェアカウンタプロファイリングをサポートしているプロセッサでのみ行えます。その他のシステムでは、ハードウェアカウンタプロファイリングは無効です。Oracle Solaris と、Unbreakable Enterprise Kernel または Red Hat 互換のカーネル 6.0 以降を備えた Oracle Linux は、ハードウェアカウンタをサポートします。

  • Oracle Solaris を実行しているシステム上で、cpustat(1) コマンドの実行中にハードウェアカウンタデータを収集することはできません。これは、cpustat がカウンタを制御しており、ユーザープロセスでカウンタを使用できないためです。データ収集中に cpustat を起動すると、ハードウェアカウンタプロファイリングは終了され、実験にエラーが記録されます。root がハードウェアカウンタを使用して er_kernel 実験を開始する場合にも、同じことが当てはまります。

  • ハードウェアカウンタプロファイリングを行う場合、独自のコードでハードウェアカウンタを使用することはできません。コレクタは libcpc ライブラリ関数に割り込み、コレクタからの呼び出しではなかった場合、-1 の戻り値で復帰します。ハードウェアカウンタへのアクセスの取得に失敗した場合に正常に機能するようにプログラムをコーディングする必要があります。この処理を行うようにコーディングされていない場合、ハードウェアカウンタプロファイル時に、スーパーユーザーがカウンタを使用するシステム全体のツールを起動した場合、またはそのシステムでカウンタがサポートされていない場合にプログラムが失敗します。

  • dbx をプロセスに接続することによって、ハードウェアカウンタライブラリを使用している実行中プログラムのハードウェアカウンタデータを収集しようとすると、実験が壊れたり、プログラムが異常終了したりすることがあります。


    注 -  使用可能なすべてのカウンタの一覧を表示するには、ほかの引数を指定せずに collect -h コマンドを実行します。

ハードウェアカウンタプロファイリングによる実行時のひずみと実行時間の拡大

ハードウェアカウンタプロファイリングは、SIGEMT シグナル (Oracle Solaris プラットフォームの場合) または SIGIO シグナル (Linux プラットフォームの場合) がターゲットへ配信された時点のデータを記録します。それによってシグナルを処理するための実行時間の拡大が発生し、呼び出しスタックが展開されます。クロックプロファイリングと違い、ハードウェアカウンタによっては、プログラムのさまざまな部分がその他の部分より高速にイベントを生成する場合があり、そのコード部分に実行時間の拡大が生じます。そのようなイベントを非常に高速に生成するプログラムの一部で大きなひずみが生じる場合があります。同様に、あるスレッドでは、ほかのスレッドと不均等にイベントが生成されるものがあります。

派生プロセスのデータ収集における制限事項

派生プロセスのデータ収集には、いくつかの制限事項があります。

    コレクタでの派生プロセスすべてについてデータを収集するには、次のいずれかのオプションとともに collect コマンドを使用する必要があります。

  • -F on オプションを使用すると、systempopenposix_spawn(3p)、posix_spawnp(3p)、sh への呼び出しによるものを含め、fork とそのバリアント、および exec とそのバリアントへの呼び出しについて、自動的にデータを収集できます。

  • -F all-F on と同じです。

  • –F '=regexp' オプションを使用すると、名前が指定した正規表現と一致するすべての派生プロセスに関するデータを収集できます。

–F オプションについては、実験制御オプションを参照してください。

OpenMP プロファイルに関する制限事項

プログラム実行中に OpenMP データを収集すると非常にコストが高くなる可能性があります。このコストを抑制するには、SP_COLLECTOR_NO_OMP 環境変数を設定します。この設定を行うと、プログラムの遅延は大幅に減少しますが、スレーブスレッドから呼び出し元へ、最終的には main() へ伝搬されるデータは、この変数がない場合には参照可能ですが、この変数を設定すると参照できなくなります。

OpenMP プロファイリング機能は Oracle Developer Studio コンパイラのランタイムに依存しているため、Oracle Developer Studio コンパイラでコンパイルされたアプリケーションに対してのみ使用できます。GNU コンパイラでコンパイルされたアプリケーションの場合、マシンレベルの呼び出しスタックのみが表示されます。

Java プロファイルに関する制限事項

    Java プログラムのデータ収集には、次の制限事項があります。

  • Java 2 Software Development Kit (JDK) の JDK 7、Update 25 (JDK 1.7.0_25) またはそれ以降のバージョンを使用する必要があります。 コレクタは、JDK_HOME 環境変数または JAVA_PATH 環境変数のパスセットに含まれている JDK を最初に探します。これらの変数がいずれも設定されていない場合、使用されている環境の PATH に含まれている JDK を探します。PATH にも JDK が存在しない場合、/usr/java/bin/javajava 実行可能ファイルを探します。

    コレクタは、見つかった java 実行可能ファイルのバージョンが ELF 実行可能ファイルであることを確認します。異なる場合は、使用された環境変数またはパスと試行されたフルパス名を示すエラーメッセージが出力されます。

  • データを収集するには、collect コマンドを使用する必要があります。dbx collector サブコマンドは使用できません。

  • 一部のアプリケーションは純粋な Java ではなく、C または C++ アプリケーションで、dlopen() を起動して libjvm.so をロードしてから、その中への呼び出しを行なって JVM ソフトウェアを開始します。このようなアプリケーションをプロファイルするには、SP_COLLECTOR_USE_JAVA_OPTIONS 環境変数を設定します。この場合は、LD_LIBRARY_PATH 環境変数を設定しないでください。

Java プログラミング言語で書かれたアプリケーションの実行時のひずみと実行時間の拡大

Java のプロファイリングでは、JavaVirtual Machine Tools Interface (JVMTI) が使用され、実行のひずみと実行時間の拡大が発生する場合があります。

クロックプロファイリングとハードウェアカウンタプロファイリングの場合、データ収集プロセスは JVM ソフトウェアへのさまざまな呼び出しを行い、プロファイリングイベントをシグナルハンドラ内で処理します。これらのルーチンのオーバーヘッドとディスクへの実験の書き込みコストにより、Java プログラムの実行時間の拡大が生じます。そのような実行時間の拡大は通常 10% より少なくなります。