Sun Studio 12: パフォーマンスアナライザ

第 5 章 カーネルプロファイリング

この章では、Solaris OS が負荷を実行中に、Sun Studio のパフォーマンスツールを使用してカーネルのプロファイリングを行う方法について説明します。カーネルプロファイリングは、Sun Studio ソフトウェアを Solaris 10 OS 上で実行している場合に使用できます。カーネルプロファイリングは Solaris 9 OS および Linux システムでは利用できません。

カーネル実験

カーネルプロファイルを er_kernel ユーティリティーで記録できます。

er_kernel ユーティリティーは、Solaris 10 OS に組み込まれている包括的な動的トレース機能である 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 コマンドの詳細な説明については、er_kernel (1) のマニュアルページを参照してください。

Procedureカーネルのプロファイリング

  1. 次のように入力し、実験を収集します。


    % er_kernel -p on
    
  2. 任意の負荷を別のシェルで実行します。

  3. 負荷が完了したら、Ctrl-C キーを押して er_kernel ユーティリティーを終了します。

  4. デフォルトでは 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 つ目の時間がゼロの場合、初めてプログラムが停止したあと、そのプログラムの実行の終わりまで、データの収集が実行されます。実験が終了しても、ターゲットプロセスは最後まで実行できます。

    -v 引数を追加すると、実行に関するより多くの情報を画面に出力できます。-n 引数を使用すると、実際には何も記録せずに、記録される実験のプレビューを表示できます。

    デフォルトでは、er_kernel ユーティリティーによって生成された実験は、ktest.1.er という名前になります。この番号は、後続の実行ごとに増分されます。

Procedure負荷の下でのプロファイリング

プログラムでもスクリプトでも、負荷として使用する単一のコマンドがある場合、次のようにします。

  1. 次のように入力し、実験を収集します。


    % er_kernel -p on load
    
  2. 次のように入力し、実験を解析します。


    % analyzer ktest.1.er
    

    er_kernel ユーティリティーは子プロセスをフォークし、休眠期間だけ一時停止したあと、子プロセスが指定された負荷を実行します。負荷が終了すると、er_kernel ユーティリティーは再び休眠期間だけ一時停止し、そのあと終了します。実験は、負荷の実行中、およびその前後の休眠期間での Solaris OS の動作を示します。休眠期間の長さは、er_kernel コマンドへの -q 引数によって秒単位で指定できます。

Procedureカーネルと負荷の両方のプロファイリング

負荷として使用する単一のプログラムがあり、そのプロファイルをカーネルプロファイルと一緒に表示することに関心がある場合は、次のようにします。

  1. er_kernel コマンドと collect コマンドの両方を次のように入力することにより、カーネルプロファイルとユーザープロファイルの両方を収集します。


    % er_kernel collect load
    
  2. 2 つのプロファイルを一緒に解析するには、次のように入力します。


    % analyzer ktest.1.er test.1.er
    

    アナライザによって表示されるデータは、ktest.1.er からのカーネルプロファイルと test.1.er からのユーザープロファイルの両方を示します。タイムラインを使用すると、2 つの実験間の相関関係がわかります。


    注 –

    スクリプトを負荷として使用し、そのさまざまな部分のプロファイリングを行うには、スクリプト内の各種コマンドの前に collect コマンドと適切な引数を付加します。


特定のプロセスまたはカーネルスレッドのプロファイリング

er_kernel ユーティリティーを 1 つ以上の -T 引数を使用して起動すると、次のように特定のプロセスまたはスレッドのプロファイリングを指定できます。

ターゲットのスレッドは、それらのスレッドについて er_kernel ユーティリティーを起動する前に作成されている必要があります。

1 つ以上の -T 引数を指定した場合は、 Kthr 時間というラベルの付いた追加メトリックが生成されます。データは、CPU 上で実行されているかどうかに関わらず、プロファイリングされたすべてのスレッドについて取得されます。プロセスが中断されているか (関数 <SLEEPING>) CPU を待っているか (関数 <STALLED>) を示すために、特殊な単一フレームの呼び出しスタックが使用されます。

Kthr 時間 メトリックが高く、KCPU サイクルメトリックが低い関数は、プロファイリングされたスレッドが何か別のイベントを待って大量の時間を消費している関数です。

カーネルプロファイルの分析

カーネル実験内に記録されたフィールドのいくつかは、ユーザーモード実験の同じフィールドとは異なる意味を持っています。ユーザーモード実験には、単一のプロセス ID についてのデータのみが入っています。カーネル実験には、多数の異なるプロセス ID に適用できるデータが入っています。その情報を適切に示すために、アナライザのいくつかのフィールドラベルは、次の表に示すとおり、2 つのタイプの実験で異なる意味を持っています。

表 5–1 アナライザにおけるカーネル実験のフィールドラベルの意味

アナライザのラベル 

ユーザーモード実験での意味 

カーネル実験での意味 

LWP 

ユーザープロセス LWP ID 

プロセス PID。カーネルスレッドの場合は 0 

Thread 

プロセス内のスレッド ID 

カーネル TID。カーネルスレッドのカーネル DID 

たとえば、カーネル実験で少数のプロセス ID のみをフィルタにかける場合は、「データをフィルタ」ダイアログボックスの「LWP」フィルタフィールドに、対象とする PID (単数または複数) を入力します。