ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: パフォーマンスアナライザ Oracle Solaris Studio 12.3 Information Library (日本語) |
er_kernel ユーティリティーを実行すると、カーネルのみ、またはカーネルと実行中の負荷の両方をプロファイリングできます。er_kernel コマンドの詳細な説明については er_kernel (1) のマニュアルページを参照してください。
使用方法のメッセージを表示するには、er_kernel コマンドを引数なしで実行します。
% er_kernel -p on
カーネル時間プロファイリングによって 2 つのメトリックが生成されます。カーネルの親実験に記録される時間プロファイルイベントに対する「KCPU サイクル」(メトリック名 kcycles) と、CPU がユーザーモードのときにユーザープロセスのサブ実験に記録される時間プロファイルイベントに対する「KUCPU サイクル」(メトリック名 kucycles) です。パフォーマンスアナライザでは、これらのメトリックがカーネル関数については「関数」タブ、呼び出し先と呼び出し元については「呼び出し元 - 呼び出し先」タブ、命令については「逆アセンブリ」タブに表示されます。「ソース」タブにはデータは表示されません。カーネルモジュールは、通常、出荷時点ではファイルおよび行シンボルテーブル情報 (スタブ) を含んでいないからです。
er_kernel ユーティリティーへの -p on 引数を、高分解能プロファイルの場合は < -p high に、低分解能プロファイルの場合は -p low に置き換えることができます。 負荷の実行に 2 ~ 20 分を要すると思われる場合は、デフォルトの時間プロファイルが適切です。実行に要する時間が 2 分未満と思われる場合は -p high を使用し、20 分を超えると思われる場合は -p low を使用します。
-t 所要時間 引数を追加でき、これを追加すると er_kernel ユーティリティーは 所要時間 で指定された時間に従って自動的に終了します。
-t 所要時間は、m (分) または s (秒) のサフィックスを付けた単数で指定できます。これは、実験を強制終了するまでの時間 (分または秒) を示します。 デフォルトでは、所要時間は秒です。所要時間 はハイフンで区切られた 2 つの数で指定することもできます。これは、1 つ目の時間が経過するまでデータ収集を停止し、そして、データ収集を始める時間を示しています。2 つ目の時間が経過すると、データ収集が終了されます。2 つ目の時間がゼロの場合、初めてプログラムが停止したあと、そのプログラムの実行の終わりまで、データの収集が実行されます。実験が終了しても、ターゲットプロセスは最後まで実行できます。
期間または間隔が指定されていない場合、er_kernel は停止するまで実行されます。停止させるには、Ctrl-C (SIGINT) を押します。あるいは、kill コマンドを使用し、SIGINT か SIGQUIT か SIGTERM を er_kernel プロセスに送信しても停止させることもできます。er_kernel プロセスは、これらの信号のいずれかを受け取ると、実験を終了し (-A off が指定されていない限り)、er_archive を実行します。er_archive ユーティリティーは、実験で参照されている共有オブジェクトのリストを読み取り、それぞれについてアーカイブファイルを構築します。
-v引数を追加すると、実行に関するより多くの情報を画面に出力できます。 -n 引数を使用すると、実際には何も記録せずに、記録される実験のプレビューを表示できます。
デフォルトでは、er_kernel ユーティリティーによって生成される実験の名前は ktest.1.er で、続けて実験が生成されると番号が順に増えていきます。
プログラムでもスクリプトでも、負荷として使用する単一のコマンドがある場合、次のようにします。
% er_kernel -p on load
load がスクリプトの場合は、生成されたコマンドがあればそれらの終了を待ってから終了するようにしてください。そうしないと、実験が途中で終了する可能性があります。
% analyzer ktest.1.er
er_kernelユーティリティーは子プロセスをフォークし、休眠期間だけ一時停止したあと、子プロセスが指定された負荷を実行します。負荷が終了すると、er_kernel ユーティリティーは再び休眠期間だけ一時停止し、そのあと終了します。実験は、負荷の実行中、およびその前後の休眠期間での Oracle Solaris カーネルの動作を示します。休眠期間の長さは、er_kernel コマンドへの -q 引数によって秒単位で指定できます。
負荷として使用する単一のプログラムがあり、そのプロファイルをカーネルプロファイルと一緒に表示することに関心がある場合は、次のようにします。
% er_kernel collect load
% analyzer ktest.1.er test.1.er
ktest.1.erアナライザによって表示されるデータは、test.1.er からのカーネルプロファイルと <literal>test.1.er</literal> からのユーザープロファイルの両方を示します。「タイムライン」タブを使用すると、2 つの実験間の相関関係がわかります。
注 - スクリプトを負荷として使用し、スクリプトのさまざまな部分のプロファイリングを個別に行うには、スクリプト内の各種コマンドの前に collect コマンドと適切な引数を付加します。
er_kernel ユーティリティーは、DTrace の cpc プロバイダを使ってカーネルのハードウェアカウンタオーバーフロープロファイルを収集できますが、このプロバイダは、Oracle Solaris 11 を実行しているシステム上でのみ使用できます。
カーネルのハードウェアカウンタオーバーフロープロファイリングを実行するには、collect コマンドの場合と同様に、-h オプションを er_kernel コマンドで使用します。ただし、er_kernel ではデータ領域プロファイリングはサポートされていないため、データ領域要求は無視されます。
collect コマンドと同様に、-p オプションを明示的に指定せずに -h オプションを使用すると、時間ベースのプロファイルが無効となります。ハードウェアカウンタデータと時間ベースデータの両方を収集するには、-h オプションと -p オプションを指定する必要があります。
ハードウェアカウンタオーバーフローのプロファイリングをサポートするプロセッサを備えたマシンでハードウェアカウンタを表示するには、er_kernel —h コマンドをほかの引数なしで実行します。
チップ上のオーバーフローのメカニズムにより、どのカウンタがオーバーフローしたかをカーネルが知ることができる場合には、チップが提供するすべてのカウンタのプロファイリングを行えますが、それ以外の場合、指定できるカウンタは 1 つだけです。er_kernel —h の出力には、複数のカウンタを使用できるかどうかを示すために、「最大 4 つの HW カウンタを使用する HW カウンタプロファイリングを指定できます」といったメッセージが表示されます。
システムのハードウェアカウンタメカニズムは、ユーザープロファイリングには複数のプロセスで使用できますが、いずれかのユーザープロセス、cputrack ユーティリティー、または別の er_kernel プロセスがこのメカニズムを使用している場合、カーネルプロファイリングには使用できません。別のプロセスがハードウェアカウンタを使用している場合、er_kernel は「このシステムでは HW カウンタのプロファイリングはサポートされていません」と報告します。
ハードウェアカウンタのプロファイリングの詳細については、「ハードウェアカウンタオーバーフローのプロファイルデータ」および 「-h counter_definition_1...[, counter_definition_n]」を参照してください。
ハードウェアカウンタオーバーフローのプロファイリングの詳細については、er_print のマニュアルページも参照してください。
er_kernel ユーティリティーでは、カーネルおよびアプリケーションのプロファイリングを実行できます。-F オプションを使用すれば、アプリケーションのプロセスを追跡し、そのデータを記録するかどうかを制御できます。
-F onまたは -F all オプションを使用すると、er_kernel は、カーネルのほかに、すべてのアプリケーションプロセスに関する実験を記録します。er_kernel 実験の収集中に検出されたユーザープロセスが追跡され、追跡されたプロセスごとにサブ実験が作成されます。
root ユーザー以外で er_kernel を実行した場合、非特権ユーザーは通常ほかのユーザーのプロセスについて何も読み取ることができないため、多くのサブ実験は記録されない可能性があります。
十分な権限がある場合、ユーザープロセスのデータはプロセスがユーザーモードのときだけ記録され、ユーザー呼び出しスタックだけが記録されます。追跡された各プロセスのサブ実験には、kucycles メトリックのデータが含まれています。サブ実験には、_process-name_PID_process-pid.1.er の形式を使用して名前が付けられます。たとえば、sshd プロセスに関して実行された実験には、_sshd_PID_1264.1.er という名前が付けられることがあります。
一部のユーザープロセスだけを追跡するには、-F =regexp を使用して正規表現を指定し、正規表現に一致する名前または PID を持つプロセスに関する実験を記録できます。
たとえば、er_kernel -F =synprog では、synprog というプログラムのプロセスが追跡されます。
正規表現については、regexp(5) のマニュアルページを参照してください。
デフォルトでは、-F off オプションが設定されるため、er_kernel はユーザープロセスのプロファイリングを実行しません。
注 - er_kernel の -F オプションは、collect の -F オプションとは異なります。collect —F コマンドは、コマンド行で指定したターゲットによって作成されたプロセスだけを追跡する場合に使用し、er_kernel —F は、システムで現在実行されているすべてのプロセスを追跡する場合に使用します。