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) プローブは、ページフォルト、ページ入出力、ページデーモン、スワッパーに関する情報を提供します。
ページフォルトプローブは、仮想アドレスを障害の種類とファイル (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_start と pageout_scan_end によってトレースされます。これらのプローブは、検査前に必要な空きページ数、検査されたページ数、検査前と検査後の空きページ数を報告します。検査によってキューに入れられた pageout 要求がすべて完了すれば、さらに多くのページが開放される可能性があります。
以下の 3 つのプローブによって、スワッパーの活動状況がトレースされます。
swapout_process プローブは、プロセスアドレス空間のスワップアウトをトレースして、プロセス識別子と、開放されたページまたは出力用にキューに入れられたページの総数を記録します。
swapout_lwp プローブは、LWP のスタックページのスワップアウトをトレースして、LWP の識別情報と出力用にキューに入れられたページ数を記録します。
swapin_lwp プローブは、LWP のスタックページのスワップインをトレースして、LWP の識別情報と取り込まれたスタックページ数を記録します。
strategy プローブは、カーネルによるローカルブロックデバイス入出力の開始をトレースして、転送に関係するデバイス番号、論理ブロック番号、サイズ、バッファーポインタ、バッファーフラグを記録します。このフラグ値は、<sys/buf.h> で定義されているバッファー状態フラグです。
biodone プローブは、バッファー付き入出力転送の完了、つまりカーネルの biodone(9f) ルーチンの呼び出しをトレースします。このプローブは、転送に関係するデバイス番号、論理ブロック番号、バッファーポインタを記録します。
物理 (生の) 入出力は、physio(9f) の 2 つのプローブ physio_start と physio_end によってトレースされます。これらのプローブは、デバイス番号、オフセット、サイズ、入出力転送の方向を記録します。
thread_queue プローブは、スレッドのスケジューリングをトレースします。スケジューリングされているスレッドのスレッド識別子、スレッドが配置されているディスパッチキューに関連付けられている CPU、スレッドのディスパッチ優先順位、ディスパッチキュー上にある実行可能スレッドの現在の数を記録します。