Go to main content
Oracle® Solaris 11.3 デバイスドライバの記述

印刷ビューの終了

更新: 2016 年 11 月
 
 

ドライバのチューニング

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 のタイプを buscontrollerdevice_errordiskhatkmem_cachestatmiscnetnfspages partitionrpsUfavmmem のいずれかに分類します。

ks_crtime

stat が作成された時間。ks_crtime は一般に、各種カウンタのレートを計算するときに使用されます。

ks_data

stat のデータセクションを指します。

ks_data_size

データセクションの合計サイズ (バイト)。

ks_instance

この stat を作成したカーネルモジュールのインスタンス。ks_instanceks_moduleks_name と組み合わせることで、意味のある一意の名前が stat に付けられます。

ks_kid

stat の一意の ID。

ks_module[KSTAT_STRLEN]

この stat を作成したカーネルモジュールを識別します。ks_moduleks_instanceks_name と組み合わせることで、意味のある一意の名前が stat に付けられます。KSTAT_STRLENks_module の最大長を設定します。

ks_name[KSTAT_STRLEN]

ks_module および ks_instance とともに stat に割り当てられた名前。KSTAT_STRLENks_module の最大長を設定します。

ks_ndata

複数レコードをサポートする stat タイプ KSTAT_TYPE_RAWKSTAT_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 物理層インタフェースのカーネル統計
stat 変数
タイプ
説明
xcvr_addr
KSTAT_DATA_UINT32
現在使用中のトランシーバの MEI アドレスを提供します。
  • (0) - (31) は、ある特定の Ethernet デバイスで使用中の物理層デバイスの MEI アドレス用です。

  • (-1) は、外部的にアクセス可能な MEI インタフェースが存在しないため、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_inusecap_* を組み合わせて不足する定義を導出することで、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_pause = 0 受信輻輳に基づいてポーズを送信します。

  • cap_pause = 1 ポーズを受信し、輻輳を避けるために送信速度を落とします。

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_cap_pause = 0 受信輻輳に基づいてポーズを送信します。

  • adv_cap_pause = 1 ポーズを受信し、輻輳を避けるために送信速度を落とします。

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_cap_pause = 0 リンク先が受信輻輳に基づいてポーズを送信します。

  • lp_cap_pause = 1 リンク先がポーズを受信し、輻輳を避けるために送信速度を落とします。

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_pause = 0 このステーションが受信輻輳に基づいてポーズを送信します。

  • link_pause = 1 このステーションがポーズを受信し、輻輳を避けるために送信速度を落とします。

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を参照してください。