ここでは、ハードウェア、オペレーティングシステム、プログラムの実行方法、またはコレクタそのものによって課されるデータ収集の制限事項について説明します。
異なる種類のデータの同時収集に対する制限はありません。すなわち、どのようなデータの種類でも、ほかのデータの種類と同時に収集できます。
プロファイル間隔の最小値とプロファイルに使用する時間の分解能は、特定のオペレーティング環境により異なります。最大値は 1 秒です。プロファイル間隔の値は、時間の分解能のもっとも近い倍数に切り捨てられます。最小値および最大値と時間の分解能を検索するには、引数を付けずに collect コマンドを入力します。
時間ベースのプロファイルでは、SIGPROF シグナルがターゲットに送られたときにデータが記録されます。それによってシグナルを処理するための実行時間の拡大が発生し、呼び出しスタックが展開されます。呼び出しスタックが深く、シグナルが頻繁なほど、実行時間の拡大は大きくなります。一定の範囲までは、時間ベースのプロファイルにより、ある程度の実行時間の拡大が生じますが、これはもっとも深いスタックで実行するプログラムの各部分の実行時間の拡大が大きくなることから生まれます。
可能な場合、デフォルト値は正確なミリ秒数でなく、システムクロックとの相関を回避するために、正確な数値と多少異なる値 (たとえば、10.007ms または 0.997ms など) に設定されます。システムクロックとの相関はデータのひずみをもたらす場合もあります。SPARC プラットフォームでは、同じ方法でカスタム値を設定してください (Linux プラットフォーム上では不可能)。
コレクタライブラリ libcollector.so が事前読み込みされていないかぎり、すでに稼働中のプログラムからはトレースデータを収集できません。詳細は、「動作中のプロセスからのトレースデータの収集」を参照してください。
データのトレースは、トレースされるイベント数に比例して実行時間を拡大させます。時間ベースのプロファイルを同時に行うと、イベントのトレースに起因する実行時間の拡大により、時間データにひずみが生じます。
ハードウェアカウンタオーバーフローのプロファイルには、次のような制限があります。
ハードウェアカウンタオーバーフローデータの収集を行えるのは、ハードウェアカウンタが用意されていてオーバーフロープロファイルをサポートしているプロセッサにおいてだけです。その他のシステムでは、ハードウェアカウンタオーバーフローのプロファイルは行えません。UltraSPARC® III プロセッサファミリより前の UltraSPARC プロセッサは、ハードウェアカウンタオーバーフローのプロファイルをサポートしません。
cpustat(1) が動作しているシステムで、ハードウェアカウンタのオーバーフローデータを収集することはできません。 これは、cpustat がすべてのカウンタを制御しており、ユーザープロセスがカウンタを利用できないためです。データ収集中に cpustat を起動すると、ハードウェアカウンタオーバーフローのプロファイルは終了され、実験にエラーが記録されます。
ハードウェアカウンタオーバーフローのプロファイルを行う場合、独自のコードで libcpc(3) を使用してハードウェアカウンタを使用することはできません。コレクタは libcpc ライブラリ関数に割り込み、コレクタからの呼び出しではなかった場合、-1 の戻り値で復帰します。ハードウェアカウンタへのアクセスの取得に失敗した場合に正常に機能するようにプログラムをコーディングする必要があります。このようにコーディングしなかった場合、ハードウェアカウンタのプロファイル時に、またはルートがカウンタを使用するシステム全体のツールを呼び出した場合にプログラムが失敗します。
dbx をプロセスに接続することによって、ハードウェアカウンタライブラリを使用している実行中プログラムのハードウェアカウンタデータを収集しようとすると、実験が壊れることがあります。
使用可能なすべてのカウンタの一覧を表示するには、引数を指定せずに collect コマンドを実行します。
ハードウェアカウンタのプロファイルでは、SIGEMT がターゲットへ送られたときにデータが記録されます。それによってシグナルを処理するための実行時間の拡大が発生し、呼び出しスタックが展開されます。時間ベースのプロファイルと違い、ハードウェアカウンタによっては、プログラムのさまざまな部分がその他の部分より高速にイベントを生成する場合があり、そのコード部分に実行時間の拡大が生じます。そのようなイベントを非常に高速に生成するプログラムの一部で大きなひずみが生じる場合があります。同様に、あるスレッドでは、ほかのスレッドと不均等にイベントが生成されるものがあります。
派生プロセスに関するデータを収集するには、いくつかの制限事項があります。
コレクタでの派生プロセスすべてについてデータを収集するには、次のいずれかのオプションとともに collect コマンドを使用する必要があります。
-F on オプションを使用すると、fork とそのバリアント、および exec とそのバリアントへの呼び出しについて、自動的にデータを収集できます。
-F all オプションを使用すると、コレクタは、system、popen、および sh の呼び出しに起因するものを含むすべての派生プロセスをたどります。
-F '=regexp' オプションを使用すると、名前または系統が指定した正規表現と一致するすべての派生プロセスに関するデータを収集できます。
-F オプションの詳細については、「実験制御オプション」を参照してください。
Java プログラムに関するデータは収集可能ですが、次の制限事項があります。
1.5.0_03 か、それ以降のバージョンの Java 2 Platform Standard Edition (J2SE) を使用してください。デフォルトでは、collect コマンドは Sun Studio インストーラによって J2SE がインストールされたパス (ある場合) を使用します。JDK_HOME 環境変数または JAVA_PATH 環境変数を設定すると、このデフォルトパスをオーバーライドできます。コレクタはこれらの環境変数で検出した java のバージョンが ELF 実行可能ファイルであるかどうかを確認し、ELF 実行可能ファイルでない場合には、使用した環境変数と試したフルパス名を示すエラーメッセージを出力します。
データの収集には、collect コマンドを使用する必要があります。dbx collector サブコマンドや IDE のデータ収集機能は使用できません。
JVM ソフトウェアを実行する派生プロセスを作成するアプリケーションはプロファイルできません。
64 ビットの JVM ソフトウェアを使用するには、-j on フラグを使用し、64 ビット JVM ソフトウェアをターゲットとして指定する必要があります。64 ビット JVM ソフトウェアを使用してデータを収集するのに、java -d64 を使用しないでください。これを使用すると、データは収集されません。
Java のプロファイリングでは、Java Virtual Machine Tools Interface (JVMTI) が使用され、実行のひずみと実行時間の拡大が発生する場合があります。
時間ベースのプロファイリングとハードウェアカウンタオーバーフローのプロファイルリングの場合、データ収集プロセスは JVM ソフトウェアへのさまざまな呼び出しを行い、プロファイリングイベントをシグナルハンドラ内で処理します。これらのルーチンのオーバーヘッドとディスクへの実験の書き込みコストにより、Java プログラムの実行時間の拡大が生じます。そのような実行時間の拡大は通常 10% より少なくなります。
同期トレースの場合は、データ収集でその他の JVMTI イベントを使用するので、アプリケーション内のモニター競合の量に比例して実行時間の拡大が発生します。