ドライバのチューニング
Oracle Solaris OS には、ユーザーがドライバのカウンタを実装できるように、カーネル統計構造体が用意されています。trace 機能を使用すると、パフォーマンスの解析をリアルタイムで行えます。このセクションで説明するデバイスのパフォーマンスに関するトピックは、次のとおりです。
カーネル統計 – Oracle Solaris OS には、カーネル内のパフォーマンス統計を取得するための一連のデータ構造体と関数が用意されています。カーネル統計 (stats と呼ばれる) を使用すると、ドライバは、システムの実行中に連続的な統計情報をエクスポートできます。stat のデータは stat 関数を使用してプログラムで処理されます。
動的計測のための trace - trace を使用すると、ドライバに計測機能を動的に追加できるため、システム解析やパフォーマンス測定などのタスクを実行できます。trace は事前定義の stat 構造体を活用します。
カーネル統計
パフォーマンスチューニングを支援するため、Oracle Solaris カーネルには kstat(3KSTAT) 機能が用意されています。stat 機能が提供する一連の関数やデータ構造体を使用すると、デバイスドライバなどのカーネルモジュールからモジュール固有のカーネル統計をエクスポートできます。
stat は、デバイスの使用に関する定量化可能な側面を記録するためのデータ構造体です。stat は、NULL で終わるリンクリストとして格納されます。各 stat には共通のヘッダーセクションとタイプ固有のデータセクションが含まれます。ヘッダーセクションは kstat_t 構造体によって定義されます。
カーネル統計構造体のメンバー
stat 構造体のメンバーは次のとおりです。
- ks_class[KSTAT_STRLEN]
stat のタイプを bus、controller、device_error、disk、hat、kmem_cache、stat、misc、net、nfs、pages、 partition、rps、Ufa、vm、mem のいずれかに分類します。
- ks_crtime
stat が作成された時間。ks_crtime は一般に、各種カウンタのレートを計算するときに使用されます。
- ks_data
stat のデータセクションを指します。
- ks_data_size
データセクションの合計サイズ (バイト)。
- ks_instance
この stat を作成したカーネルモジュールのインスタンス。ks_instance を ks_module、ks_name と組み合わせることで、意味のある一意の名前が stat に付けられます。
- ks_kid
stat の一意の ID。
- ks_module[KSTAT_STRLEN]
この stat を作成したカーネルモジュールを識別します。ks_module を ks_instance、ks_name と組み合わせることで、意味のある一意の名前が stat に付けられます。KSTAT_STRLEN は ks_module の最大長を設定します。
- ks_name[KSTAT_STRLEN]
ks_module および ks_instance とともに stat に割り当てられた名前。KSTAT_STRLEN は ks_module の最大長を設定します。
- ks_ndata
複数レコードをサポートする stat タイプ KSTAT_TYPE_RAW、KSTAT_TYPE_NAMED、および KSTAT_TYPE_TIMER のデータレコード数を示します。
- ks_next
チェーン内での次の stat を指します。
- ks_resv
予約済みのフィールド。
- ks_snaptime
前回のデータスナップショットのタイムスタンプ (レートの計算時に有用)。
- ks_type
データタイプ。バイナリデータの場合は KSTAT_TYPE_RAW、名前/値ペアの場合は KSTAT_TYPE_NAMED、割り込み統計の場合は KSTAT_TYPE_INTR、入出力統計の場合は KSTAT_TYPE_IO、イベントタイマーの場合は KSTAT_TYPE_TIMER になります。
カーネル統計構造体
さまざまな種類の stat 用の構造体を次に示します。
- kstat(9S)
デバイスドライバからエクスポートされる各カーネル統計 (stat) は、ヘッダーセクションとデータセクションから構成されます。stat(9S) 構造体は統計のヘッダー部分です。
- kstat_intr(9S)
割り込み kstat 用の構造体。割り込みのタイプは次のとおりです。
ハード割り込み - ハードウェアデバイス自体がソースとなる
ソフト割り込み – システムが何らかのシステム割り込みソースを使用することで引き起こされる
ウォッチドッグ割り込み – 定期的なタイマー呼び出しによって引き起こされる
見せかけの割り込み – 割り込みエントリポイントに入ったが、処理するべき割り込みが存在しなかった
複数の処理 – ほかの任意のタイプから制御が戻る直前に、割り込みが検出されて処理された
ドライバは一般に、自身のハンドラから要求されたハード割り込みとソフト割り込みのみを報告しますが、見せかけのクラスの割り込みの測定は、自動ベクトル化デバイスが特定のシステム構成内で任意の割り込み待ち時間の問題を特定する際に役立ちます。同じタイプの割り込みを複数持つデバイスでは、複数の構造体を使用するべきです。
- kstat_io(9S)
入出力 kstat 用の構造体。
- kstat_named(9S)
名前付き stat 用の構造体。名前付き stat は名前-値ペアの配列です。これらのペアは kstat_named 構造体に保持されます。
カーネル統計関数
stat を使用するための関数は次のとおりです。
- kstat_create(9F)
kstat(9S) 構造体を割り当てて初期化します。
- kstat_delete(9F)
システムから stat を削除します。
- kstat_install(9F)
完全に初期化された stat をシステムに追加します。
- kstat_named_init(9F)、 kstat_named_setstr(9F)
名前付き stat を初期化します。kstat_named_setstr() は、名前付き stat のポインタに文字列 st を関連付けます。
- kstat_queue(9F)
多数の入出力サブシステムは、管理対象となる基本的なトランザクションキューを少なくとも 2 つ持ちます。1 つは、処理対象として受け付けられたものの、まだ処理が開始されていないトランザクション用のキューです。もう 1 つは、アクティブに処理されているものの、まだ完了していないトランザクション用のキューです。このため、待機時間と実行時間 という 2 つの累計時間統計が保持されます。待機時間は処理の開始前です。実行時間は処理中です。次の kstat_queue() ファミリ関数は、ドライバの待機キューと実行キュー間の遷移に基づいてこれらの時間を管理します。
Oracle Solaris Ethernet ドライバのカーネル統計
次の表で説明する stat インタフェースは、Ethernet 物理層の統計をドライバから取得するための効果的な方法です。ユーザーが Ethernet 物理層の問題の診断や修復をより適切に行えるように、Ethernet ドライバからこれらの統計をエクスポートするようにしてください。link_up 以外のすべての統計では、存在しない場合のデフォルト値は 0 になります。link_up 統計の値は 1 を想定します。
次の例では、すべての共有リンク設定を提供しています。この場合、Mei を使用して統計をフィルタリングしています。
stat ce:0:mii:link_*
表 27 Ethernet MII/GMII 物理層インタフェースのカーネル統計
| | |
xcvr_addr
| KSTAT_DATA_UINT32
| 現在使用中のトランシーバの MEI アドレスを提供します。
|
xcvr_id
| KSTAT_DATA_UINT32
| 現在使用中のトランシーバの特定のベンダー ID またはデバイス ID を提供します。
|
xcvr_inuse
| KSTAT_DATA_UINT32
| 現在使用中のトランシーバのタイプを示します。IEEE aPhytType は次のセットを列挙します。 (0) その他、未定義
(1) MEI インタフェースが存在しないが、トランシーバが接続されていない
(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 リンクが動作しています。
|
|
動的計測のための trace
trace は、ユーザープログラムとオペレーティングシステム自体の両方の動作を検査するための包括的な動的トレース機能です。trace を使用すると、環境内の戦略的な場所 (プローブと呼ばれる) でデータを収集できます。trace を使用して、スタックトレース、タイムスタンプ、関数の引数、または単純にプローブの起動回数などのデータを記録できます。trace ではプローブを動的に挿入できるため、コードをコンパイルし直す必要はありません。trace の詳細については、Oracle Solaris 11.3 DTrace (Dynamic Tracing) Guideを参照してください。