ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 10 8/11 Information Library (日本語) |
パート I Solaris プラットフォーム用デバイスドライバの設計
21. ドライバのコンパイル、ロード、パッケージ化、およびテスト
22. デバイスドライバのデバッグ、テスト、およびチューニング
SPARC プラットフォームでの代替カーネルを使用した kmdb のブート
Solaris OS には、ユーザーがドライバのカウンタを実装できるように、カーネル統計構造体が用意されています。DTrace 機能を使用すると、パフォーマンスの解析をリアルタイムで行えます。この節で説明するデバイスのパフォーマンスに関するトピックは、次のとおりです。
「カーネル統計」 – Solaris OS には、カーネル内のパフォーマンス統計を取得するための一連のデータ構造体と関数が用意されています。カーネル統計 (kstat と呼ばれる) を使用すると、ドライバは、システムの実行中に連続的な統計情報をエクスポートできます。kstat データは、kstat 関数を使用してプログラム的に処理されます。
「動的計測を行うための DTrace」 – DTrace を使用すると、ドライバに計測機能を動的に追加できるため、システム解析やパフォーマンス測定などのタスクを実行できます。DTrace では事前定義された kstat 構造体が利用されます。
パフォーマンスチューニングを支援するため、Solaris カーネルには kstat(3KSTAT) 機能が用意されています。kstat 機能が提供する一連の関数やデータ構造体を使用すると、デバイスドライバなどのカーネルモジュールからモジュール固有のカーネル統計をエクスポートできます。
kstat は、デバイスの使用に関する定量化可能な側面を記録するためのデータ構造体です。kstat は、NULL で終わるリンクリストとして格納されます。各 kstat には共通のヘッダーセクションとタイプ固有のデータセクションとが含まれます。ヘッダーセクションは kstat_t 構造体によって定義されます。
http://developers.sun.com/solaris/articles/kstat_api.html の Sun Developer Network にある記事「Using kstat From Within a Program in the Solaris OS」では、kstat(3KSTAT) および libkstat(3LIB) API を使用して Solaris OS からメトリックスを抽出する方法についての実践的な例が 2 つ提供されています。これらの例は、「Walking Through All the kstat」と「Getting NIC kstat Output Using the Java Platform」です。
kstat のタイプを bus、controller、device_error、disk、hat、kmem_cache、kstat、misc、net、nfs、pages、 partition、rps、ufs、vm、vmem のいずれかに分類します。
kstat が作成された時刻。ks_crtime は一般に、各種カウンタのレートを計算するときに使用されます。
kstat のデータセクションを指します。
データセクションの合計サイズ (バイト)。
この kstat を作成したカーネルモジュールのインスタンス。ks_instance を ks_module、ks_name と組み合わせることで、意味のある一意の名前が kstat に付けられます。
kstat の一意の ID。
この kstat を作成したカーネルモジュールを識別します。ks_module を ks_instance、ks_name と組み合わせることで、意味のある一意の名前が kstat に付けられます。KSTAT_STRLEN は ks_module の最大長を設定します。
ks_module および ks_instance とともに kstat に割り当てられた名前。KSTAT_STRLEN は ks_module の最大長を設定します。
複数レコードをサポートする kstat タイプ KSTAT_TYPE_RAW、KSTAT_TYPE_NAMED、および KSTAT_TYPE_TIMER のデータレコード数を示します。
チェーン内での次の kstat を指します。
予約済みのフィールド。
前回のデータスナップショットのタイムスタンプ。レートの計算時に役立ちます。
データタイプ。バイナリデータの場合は KSTAT_TYPE_RAW、名前/値ペアの場合は KSTAT_TYPE_NAMED、割り込み統計の場合は KSTAT_TYPE_INTR、入出力統計の場合は KSTAT_TYPE_IO、イベントタイマーの場合は KSTAT_TYPE_TIMER になります。
デバイスドライバからエクスポートされる各カーネル統計 (kstat) は、ヘッダーセクションとデータセクションから構成されます。kstat(9S) 構造体は統計のヘッダー部分です。
割り込み kstat 用の構造体。割り込みのタイプは次のとおりです。
ハード割り込み – ハードウェアデバイス自体がソースとなる
ソフト割り込み – システムが何らかのシステム割り込みソースを使用することで引き起こされる
ウォッチドッグ割り込み – 定期的なタイマー呼び出しによって引き起こされる
見せかけの割り込み – 割り込みエントリポイントに入ったが、処理するべき割り込みが存在しなかった
複数の処理 – ほかの任意のタイプから制御が戻る直前に、割り込みが検出されて処理された
ドライバは一般に、自身のハンドラから要求されたハード割り込みとソフト割り込みのみを報告しますが、見せかけのクラスの割り込みの測定は、自動ベクトル化デバイスが特定のシステム構成内で任意の割り込み待ち時間の問題を特定する際に役立ちます。同じタイプの割り込みを複数持つデバイスでは、複数の構造体を使用するべきです。
入出力 kstat 用の構造体。
名前付き kstat 用の構造体。名前付き kstat は名前-値ペアの配列です。これらのペアは kstat_named 構造体に保持されます。
kstat(9S) 構造体を割り当てて初期化します。
システムから kstat を削除します。
完全に初期化された kstat をシステムに追加します。
名前付き kstat を初期化します。kstat_named_setstr() は、名前付き kstat のポインタに文字列 str を関連付けます。
多数の入出力サブシステムは、管理対象となる基本的なトランザクションキューを少なくとも 2 つ持ちます。1 つは、処理対象として受け付けられたものの、まだ処理が開始されていないトランザクション用のキューです。もう 1 つは、アクティブに処理されているものの、まだ完了していないトランザクション用のキューです。このため、待機時間と実行時間 という 2 つの累計時間統計が保持されます。待機時間は処理の開始前です。実行時間は処理中です。次の kstat_queue() ファミリ関数は、ドライバの待機キューと実行キュー間の遷移に基づいてこれらの時間を管理します。
次の表で説明する kstat インタフェースは、Ethernet 物理層の統計をドライバから取得するための効果的な方法です。ユーザーが Ethernet 物理層の問題の診断や修復をより適切に行えるように、Ethernet ドライバからこれらの統計をエクスポートするようにしてください。link_up 以外のすべての統計では、存在しない場合のデフォルト値は 0 になります。link_up 統計の値は 1 を想定します。
次の例では、すべての共有リンク設定を提供しています。この場合、mii を使用して統計をフィルタリングしています。
kstat ce:0:mii:link_*
表 22-2 Ethernet MII/GMII 物理層インタフェースのカーネル統計
|
DTrace は、ユーザープログラムとオペレーティングシステム自体の両方の動作を検査するための包括的な動的トレース機能です。DTrace を使用すると、プローブと呼ばれる環境内の戦略的な場所で、データを収集できます。DTrace では、スタックトレースやタイムスタンプ、関数の引数などのデータを記録できるほか、単純にプローブの起動回数を記録することもできます。DTrace ではプローブを動的に挿入できるため、コードをコンパイルし直す必要はありません。DTrace の詳細については、『Solaris 動的トレースガイド』および『DTrace ユーザーガイド』を参照してください。DTrace BigAdmin System Administration Portal には、DTrace に関する記事、XPerts セッション、およびその他の情報へのリンクが多数含まれています。