プログラミングユーティリティ

スレッドプローブ

thread_create プローブは、カーネルスレッドの作成をトレースします。このプローブは、プロセス識別子、カーネルスレッド識別子、新しいスレッドの開始ルーチンのカーネルアドレスを記録します。

thread_exit プローブは、現在のスレッドの終了を記録します。

スレッド状態の移り変わりをトレースするプローブは、マイクロステートプローブと呼ばれます。このプローブは、スレッド状態とスレッド識別子 (オプション) を記録します。スレッド識別子が指定されている場合は、状態変化はそのスレッドに適用されます。スレッド識別子が指定されていない場合は、状態変化は書き込みスレッドに適用されます。

スレッド状態の値には、<sys/msacct.h> で定義されたマイクロステート定数が使用されます。記録されるスレッド状態を表 1-7 に示します。

表 1-7 スレッドマイクロステート定数

状態 

説明 

user

ユーザーモードで実行中 

system

システムモードで実行中 

tfault

ユーザーテキスト障害の初期状態 

dfault

ユーザーデータ障害の初期状態 

trap

その他のトラップの初期状態 

user_lock

ユーザーモードのロックを待つための休眠 

sleep

その他の理由による休眠 

wait_cpu

CPU 待ち (実行可能)  

stopped

停止 (/proc、jobcontrol、lwp_stop)


注 -

トレース量を減らすため、カーネルは、システムコールによって暗黙に示されているシステム状態とユーザー状態との間の遷移はトレースしません。この情報を得るには、システムコールプローブを有効にする必要があります。thread キーを使用してプローブを有効にすると、システムコールプローブは自動的に有効になります。


システムコールプローブ

システムコールの入口および出口のプローブは、ユーザーコードによって明示的に要求されたシステム操作を識別します。

syscall_start プローブは、システムコールの開始とそのシステムコール番号を記録します。システムコールの引数を捕捉するのはかなり大きな負荷がかかるので、このプローブはシステムコールの引数は捕捉しません (ユーザーレベルで C ライブラリのエントリポイントにプローブを挿入すると、システムコールの引数についての情報の一部を捕捉できます)。また、この syscall_start プローブは、system 状態に入ったときに現在のスレッドを暗黙的に記録します。

syscall_end プローブは、システムコールの終了、そのシステムコールの 2 つの戻り値、および errno 値を記録します。また、この syscall_end プローブは、user 状態に入ったときに現在のスレッドを暗黙に記録します。


注 -

このレベルでのシステムコールの実装は、Solaris のリリースによって異なります。各システムコールに対応する番号がどのリリースでも同じとは考えないでください。


VM プローブ

仮想メモリーサブシステム (VM) プローブは、ページフォルト、ページ入出力、ページデーモン、スワッパーに関する情報を提供します。

ページフォルト

ページフォルトプローブは、仮想アドレスを障害の種類とファイル (vnodes) に関係付けます。

address_fault プローブは、アドレス空間障害をトレースして、障害が発生した仮想アドレス、障害の種類、要求されたアクセス権を記録します。

障害の種類およびアクセス権の種類を表す値には、<vm/seg_enum.h> で定義された定数が使用されます。障害の種類には、無効なページ (軽い障害)、アクセス権障害、物理的な入出力用のページのロック/ロック解除を行うソフトウェア要求 (softlock と softunlock) があります。アクセス権の種類には、読み取り、書き込み、実行、作成があります。

major_fault プローブは、深刻なページフォルトをトレースします。このプローブは、障害を解決する際に必要となる vnode とオフセットを記録します。この 2 つの組み合わせによって、ファイルシステムのページが識別されます。このデータを現在のスレッドの直前の address_fault イベントに相互に関連付けて、障害が発生した仮想アドレスを知ることができます。

anon_private プローブは、コピー時の書き込み障害をトレースします。

anon_zero プローブは、zero-fill 障害をトレースします。

page_unmap プローブは、物理ページとファイルシステムページとの間の分離を記録します (たとえば、ページの名前が変更されたときや、ページが削除されたときなど)。

ページ入出力

pagein プローブは、ページイン要求の開始をトレースして、vnode、オフセット、ページインのサイズを記録します。

pageout プローブは、ページアウト要求の完了をトレースして、ページアウトされたページ数、開放されたページ数、ページアウト後に再要求されたページ数を記録します。

ページデーモン

ページデーモン (ページスティーラ) は、2 つのプローブ pageout_scan_startpageout_scan_end によってトレースされます。これらのプローブは、検査前に必要な空きページ数、検査されたページ数、検査前と検査後の空きページ数を報告します。検査によってキューに入れられた pageout 要求がすべて完了すれば、さらに多くのページが開放される可能性があります。

スワッパー

以下の 3 つのプローブによって、スワッパーの活動状況がトレースされます。

ローカル入出力プローブ

strategy プローブは、カーネルによるローカルブロックデバイス入出力の開始をトレースして、転送に関係するデバイス番号、論理ブロック番号、サイズ、バッファーポインタ、バッファーフラグを記録します。このフラグ値は、<sys/buf.h> で定義されているバッファー状態フラグです。

biodone プローブは、バッファー付き入出力転送の完了、つまりカーネルの biodone(9f) ルーチンの呼び出しをトレースします。このプローブは、転送に関係するデバイス番号、論理ブロック番号、バッファーポインタを記録します。

物理 (生の) 入出力は、physio(9f) の 2 つのプローブ physio_startphysio_end によってトレースされます。これらのプローブは、デバイス番号、オフセット、サイズ、入出力転送の方向を記録します。

その他のプローブ

thread_queue プローブは、スレッドのスケジューリングをトレースします。スケジューリングされているスレッドのスレッド識別子、スレッドが配置されているディスパッチキューに関連付けられている CPU、スレッドのディスパッチ優先順位、ディスパッチキュー上にある実行可能スレッドの現在の数を記録します。