この章では、Solaris OS が負荷を実行中に、Oracle Solaris Studio のパフォーマンスツールを使用してカーネルのプロファイリングを行う方法について説明します。カーネルプロファイリングは、Oracle Solaris Studio ソフトウェアを Solaris 10 OS 上で実行している場合に使用できます。カーネルプロファイリングは Solaris 9 OS および Linux システムでは利用できません。
この章では、次の内容について説明します。
カーネルプロファイルを er_kernelユーティリティーで記録できます。
er_kernel ユーティリティーは、Oracle Solaris 10 オペレーティングシステムに組み込まれている包括的な動的トレース機能である DTrace を使用します。
er_kernel ユーティリティーは、カーネルプロファイルデータを取り込み、そのデータをアナライザの実験としてユーザープロファイルと同じ形式で記録します。この実験は、er_print ユーティリティーまたはパフォーマンスアナライザによって処理できます。カーネル実験は、関数データ、呼び出し元と呼び出し先のデータ、命令レベルのデータ、およびタイムラインを示すことができますが、ほとんどの Solaris OS モジュールが行番号テーブルを保持していないため、ソース行データを示すことはできません。
er_kernel ユーティリティーを使用してカーネルプロファイリングを行う前に、DTrace へのアクセスを設定しておく必要があります。
通常、DTrace は root ユーザーだけに制限されています。root 以外のユーザーとして er_kernelユーティリティーを 実行するには、特別な権限の割り当てを受けて、sys グループのメンバーになる必要があります。必要な権限を割り当てるには、次の行を /etc/user_attr ファイルに追加します。
username::::defaultpriv=basic,dtrace_kernel,dtrace_proc |
自分自身を sys グループに追加するには、自分のユーザー名を /etc/group ファイル内の sys行に追加します。
er_kernel ユーティリティーを実行すると、カーネルのみ、またはカーネルと実行中の負荷の両方をプロファイリングできます。er_kernel コマンドの詳細な説明については er_kernel (1) のマニュアルページを参照してください。
次のように入力し、実験を収集します。
% er_kernel -p on |
任意の負荷を別のシェルで実行します。
負荷が完了したら、Ctrl-C キーを押して er_kernel ユーティリティーを終了します。
デフォルトでは ktest.1.erという名前の結果の実験を、パフォーマンスアナライザまたは er_print ユーティリティーに読み込みます。
カーネルの時間プロファイルによって、「KCPU サイクル」というラベルの付いたパフォーマンスメトリックが 1 つ生成されます。パフォーマンスアナライザでは、「関数」タブのカーネル関数について示され、「呼び出し元 - 呼び出し先」タブでは呼び出し先と呼び出し元について示され、「逆アセンブリ」タブでは命令について示されます。「ソース」タブにはデータは表示されません。カーネルモジュールは、通常、出荷時点ではファイルおよび行シンボルテーブル情報 (スタブ) を含んでいないからです。
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 |
次のように入力し、実験を解析します。
% analyzer ktest.1.er |
er_kernelユーティリティーは子プロセスをフォークし、休眠期間だけ一時停止したあと、子プロセスが指定された負荷を実行します。負荷が終了すると、er_kernel ユーティリティーは再び休眠期間だけ一時停止し、そのあと終了します。実験は、負荷の実行中、およびその前後の休眠期間での Solaris OS の動作を示します。休眠期間の長さは、er_kernel コマンドへの -q 引数によって秒単位で指定できます。
負荷として使用する単一のプログラムがあり、そのプロファイルをカーネルプロファイルと一緒に表示することに関心がある場合は、次のようにします。
er_kernel コマンドと collectコマンドの両方を次のように入力することにより、カーネルプロファイルとユーザープロファイルの両方を収集します。
% er_kernel collect load |
2 つのプロファイルを一緒に解析するには、次のように入力します。
% analyzer ktest.1.er test.1.er |
ktest.1.erアナライザによって表示されるデータは、test.1.er からのカーネルプロファイルと <literal>test.1.er</literal> からのユーザープロファイルの両方を示します。 タイムラインを使用すると、2 つの実験間の相関関係がわかります。
スクリプトを負荷として使用し、そのさまざまな部分のプロファイリングを行うには、スクリプト内の各種コマンドの前にcollectコマンドと適切な引数を付加します。
er_kernel ユーティリティーを 1 つ以上の -T 引数を使用して起動すると、次のように特定のプロセスまたはスレッドのプロファイリングを指定できます。
-T pid/ tid (特定のプロセスとカーネルスレッドの場合)
-T 0/ did (特定の純カーネルスレッドの場合)
ターゲットのスレッドは、それらのスレッドについて er_kernel ユーティリティーを起動する前に作成されている必要があります。
1 つ以上の -T 引数を指定した場合は、Kthr 時間というラベルの付いた追加メトリックが生成されます。データは、CPU 上で実行されているかどうかに関わらず、プロファイリングされたすべてのスレッドについて取得されます。プロセスが中断されている (関数 <SLEEPING>) か CPU を待っている (関数 <STALLED>) かを示すために、特殊な単一フレームの呼び出しスタックが使用されます。
Kthr 時間 メトリックスが高く、KCPU サイクルメトリックスが低い関数は、プロファイリングされたスレッドが何か別のイベントを待って大量の時間を消費している関数です。
カーネル実験内に記録されたフィールドのいくつかは、ユーザーモード実験での同じフィールドとは異なる意味を持っています。ユーザーモード実験には、単一のプロセス ID についてのデータのみが含まれています。カーネル実験には、多数の異なるプロセス ID に適用できるデータが含まれています。その情報を適切に示すために、アナライザのいくつかのフィールドラベルは、次の表に示すとおり、2 つのタイプの実験で異なる意味を持っています。
表 9–1 アナライザにおけるカーネル実験のフィールドラベルの意味
アナライザのラベル |
ユーザーモード実験での意味 |
カーネル実験での意味 |
---|---|---|
LWP |
ユーザープロセス LWP ID |
プロセスの PID。カーネルスレッドの場合は 0。 |
Thread |
プロセス内のスレッド ID |
カーネルスレッドのカーネル DID |
たとえば、カーネル実験で少数のプロセス ID にのみフィルタを実行する場合は、「データをフィルタ」ダイアログボックスの「LWP」フィルタフィールドに、対象とする PID (単数または複数) を入力します。