ドライバのチューニング
Oracle Solaris OS には、ユーザーがドライバのカウンタを実装できるように、カーネル統計構造体が用意されています。DTrace 機能を使用すると、パフォーマンスの解析をリアルタイムで行えます。このセクションで説明するデバイスのパフォーマンスに関するトピックは、次のとおりです。
-
「カーネル統計」 – Oracle Solaris OS には、カーネル内のパフォーマンス統計を取得するための一連のデータ構造体と関数が用意されています。カーネル統計 (kstat と呼ばれる) を使用すると、ドライバは、システムの実行中に連続的な統計情報をエクスポートできます。kstat データは、kstat 関数を使用してプログラム的に処理されます。
-
「動的計測を行うための DTrace」 – DTrace を使用すると、ドライバに計測機能を動的に追加できるため、システム解析やパフォーマンス測定などのタスクを実行できます。DTrace では事前定義された kstat 構造体が利用されます。
カーネル統計
パフォーマンスチューニングを支援するため、Oracle Solaris カーネルには kstat(3KSTAT) 機能が用意されています。kstat 機能が提供する一連の関数やデータ構造体を使用すると、デバイスドライバなどのカーネルモジュールからモジュール固有のカーネル統計をエクスポートできます。
kstat は、デバイスの使用に関する定量化可能な側面を記録するためのデータ構造体です。kstat は、NULL で終わるリンクリストとして格納されます。各 kstat には共通のヘッダーセクションとタイプ固有のデータセクションとが含まれます。ヘッダーセクションは kstat_t 構造体によって定義されます。
カーネル統計構造体のメンバー
kstat 構造体のメンバーは次のとおりです。
- ks_class[KSTAT_STRLEN]
kstat のタイプを bus、 controller、 device_error、 disk、 hat、 kmem_cache、 kstat、 misc、 net、 nfs、 pages、 partition、 rps、 ufs、 vm、 vmem のいずれかに分類します。
- ks_crtime
kstat が作成された時間。ks_crtime は一般に、各種カウンタのレートを計算するときに使用されます。
- ks_data
kstat のデータセクションを指します。
- ks_data_size
データセクションの合計サイズ (バイト)。
- ks_instance
この kstat を作成したカーネルモジュールのインスタンス。ks_instance を ks_module、ks_name と組み合わせることで、意味のある一意の名前が kstat に付けられます。
- ks_kid
kstat の一意の ID。
- ks_module[KSTAT_STRLEN]
この kstat を作成したカーネルモジュールを識別します。ks_module を ks_instance、ks_name と組み合わせることで、意味のある一意の名前が kstat に付けられます。KSTAT_STRLEN は ks_module の最大長を設定します。
- ks_name[KSTAT_STRLEN]
ks_module および ks_instance とともに kstat に割り当てられた名前。KSTAT_STRLEN は ks_module の最大長を設定します。
- ks_ndata
複数レコードをサポートする kstat タイプ KSTAT_TYPE_RAW、KSTAT_TYPE_NAMED、および KSTAT_TYPE_TIMER のデータレコード数を示します。
- ks_next
チェーン内での次の kstat を指します。
- ks_resv
予約済みのフィールド。
- ks_snaptime
前回のデータスナップショットのタイムスタンプ。レートの計算時に役立ちます。
- ks_type
データタイプ。バイナリデータの場合は KSTAT_TYPE_RAW、名前/値ペアの場合は KSTAT_TYPE_NAMED、割り込み統計の場合は KSTAT_TYPE_INTR、入出力統計の場合は KSTAT_TYPE_IO、イベントタイマーの場合は KSTAT_TYPE_TIMER になります。
カーネル統計構造体
さまざまな種類の kstat 用の構造体を次に示します。
- kstat(9S)
デバイスドライバからエクスポートされる各カーネル統計 (kstat) は、ヘッダーセクションとデータセクションから構成されます。kstat(9S) 構造体は統計のヘッダー部分です。
- kstat_intr(9S)
割り込み kstat 用の構造体。割り込みのタイプは次のとおりです。
ハード割り込み – ハードウェアデバイス自体がソースとなる
ソフト割り込み – システムが何らかのシステム割り込みソースを使用することで引き起こされる
ウォッチドッグ割り込み – 定期的なタイマー呼び出しによって引き起こされる
見せかけの割り込み – 割り込みエントリポイントに入ったが、処理するべき割り込みが存在しなかった
複数の処理 – ほかの任意のタイプから制御が戻る直前に、割り込みが検出されて処理された
ドライバは一般に、自身のハンドラから要求されたハード割り込みとソフト割り込みのみを報告しますが、見せかけのクラスの割り込みの測定は、自動ベクトル化デバイスが特定のシステム構成内で任意の割り込み待ち時間の問題を特定する際に役立ちます。同じタイプの割り込みを複数持つデバイスでは、複数の構造体を使用するべきです。
- kstat_io(9S)
入出力 kstat 用の構造体。
- kstat_named(9S)
名前付き kstat 用の構造体。名前付き kstat は名前-値ペアの配列です。これらのペアは kstat_named 構造体に保持されます。
カーネル統計関数
kstat を使用するための関数を次に示します。
- kstat_create(9F)
kstat(9S) 構造体を割り当てて初期化します。
- kstat_delete(9F)
システムから kstat を削除します。
- kstat_install(9F)
完全に初期化された kstat をシステムに追加します。
- kstat_named_init(9F)、kstat_named_setstr(9F)
名前付き kstat を初期化します。kstat_named_setstr() は、名前付き kstat のポインタに文字列 str を関連付けます。
- kstat_queue(9F)
多数の入出力サブシステムは、管理対象となる基本的なトランザクションキューを少なくとも 2 つ持ちます。1 つは、処理対象として受け付けられたものの、まだ処理が開始されていないトランザクション用のキューです。もう 1 つは、アクティブに処理されているものの、まだ完了していないトランザクション用のキューです。このため、待機時間と実行時間 という 2 つの累計時間統計が保持されます。待機時間は処理の開始前です。実行時間は処理中です。次の kstat_queue() ファミリ関数は、ドライバの待機キューと実行キュー間の遷移に基づいてこれらの時間を管理します。
Oracle Solaris Ethernet ドライバのカーネル統計
次の表で説明する kstat インタフェースは、Ethernet 物理層の統計をドライバから取得するための効果的な方法です。ユーザーが Ethernet 物理層の問題の診断や修復をより適切に行えるように、Ethernet ドライバからこれらの統計をエクスポートするようにしてください。link_up 以外のすべての統計では、存在しない場合のデフォルト値は 0 になります。link_up 統計の値は 1
を想定します。
次の例では、すべての共有リンク設定を提供しています。この場合、mii を使用して統計をフィルタリングしています。
kstat ce:0:mii:link_*
表 23-2 Ethernet MII/GMII 物理層インタフェースのカーネル統計
|
|
|
xcvr_addr |
KSTAT_DATA_UINT32 |
現在使用中のトランシーバの MII アドレスを提供します。
|
xcvr_id |
KSTAT_DATA_UINT32 |
現在使用中のトランシーバの特定のベンダー ID またはデバイス ID を提供します。 |
xcvr_inuse |
KSTAT_DATA_UINT32 |
現在使用中のトランシーバのタイプを示します。IEEE aPhytType は次のセットを列挙します。
(0) その他、未定義
(1) MII インタフェースが存在しないが、トランシーバが接続されていない
(2) 10Mbps Clause 7 10Mbps Manchester
(3) 100BASE-T4 Clause 23 100Mbps 8B/6T
(4) 100BASE-X Clause 24 100Mbps 4B/5B
(5) 100BASE-T2 Clause 32 100Mbps PAM5X5
(6) 1000BASE-X Clause 36 1000Mbps 8B/10B
(7) 1000BASE-T Clause 40 1000Mbps 4D-PAM5
このセットは、ifMauType で指定されるセットより小さくなります。ifMauType
は、前出のすべてとその半二重/全二重オプションを含むように定義されています。この情報は cap_* 統計から提供可能であるため、xcvr_inuse と cap_* を組み合わせて不足する定義を派生させることで、ifMayType のすべての組み合わせを提供できます。 |
cap_1000fdx |
KSTAT_DATA_CHAR |
デバイスが 1Gbps 全二重をサポートすることを示します。 |
cap_1000hdx |
KSTAT_DATA_CHAR |
デバイスが 1Gbps 半二重をサポートすることを示します。 |
cap_100fdx |
KSTAT_DATA_CHAR |
デバイスが 100Mbps
全二重をサポートすることを示します。 |
cap_100hdx |
KSTAT_DATA_CHAR |
デバイスが 100Mbps 半二重をサポートすることを示します。 |
cap_10fdx |
KSTAT_DATA_CHAR |
デバイスが 10Mbps 全二重をサポートすることを示します。 |
cap_10hdx |
KSTAT_DATA_CHAR |
デバイスが 10Mbps 半二重をサポートすることを示します。 |
cap_asmpause |
KSTAT_DATA_CHAR |
デバイスが非対称ポーズ Ethernet フロー制御をサポートすることを示します。 |
cap_pause |
KSTAT_DATA_CHAR |
cap_pause が 1 に設定され、 cap_asmpause
が 0 に設定されている場合、デバイスが対称ポーズ Ethernet フロー制御をサポートすることを示します。 cap_asmpause が 1 に設定されている場合、 cap_pause の意味は次のようになります。
|
cap_rem_fault |
KSTAT_DATA_CHAR |
デバイスがリモート障害インジケーションをサポートすることを示します。 |
cap_autoneg |
KSTAT_DATA_CHAR |
デバイスが自動ネゴシエーションをサポートすることを示します。 |
adv_cap_1000fdx |
KSTAT_DATA_CHAR |
デバイスが 1Gbps 全二重のサポートを通知していることを示します。 |
adv_cap_1000hdx |
KSTAT_DATA_CHAR |
デバイスが 1Gbps
半二重のサポートを通知していることを示します。 |
adv_cap_100fdx |
KSTAT_DATA_CHAR |
デバイスが 100Mbps 全二重のサポートを通知していることを示します。 |
adv_cap_100hdx |
KSTAT_DATA_CHAR |
デバイスが 100Mbps 半二重のサポートを通知していることを示します。 |
adv_cap_10fdx |
KSTAT_DATA_CHAR |
デバイスが 10Mbps 全二重のサポートを通知していることを示します。 |
adv_cap_10hdx |
KSTAT_DATA_CHAR |
デバイスが 10Mbps 半二重のサポートを通知していることを示します。 |
adv_cap_asmpause |
KSTAT_DATA_CHAR |
デバイスが非対称ポーズ Ethernet フロー制御のサポートを通知していることを示します。 |
adv_cap_pause |
KSTAT_DATA_CHAR |
adv_cap_pause が
1 に設定され、 adv_cap_asmpause が 0 に設定されている場合、デバイスが対称ポーズ Ethernet フロー制御のサポートを通知していることを示します。 adv_cap_asmpause が 1 に設定されている場合、 adv_cap_pause の意味は次のようになります。
|
adv_rem_fault |
KSTAT_DATA_CHAR |
リンク先に転送する予定の障害がデバイスで発生していることを示します。 |
adv_cap_autoneg |
KSTAT_DATA_CHAR |
デバイスが自動ネゴシエーションのサポートを通知していることを示します。 |
lp_cap_1000fdx |
KSTAT_DATA_CHAR |
リンク先のデバイスが 1Gbps
全二重をサポートすることを示します。 |
lp_cap_1000hdx |
KSTAT_DATA_CHAR |
リンク先のデバイスが 1Gbps 半二重をサポートすることを示します。 |
lp_cap_100fdx |
KSTAT_DATA_CHAR |
リンク先のデバイスが 100Mbps 全二重をサポートすることを示します。 |
lp_cap_100hdx |
KSTAT_DATA_CHAR |
リンク先のデバイスが 100Mbps 半二重をサポートすることを示します。 |
lp_cap_10fdx |
KSTAT_DATA_CHAR |
リンク先のデバイスが 10Mbps 全二重をサポートすることを示します。 |
lp_cap_10hdx |
KSTAT_DATA_CHAR |
リンク先のデバイスが 10Mbps 半二重をサポートすることを示します。 |
lp_cap_asmpause |
KSTAT_DATA_CHAR |
リンク先のデバイスが非対称ポーズ Ethernet
フロー制御をサポートすることを示します。 |
lp_cap_pause |
KSTAT_DATA_CHAR |
lp_cap_pause が 1 に設定され、 lp_cap_asmpause が 0 に設定されている場合、リンク先のデバイスが対称ポーズ Ethernet フロー制御をサポートすることを示します。 lp_cap_asmpause が 1 に設定されている場合、 lp_cap_pause
の意味は次のようになります。
|
lp_rem_fault |
KSTAT_DATA_CHAR |
リンクの障害がリンク先で発生していることを示します。 |
lp_cap_autoneg |
KSTAT_DATA_CHAR |
リンク先のデバイスが自動ネゴシエーションをサポートすることを示します。 |
link_asmpause |
KSTAT_DATA_CHAR |
リンクが非対称ポーズ Ethernet フロー制御で動作していることを示します。 |
link_pause |
KSTAT_DATA_CHAR |
ポーズ機能の解決を示します。 link_pause が 1 に設定され、 link_asmpause が 0 に設定されている場合、リンクが対称ポーズ Ethernet フロー制御で動作していることを示します。 link_asmpause が
1 に設定されていて、それがリンクのローカルビューに対して相対的である場合、 link_pause の意味は次のようになります。
|
link_duplex |
KSTAT_DATA_CHAR |
リンクのデュプレックスを示します。
link_duplex = 0 リンクが停止しており、デュプレックスは不明です。
link_duplex = 1 リンクが動作しており、モードは半二重です。
link_duplex = 2 リンクが動作しており、モードは全二重です。
|
link_up |
KSTAT_DATA_CHAR |
リンクが動作しているか、それとも停止しているかを示します。
link_up = 0 リンクが停止しています。
link_up = 1 リンクが動作しています。
|
|
動的計測を行うための DTrace
DTrace は、ユーザープログラムとオペレーティングシステム自体の両方の動作を検査するための包括的な動的トレース機能です。DTrace を使用すると、プローブと呼ばれる環境内の戦略的な場所で、データを収集できます。DTrace では、スタックトレースやタイムスタンプ、関数の引数などのデータを記録できるほか、単純にプローブの起動回数を記録することもできます。DTrace ではプローブを動的に挿入できるため、コードをコンパイルし直す必要はありません。DTrace の詳細については、『Oracle Solaris 11.1 Dynamic Tracing Guide』を参照してください