Sysproc プローブ・マネージャー
Sysproc プローブ・マネージャーは、sysproc サブシステムの内部に関する詳細を認識することなく、プロセスまたはスレッドに関連したデータを動的にトレースするためのインフラストラクチャーをユーザーと管理者に提供します。
ユーザーまたは管理者にとって、sysproc サブシステムの性質は、以下の主なカテゴリーに分類されます。
- プロセス (またはスレッド) の作成または終了
- シグナルの生成と配信
- スケジューラーとディスパッチャーのイベント
- DR および CPU バインディング・イベント
プロセス (またはスレッド) の作成または終了
- プロセスが自然に終了したか、エラーのため終了したか?
- プロセスまたはスレッドはいつ作成または終了されたか?
- プロセスが実行された時間の長さは?
- スレッドが例外を受信または例外から戻るときのイベントを追跡する。
シグナルの生成と配信
- 特定ターゲットのシグナル・ソースおよびシグナル情報。
- 非同期シグナルのシグナル配信。
- シグナル・クリアのトレース。
- デフォルト以外のシグナル・ハンドラーがインストールされているときのイベントのトレース。
- 特定ソースのシグナル・ターゲットおよびシグナル情報。
- シグナル・ハンドラーの開始または終了のトレース。
スケジューラーとディスパッチャーのイベント
スケジューラーおよびディスパッチャーは、プロセスまたはスレッドがシステム内でどのように実行されるかを規定します。 管理者は、動的トレース・スケジューラーまたはディスパッチャー・サブシステムを使用することによって、システム・パフォーマンスを分析します。
動的トレース・スケジューラーまたはディスパッチャー・サブシステムは、スレッド保存の理由を検出するのに役立ちます。
- 実行キューからエンキューまたはデキューされるスレッド (複数の場合あり) をトレースする。
- システム内のいずれかのスレッドが優先使用されるときのイベントをトレースする。
- スレッドがイベント中にスリープさせられる時点をトレースする。
- スリープ状態のスレッドがウェイクアップされる時点をトレースする。
- スレッドのディスパッチ待ち時間を追跡する。
- 仮想プロセッサー・フォールディング・イベントを追跡する。
- カーネル・スレッド優先順位の変更をトレースする。
動的再構成 (DR) および CPU バインディング・イベント
このプローブ・クラスは、プロセスにバインドされているリソースを追跡するユーザーに、動的トレース機能を提供します。
- スレッド・バインディングが、ある CPU から別の CPU に変更する時点を追跡する。
- リソースがプロセスに接続または切り離される時点を追跡する。
- CPU バインディング・イベントを追跡する。
- DR イベントの開始または終わりを追跡する。
プローブ指定
Sysproc イベントをプローブするには、Vue スクリプトで以下の形式が使用されなければなりません。
@@sysproc:<sysproc_event>:<pid/tid/*>
最初のタプル @@sysproc は、このプローブが sysproc イベントに固有であることを示します。
2 番目のタプルは、プローブ対象のイベントを指定します。
シグナルを送信するプロセス、またはシグナルを受信するプロセスのいずれかであるシグナル送信イベントが役立つ場合があります。 以下の情報により、このようなプローブ・イベントに適切なフィルターが指定されます。
プローブ・ポイント (対象となるイベント)
Sysproc プローブ・マネージャーによりプローブできるすべてのイベントの簡単な説明が、以下のテーブルに示されています。
| プローブ (sysproc_event) | description |
|---|---|
| forkfail | fork インターフェースの障害を追跡します。 |
| execfail | exec インターフェースの障害を追跡します。 |
| execpass | exec の成功を追跡します。 |
| exit | プロセスの終了を追跡します。 |
| threadcreate | カーネル・スレッドの作成を追跡します。 |
| threadterminate | カーネル・スレッドの終了を追跡します。 |
| threadexcept | プロセス例外を追跡します。 |
| sendsig | 外部ソースによってプロセスに送信されるシグナルを追跡します。 |
| sigqueue | プロセスのキューに入れられたシグナルを追跡します。 |
| sigdispose | シグナル処理を追跡します。 |
| sigaction | シグナル・ハンドラーのインストールと再インストールを追跡します。 |
| sighandlestart | シグナル・ハンドラーが呼び出されようとしている時点を追跡します。 |
| sighandlefinish | シグナル・ハンドラーが完了する時点を追跡します。 |
| changepriority | プロセスの優先順位が変更される時点を追跡します。 |
| onreadyq | カーネル・スレッドが作動可能キューに入る時点を追跡します。 |
| offreadyq | カーネル・スレッドが作動可能キューから出る時点を追跡します。 |
| dispatch | スレッドをスケジュールするためにシステム・ディスパッチャーが呼び出される時点を追跡します。 |
| oncpu | カーネル・スレッドが CPU を獲得する時点を追跡します。 |
| offcpu | カーネル・スレッドが CPU を解放する時点を追跡します。 |
| blockthread | スレッドが CPU を取得しないようにブロックされる時点を追跡します。 |
| foldcpu | CPU コアのフォールディングを追跡します。 |
| bindprocessor | プロセス/スレッドが CPU にバインドされるときのイベントを追跡します。 |
| changecpu | カーネル・スレッドが CPU を一時的に変更するときのイベントを追跡します。 |
| resourceattach | リソースが別のリソースに接続されるときのイベントを追跡する |
| resourcedetach | リソースが別のリソースから切り離されるときのイベントを追跡する |
| drphasestart | drphase が開始する時点を追跡します。 |
| drphasefinish | drphase 完了する時点を追跡します |
プローブ・ポイントでデータにアクセスする方法
ProbeVue は、組み込み変数を使用したデータ・アクセスを可能にします。
- プローブ・マネージャーに関係なく、任意のプローブ・ポイントでアクセス可能。 例:
__curthread。 - 特定のプローブ・マネージャーのプローブ全体でアクセス可能。
- 定義されたプローブ (対象となるイベント) でのみアクセス可能。
タイプ (1) の組み込み値のリストは次のとおりです。
- __trcid
- __errno__kernelmode
- __arg1 to __arg7
- __curthread
- __curproc
- __mst
- __tid
- __pid
- __ppid
- __pgid
- __uid
- __euid
- __ublock
- __execname
- __pname
組み込み変数は、コンテキスト固有およびコンテキスト独立としても分類されます。 コンテキスト固有の組み込み変数は、プローブの実行コンテキストに基づいてデータを提供します。
AIX® カーネルは、スレッドまたは割り込みコンテキストで動作します。 コンテキスト固有のプローブは、プローブがスレッドまたはプロセスのコンテキストで開始されたときに正しい結果を生成します。
割り込み実行コンテキストでコンテキスト固有の組み込み変数から、予期しない結果が取得される可能性があります。 コンテキスト独立組み込み変数は、実行コンテキストに依存せず、プローブ実行環境に関係なく安全にアクセスできます。
| コンテキスト固有の組み込み変数 | コンテキスト独立の組み込み変数 |
|---|---|
| __curthread | __trcid |
| __curproc | __errno |
| __tid | __kernelmode |
| __pid | __arg1 to __arg7 |
| __ppid | __mst |
| __pgid | |
| __uid | |
| __euid | |
| __ublock | |
| __pname | |
| __execname |
プローブ・ポイント
プローブ・ポイントは、プローブが起動される特定のイベントです。 プローブ・ポイントのリストは次のとおりです。
- forkfail
forkfailプローブは、fork が失敗したときに開始します。 このプローブは、fork が失敗した理由を判別します。構文:
@@sysproc:forkfail:<pid/tid/*>サポートされる特殊な組み込み変数
__forkfailinfo { fail_reason; }fail_reason変数には、以下のいずれかの値があります。表 3. fail_reason プローブ: 失敗の理由 理由 説明 FAILED_RLIMIT rlimit 制限のため失敗しました FAILED_ALLOCATIONS 内部リソース割り振りのために失敗しました FAILED_LOADER ローダー・ステージで失敗しました FAILED_PROCDUP procdup で失敗しました サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid,__ublock,__execname,__pname.実行環境
プロセス環境で実行されます。
例
以下の例は、システム内の rlimit のためのすべての fork 障害をモニターする方法を示しています。
@@BEGIN { x = 0; } @@sysproc:forkfail:* when (__forkfailinfo->fail_reason == FAILED_RLIMIT) { printf ("process %s with pid %llu failed to fork a child\n",__pname,__pid); x++; } @@END { printf ("Found %d failures during this vue session\n",x); }- execfail
execfailプローブは、exec関数呼び出しが失敗したときに開始します。 失敗の理由を判別するために、execfailプローブを使用します。構文:
@@sysproc:execfail:<pid/tid/*>表 4. execfail プローブ: 失敗理由 理由 説明 FAILED_PRIVILEGES 新規プロセスが特権の獲得または継承に失敗しました FAILED_COPYINSTR 新規プロセスが命令のコピーに失敗しました FAILED_V_USERACC 新規プロセスが v_useracc 領域の破棄に失敗しました FAILED_CLEARDATA 新規プロセスのデータ消去時に失敗しました FAILED_PROCSEG プロセス専用セグメントの設定に失敗しました FAILED_CH64 64 ビット・プロセスへの変換に失敗しました FAILED_MEMATT メモリー・リソース・セットへの接続に失敗しました FAILED_SRAD srad への接続に失敗しました FAILED_MSGBUF エラー・メッセージ・バッファー長がゼロです FAILED_ERRBUF エラー・メッセージ・バッファーの割り当てに失敗しました FAILED_ENVAR 環境変数の割り当てに失敗しました FAILED_CPYSTR 文字列コピー・エラー FAILED_ERRBUFCPY errmsg_buf からのエラー・メッセージのコピーに失敗しました FAILED_TOOLNGENV Env が割り当て済みメモリーに長すぎます FAILED_USRSTK ユーザー・スタックのセットアップに失敗しました FAILED_CPYARG スタックへの arglist のコピーに失敗しました FAILED_INITPTRACE ptrace の初期化に失敗しました 注: ローダー・エラーが発生した場合は、エラー値に 64 が追加されます。サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid,__ublock,__execname,__pname.実行環境
プロセス環境で実行されます。
- exit
このプローブは、プロセスが終了するときに開始します。 Exit は、システム・コール・マネージャーでもあり、システム・コール・プローブ・マネージャーからトレースされます。
sysprocプローブ・マネージャーから exit システム・コールをプローブすると、exit の性質と理由が明らかになります。 また、カーネル・スペースでユーザー・スレッドが終了し、ユーザー・スペースに戻されない理由も説明します。構文:
@@sysproc:forkfail:<pid/tid/*>以下の理由でプログラムが終了する可能性があります。
- ユーザー・スペース・プログラムがそれ以上処理できないときに最終状態に達した。
- 終端シグナルを受信した。
サポートされる特殊な組み込み変数
__exitinfo{ signo; returnval; iscore; }ここで、signo 値は、プロセス終了の原因となったシグナル番号を示し、returnval は、exit によって戻される値です。 ゼロ以外の signo が有効なのは、プログラムがシグナルによって停止される場合のみです。
iscore変数は、プロセス終了の結果としてコアが生成される場合に設定されます。サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid,__ublock,__execname,__pname.実行環境
プロセス環境で実行されます。
例
以下の例は、
exitイベントのプローブ方法を説明しています。echo '@@sysproc:exit:* { printf (" %s %llu %llu\n", __pname, __pid,__exitinfo->returnval);}' | probevueWhich will produce an output similar to the following. ksh 5833042 0 telnetd 7405958 1 dumpctrl 7405960 0 setmaps 7275006 0 termdef 7274752 0 hostname 7274754 0 id 8257976 0 id 8257978 0 uname 8257980 0 expr 8257982 1- threadcreate
threadcreateプローブは、スレッドが正常に作成されるときに開始します。構文:
@@sysproc:threadcreate:<pid/tid/*>注: 指定するpidまたはtidは、スレッドを作成したプロセスまたはスレッドのプロセス ID またはスレッド ID でなければなりません。サポートされる特殊な組み込み変数
__threadcreateinfo { tid; pri; policy; }ここで、
tidは、作成される新規スレッドのスレッド ID を示し、priority はスレッドの優先順位です。 Policy は、スレッドのスレッド・スケジューリング・ポリシーを示します。表 5. threadcreate プローブのポリシー値 ポリシー 説明 SCHED_OTHER デフォルトの AIX スケジューリング・ポリシー SCHED_FIFO 先入れ先出しスケジューリング・ポリシー SCHED_RR ラウンドロビン・スケジューリング・ポリシー SCHED_LOCAL ローカル・スレッド有効範囲スケジューリング・ポリシー SCHED_GLOBAL グローバル・スレッド有効範囲スケジューリング・ポリシー SCHED_FIFO2 ショート・スリープ後の RQHEAD を使用した FIFO SCHED_FIFO3 常時の RQHEAD を使用した FIFO SCHED_FIFO4 弱い優先使用を使用した FIFO サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid,__ublock,__execname,__pname.実行環境
プロセス環境 (user または kproc) で実行されます。
例
プロセス名、作成プロセス ID、新たに作成されたスレッドの ID、および作成タイム・スタンプを出力するスレッドを作成する、システム内のすべてのプロセスを連続して出力する場合は、次のとおりです。
echo '@@sysproc:threadcreate:* { printf ("%s %llu %llu %A\n",__pname,__pid,__threadcreateinfo->tid,timestamp());}' | probevue次の例に示すような出力が表示されます。
nfssync_kproc 5439964 23921151 Feb/22/15 09:22:38 nfssync_kproc 5439964 24052201 Feb/22/15 09:22:38 nfssync_kproc 5439964 23920897 Feb/22/15 09:22:38 nfssync_kproc 5439964 22479285 Feb/22/15 09:22:55 nfssync_kproc 5439964 23920899 Feb/22/15 09:22:55 nfssync_kproc 5439964 22479287 Feb/22/15 09:22:55- threadterminate
このプローブは、終了するスレッドに対して開始します。
構文:
@@sysproc:threadterminate:<pid/tid/*>注: 指定されたプロセス ID またはスレッド ID は、現在停止しているプロセスまたはスレッドに対応している必要があります。サポートされる特殊な組み込み変数
ありません。
サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
プロセス環境 (user または kproc) で実行されます。
例
プロセス名、作成プロセス ID、新たに作成されたスレッドの ID、および作成タイム・スタンプを出力するスレッドを終了する、システム内のすべてのプロセスを連続して出力する場合は、次のとおりです。
以下の例のような出力が表示されます。# echo '@@sysproc:threadterminate:* { printf ("%s %llu %llu %A\n",__pname,__pid,__tid,timestamp());}' | probevuenfssync_kproc 5439964 23855555 Feb/22/15 09:59:30 nfssync_kproc 5439964 21758249 Feb/22/15 09:59:30 nfssync_kproc 5439964 23855557 Feb/22/15 09:59:30- threadexcept
このプローブは、プログラム例外が発生するときに開始します。 プログラム例外が生成されるのは、システムが、プログラムが正常に継続できない条件を検出する場合です。 例外の中には致命的 (正しくない命令) なものもあれば、リカバリー可能なもの (アドレス・スペース変更) もあります。
構文:
@@sysproc:threadexcept:<pid/tid/*>サポートされる特殊な組み込み変数
__threadexceptinfo { pid; tid; exception; excpt_address }ここで、
pidは、例外を受信したプロセスのプロセス ID を示し、tid は、例外を受信したカーネル・スレッドのスレッド ID であり、excpt_addressは、この例外の原因となったアドレスです。一方、例外は以下のテーブルに示されたいずれかの値を取ることができます。表 6. threadexcept プローブの例外値 例外 説明 EXCEPT_FLOAT 浮動小数点例外 EXCEPT_INV_OP 無効な命令コード EXCEPT_PRIV_OP ユーザー・モードでの特権命令 EXCEPT_TRAP トラップ命令 EXCEPT_ALIGN コードまたはデータの位置合わせ EXCEPT_INV_ADDR 無効なアドレス EXCEPT_PROT 保護 EXCEPT_IO 同期入出力 EXCEPT_IO_IOCC IOCC からの入出力例外 EXCEPT_IO_SGA SGA からの入出力例外 EXCEPT_IO_SLA SLA からの入出力例外 EXCEPT_IO_SCU SCU からの入出力例外 EXCEPT_EOF ファイルの終わり以降への参照 (mmap) EXCEPT_FLOAT_IMPRECISE 不正確な浮動小数点例外 EXCEPT_ESTALE_I 失効したテキスト・セグメント例外 EXCEPT_ESTALE_D 失効したデータ・セグメント例外 EXCEPT_PT_WATCHP ptrace 監視ポイントの検出 サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
プロセス環境または割り込み環境で実行されます。
注: このプローブは割り込みコンテキストで開始できるため、実行コンテキストに依存する__pid、__tidなどの組み込み変数は、プロセスまたはスレッド ID を示していない可能性があります。 このプローブの特殊な組み込みメンバーは、プロセスまたはスレッド用の正しいプロセス ID またはスレッド ID を保証します。例
次の例は、デバッガーによってトレース中のプローブ・イベントによって生成されるトレース・プログラム例外を示しています。
以下の例のような出力が表示されます。# cat threadexcept.e @@sysproc:threadexcept:* { printf ("PID = %llu TID= %llu EXCEPTION=%llu ADDRESS = %llu\n ",__threadexceptinfo->pid,__threadexceptinfo->tid,__threadexceptinfo- >exception,__threadexceptinfo->excpt_address); } Run a debugging session on a program compiled with debugging support # dbx a.out Type 'help' for help. Core file "core" is older than current program (ignored) reading symbolic information ... (dbx) stop in main [1] stop in main (dbx) r [1] stopped in main at line 5 5 int a=5;PID = 6816134 TID= 24052015 EXCEPTION=131 ADDRESS = 268436372- sendsig
このプローブは、外部ソース (他のプロセス、ユーザー・スペースからまたはカーネル・ストリームからのプロセス、または割り込みコンテキスト) を通じてシグナルがプロセスに送信されるときに開始されます。
構文:
@@sysproc:sendsig:<pid/*>__dispatchinfo{ cpuid; <- cpu id oldpid; <- pid of the thread currently running oldtid; <- thread id of the thread currently running oldpriority; <- priority of the thread currenly running newpid; <- pid of the new process process selected for running newtid; <- thread id of the thread selected for running newpriority; <-priority of the thread selected for running }ここで、pid は、シグナルを受信するターゲット・プロセスのプロセス ID です。 このプローブでは、スレッド固有の結果をフィルターに掛けるためにスレッド ID を指定することはできません。
特殊な組み込み変数
_sigsendinfo{ tpid; ← target pid spid; ← source pid signo; ← signal sent }ここで、
tpidはターゲット・ソース・プロセス ID であり、spidはシグナルのソースを識別します。 シグナルがユーザー・スペースまたはプロセス・コンテキストから送信される場合、spidはゼロ以外の値です。 シグナルが例外または割り込みコンテキストから送信される場合、ソース・プロセス ID は 0 です。 シグナル番号情報はsignoに含まれています。サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
プロセス環境または割り込み環境で実行されます。
注: このプローブは割り込みコンテキストで開始できるため、スレッド実行コンテキストに依存する__pid、__tidなどの組み込み関数が、対象のプロセスまたはスレッド ID を示していない可能性があります。 このプローブの特殊な組み込みメンバーは、プロセスまたはスレッド用の正しいプロセス ID またはスレッド ID を保証します。このプローブがプロセス・コンテキストで開始する場合、実行コンテキストに依存する組み込みメンバーは、ソース・プロセスを指し示します。
.__pid、__tid、および__curthreadなどの組み込みメンバーは、ソース・プロセスに関する情報を提供します。例
以下の例のような出力が表示されます。To continuously print signal source signal target and signal number of all signals. echo '@@sysproc:sendsig:* {printf ("Source=%llu Target=%llu sig=%llu\n",__sigsendinfo->spid,__sigsendinfo->tpid,__sigsendinfo->signo);}' | probevueSource=0 Target=6619618 sig=14 Source=0 Target=8257944 sig=20 Source=0 Target=8257944 sig=20- sigqueue
このプローブは、キューに入れられたシグナルがプロセスに送信されるときに開始します。
構文:
@@sysproc:sigqueue:<pid/*>特殊な組み込み変数
_sigsendinfo{ tpid; ← target pid spid; ← source pid preprocess.cp signo; ← signal sent }posix シグナルはプロセスのキューに入れられるので、このプローブではスレッド ID を指定することはできません。
サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.このプローブは、送信プロセスのコンテキストで開始します。 そのため、コンテキスト・ベースの組み込み変数は、このプローブ・イベントの送信プロセスを参照します。
実行環境
このプローブは、プロセス・コンテキストで実行されます。
例
以下の例のような出力が表示されます。echo '@@sysproc:sigqueue:*{printf ("%llu %llu %llu\n",__sigsendinfo->spid,__sigsendinfo->tpid,__sigsendinfo->signo);}' | probevue8258004 6095294 31 sigdispose Syntax : @@sysproc:sigdispose:<pid/tid/*>シグナルがターゲット・プロセスに配置されるときに、プローブが開始します。 このプローブをフィルターに掛けるために、sysprobe 指定でこのシグナルを受信したプロセスのプロセス ID を指定します。
特殊な組み込み変数
__sigdisposeinfo{ tpid; ← target pid ttid; ← target tid signo; ← signal whose action is being taken. fatal; ← will be set if the process is going to be killed as part of signal action }サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
このプローブは、プロセス・コンテキストまたは割り込みコンテキストから開始できます。 割り込みコンテキストから開始された場合、このプローブは、コンテキスト・ベースの組み込み変数に必要な値を提供しない可能性があります。
例
プロセス ID、スレッド ID、シグナル番号を連続して出力し、このシグナル処理の結果、システム内のすべてのプロセスについてプロセスが終了するかどうかを示します。
以下の例のような出力が表示されます。cat sigdispose.e @@sysproc:sigdispose:* { printf ("%llu %llu %llu %llu\n",__sigdisposeinfo->tpid,__sigdisposeinfo->ttid, __sigdisposeinfo->signo,__sigdisposeinfo->fatal); }5964064 20840935 14 0 1 65539 14 0 4719084 19530213 14 0- sigaction
構文:
@@sysproc:sigaction:<pid/tid/*>このプローブは、シグナル・ハンドラーのインストールまたは置き換えが行われるときに開始します。
特殊な組み込み変数
__sigactioninfo{ old_sighandle; ← old signal handler function address new_sighandle; ←new signal handler function address signo; ← Signal number rpid; ← requester's pid }old_sighandleは、シグナル・ハンドラーが初めてインストールされる場合は、0 になります。サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
このプローブは、プロセス環境で開始します。
注: AIX カーネルでは、一度に 1 つのシグナルのみがプロセスまたはスレッドに送信されます。 そのプロセスまたはスレッドにもう 1 つのシグナルが送信されるのは、シグナルの配信が完了した場合のみです。例
システム内のすべてのシグナルの開始と完了を追跡する場合は、次のとおりです。
以下の例のような出力が表示されます。@@sysproc:sighandlestart:* { signal[__tid] = __sighandlestartinfo->signo; printf ("Signal handler at address 0x%x invoked for thread id %llu to handle signal %llu\n",__sighandlestartinfo- >sighandle,__curthread->tid,__sighandlestartinfo->signo); } @@sysproc:sighandlefinish:* { printf ("Signal handler completed for thread id %llu for signal %llu\n",__curthread->tid,signal[__tid]); delete (signal,__tid); }Signal handler at address 0x20001d58 invoked for thread id 19923365 to handle signal 20 Signal handler completed for thread id 19923365 for signal 20 Signal handler at address 0x10003400 invoked for thread id 20840935 to handle signal 14 Signal handler completed for thread id 20840935 for signal 14 Signal handler at address 0x10002930 invoked for thread id 19530213 to handle signal 14 Signal handler completed for thread id 19530213 for signal 14 Signal handler at address 0x300275d8 invoked for thread id 22348227 to handle signal 14 Signal handler completed for thread id 22348227 for signal 14 Signal handler at address 0x20001a3c invoked for thread id 65539 to handle signal 14 Signal handler completed for thread id 65539 for signal 14- sighandlefinish
このプローブは、シグナル・ハンドラーの完了で開始します。
構文:
@@sysproc:sighandlestart:<pid/tid/*>サポートされる特殊な組み込み変数: なし
サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
プロセス環境で実行されます。 保護されたコンテキスト切り替えは、実行中の CPU では許可されません。
- changepriority
このプローブは、プロセスの優先順位が変更されるときに開始します。 このイベントはスケジューラーまたはディスパッチャーによって実施されるイベントではありません。
構文:
@@sysproc:changepriority:<pid/tid/*>注: 優先順位の変更も失敗する可能性があります。優先順位の変更の成功は保証されません。サポートされる特殊な組み込み変数
__chpriorityinfo{ pid; old_priority; <- current priority new_priority; <- new scheduling priority of the thread. }実行環境
このプローブは、プロセス環境で実行されます。
サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid,__ublock,__execname,__pname.例
優先順位が変更されるすべてのプロセスを追跡する場合は、次のとおりです。
以下の例のような出力が表示されます。echo '@@sysproc:changepriority:* { printf ("%s priority changing from %llu to %llu\n",__pname,__chpriorityinfo->old_priority,__chpriorityinfo- >new_priority);}' | probevuexmgc priority changing from 60 to 17 xmgc priority changing from 17 to 60 xmgc priority changing from 60 to 17 xmgc priority changing from 17 to 60 xmgc priority changing from 60 to 17- offreadyq
このプローブは、スレッドがシステム実行キューから除去されるときに開始します。
構文:
@@sysproc:offreadyq:<pid/tid/*>Special built-ins supported __readyprocinfo{ pid; <- process id of thread becoming ready tid; <- Thread id. priority; <- priority of the thread }サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
プロセス環境または割り込み環境で実行されます。
ユース・ケース: 作動可能キューに戻るために入出力操作を実行しているスレッドに必要な時間をトレースします。
以下の例のような出力が表示されます。@@BEGIN { printf (" Pid Tid Time Delta\n"); } @@sysproc:offreadyq :* { ready[__tid] = timestamp(); printf ("offreadyq: %llu %llu %W\n",__readyprocinfo->pid,__readyprocinfo->tid,ready[__tid]); } @@sysproc:onreadyq :* { if (diff_time(ready[__tid],0,MICROSECONDS)) { auto:diff = diff_time (ready[__tid],timestamp(),MICROSECONDS); printf ("onreadyq : %llu %llu %W %llu\n",__readyprocinfo->pid,__readyprocinfo->tid,ready[__tid],diff); delete (ready,__tid); } }Pid Tid Time Delta offreadyq: 7799280 20709717 5s 679697µs onreadyq : 7799280 20709717 5s 679697µs 6 offreadyq: 7799280 20709717 5s 908716µs onreadyq : 7799280 20709717 5s 908716µs 3 offreadyq: 7799280 20709717 6s 680186µs onreadyq : 7799280 20709717 6s 680186µs 5 offreadyq: 7799280 20709717 6s 710720µs onreadyq : 7799280 20709717 6s 710720µs 4 offreadyq: 7799280 20709717 6s 800720µs onreadyq : 7799280 20709717 6s 800720µs 2 offreadyq: 7799280 20709717 6s 882231µs onreadyq : 7799280 20709717 6s 882231µs 2 offreadyq: 7799280 20709717 6s 962313µs onreadyq : 7799280 20709717 6s 962313µs 2 offreadyq: 7799280 20709717 6s 980311µs onreadyq : 7799280 20709717 6s 980311µs 2- onreadyq
このプローブは、スレッドがシステム作動可能キューにエンキューされるか、作動可能キュー内の位置が変更されるときに開始します。
構文:
@@sysproc:offreadyq:<pid/tid/*>サポートされる特殊な組み込み変数
__readyprocinfo{ pid; <- process id of thread becoming ready tid; <- Thread id. priority; <- priority of the thread }サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
プロセス環境または割り込み環境で実行されます。
- dispatch
このプローブは、特定の CPU で実行されるスレッドを選択するためにシステム・ディスパッチャーが呼び出されるときに開始します。
構文:
@@sysproc:dispatch:<pid/tid/*>サポートされる特殊な組み込み変数
__dispatchinfo{ cpuid; <- CPU where selected thread will run. oldpid; <- pid of the thread currently running oldtid; <- thread id of the thread currently running oldpriority; <- priority of the thread currenly running newpid; <- pid of the new process process selected for running newtid; <- thread id of the thread selected for running newpriority; <-priority of the thread selected for running }サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
割り込み環境でのみ実行されます。
例
次の例に示すような出力が表示されます。print process thread id of old and selected thread on CPU '0' with dispatch time relative to start of the script echo '@@sysproc:dispatch:* when (__cpuid == 0){printf ("%llu %llu %W\n",__dispatchinfo->oldtid,__dispatchinfo->newtid,timestamp());}' | probevue24641983 20709717 0s 48126µs 20709717 23593357 0s 48164µs 23593357 20709717 0s 48185µs 20709717 23593357 0s 48214µs 23593357 20709717 0s 48230µs 20709717 23593357 0s 48288µs 23593357 261 0s 48303µs 261 20709717 0s 48399µs Example II Time spent on CPU '0' by threads in between dispatch event. @@BEGIN { printf ("Thread cpu Time-Spent\n"); } @@sysproc:dispatch:* when (__cpuid == $1) { if (savetime[__cpuid] != 0) auto:diff = diff_time (savetime[__cpuid],timestamp(),MICROSECONDS); else diff = 0; savetime[__cpuid] = timestamp(); printf ("%llu %llu %llu\n",__dispatchinfo->oldtid,__dispatchinfo->cpuid,diff); } # probevue cputime.e 6 Thread cpu Time-Spent 3146085 6 0 3146085 6 9995 3146085 6 10002 3146085 6 10008 3146085 6 99988 3146085 6 100006 3146085 6 99995 3146085 6 99989 3146085 6 100010 3146085 6 100001 3146085 6 100000 3146085 6 99998As can be observed thread 3146085 is being re-dispatched on the CPU at an interval of 1sec in absence of any other thread competing for this CPU.
- oncpu
このプローブは、新規プロセスまたはスレッドが CPU を獲得するときに開始します。
構文:
@@sysproc:oncpu:<pid/tid/*>ここで、
pidは、CPU を獲得するプロセスまたはスレッドのプロセス ID であり、tidはスレッド ID です。サポートされる特殊な組み込み変数
__dispatchinfo{ cpuid; <- CPU where selected thread will run. newpid; <- pid of the new process process selected for running newtid; <- thread id of the thread selected for running newpriority; <-priority of the thread selected for running }サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
割り込み環境でのみ実行されます。
例
次の例に示すような出力が表示されます。To print time spent by threads of sysncd on all CPU's #!/usr/bin/probevue @@BEGIN { printf ("PROCESSID THREADID CPU TIME\n"); } @@sysproc:oncpu:$1 { savetime[__cpuid] = timestamp(); } @@sysproc:offcpu:$1 { if (savetime[__cpuid] != 0) auto:diff = diff_time (savetime[__cpuid],timestamp(),MICROSECONDS); else diff = 0; printf ("%llu %llu %llu %llu\n", __dispatchinfo->oldpid, __dispatchinfo->oldtid, __dispatchinfo->cpuid, diff); } # cputime.e `ps aux|grep syncd| grep -v grep| cut -f 6 -d " "`3735998 18612541 0 2 3735998 15663427 0 1 3735998 15073557 0 1 3735998 18743617 0 1 3735998 18874693 0 1 3735998 18809155 0 15 3735998 18940231 0 20 3735998 18547003 0 1 3735998 19267921 0 1 3735998 19071307 0 17 3735998 18678079 0 1 3735998 18481465 0 1 3735998 19202383 0 15 3735998 19005769 0 1 3735998 19136845 0 19 3735998 6160689 0 190- offcpu
このプローブは、プロセスまたはスレッドが CPU からディスパッチされるときに開始します。
構文:
@@sysproc:dispatch:<pid/tid/*>サポートされる特殊な組み込み変数
__dispatchinfo{ cpuid; <- CPU where selected thread will run. newpid; <- pid of the new process process selected for running newtid; <- thread id of the thread selected for running newpriority; <-priority of the thread selected for running }サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
割り込み環境でのみ実行されます。
blockthread
このプローブは、スレッドが CPU で実行しないようにブロックされるときに開始します。 ブロッキングは、スレッドがリソースを保持せずにスリープしているときにスリープ中の形式で行われます。
構文:
@@sysproc:blockthread:*サポートされる特殊な組み込み変数
__sleepinfo{ pid; tid; waitchan; <-- wait channel of this sleep. }サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
割り込み環境でのみ実行されます。
- foldcpu
このプローブは、CPU コアをフォールドしようとしているときに開始します。 このプローブは、プロセス・コンテキストでは行われません。また、pid または tid でフィルター処理してはなりません。
構文:
@@sysproc:foldcpu:*サポートされる特殊な組み込み変数
__foldcpuinfo{ cpuid; <- logical cpu id which triggers core folding gpcores; <- general purpose (unfolded, non-exclusive) cores available. }サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7.例:
システム内のすべての CPU フォールディング・イベントを追跡する場合は、次のとおりです。
__foldcpuinfo{ cpuid; <- logical cpu id which triggers core folding gpcores; <- general purpose (unfolded, non-exclusive) cores available. }- bindprocessor
構文:
@@sysproc:bindprocessor:<pid/tid/*>このプローブは、スレッドまたはプロセスが CPU にバインドされるときに開始します。 Bindprocessor は永続イベントであり、一時 CPU 切り替えと混同してはなりません。
サポートされる特殊な組み込み変数
__bindprocessorinfo{ ispid <- 1 if cpu is bound to process; 0 for a thread id; <- thread or process id. cpuid; };サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
プロセス環境で実行されます。
- changecpu
このプローブは、スレッドが CPU を一時的に変更するときに開始します。 このイベントは、CPU 関連タスク (カーネル・ヒープを管理するためにすべての CPU への
xmgcプロセス・ジャンプ) の特殊組み込み変数を実行するために、CPU 集中イベント時、またはいくつかのkprocイベントの意図的なジャンプ時にキャプチャーされる可能性が高くなります。構文:
@@sysproc:changecpu:*>サポートされる特殊な組み込み変数
__changecpuinfo { oldcpuid; <-source CPU newcpuid; <- target CPU pid; tid; <-Thread id }サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__curthread,__curproc,__mst,__tid,__pid,__ppid,__pgid,__uid,__euid.実行環境
プロセス環境で実行されます。
例
次の例に示すような出力が表示されます。@@sysproc:changecpu:* { printf ("changecpu PID=%llu TID=%llu old_cpuid=%d new_cpuid= %d \n", __changecpuinfo->pid,__changecpuinfo->tid,__changecpuinfo->oldcpuid,__changecpuinfo->newcpuid); }changecpu PID=852254 TID=1769787 old_cpuid=26 new_cpuid= 27 changecpu PID=852254 TID=1769787 old_cpuid=-1 new_cpuid= 0 changecpu PID=852254 TID=1769787 old_cpuid=0 new_cpuid= 1 changecpu PID=852254 TID=1769787 old_cpuid=1 new_cpuid= 2- resourceattach
このプローブが起動されるのは、リソースがシステム内の別のリソースに接続される場合です。
構文:
@@sysproc:resourceattach:*>サポートされる特殊な組み込み変数
__srcresourceinfo{ type; subtype; id; <- resource type identifier offset; <-offset if a memory resource length; <- length if a memory resource policy; } __tgtresourceinfo{ type; subtype; id; <- resource type identifier offset; <-offset if a memory resource length; <- length if a memory resource policy; }ここで、type と subtype は以下のいずれかの値にすることができます。表 7. resourceattach プローブ: type 値と subtype 値 リソース・タイプ 説明 R_NADA なし - 無効な指定 R_PROCESS プロセス R_RSET リソース・セット R_SUBRANGE メモリー範囲 R_SHM 共有メモリー R_FILDES オープン・ファイルによって識別されるファイル R_THREAD スレッド R_SRADID SRAD ID R_PROCMEM プロセス・メモリー サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__mst.実行環境
プロセス環境で実行されます。
- resourcedetach
このプローブが起動されるのは、リソースがシステム内の別のリソースから切り離される場合です。
構文:
@@sysproc:resourcedetach:*>サポートされる特殊な組み込み変数
__srcresourceinfo{ type; subtype; id; <- resource type identifier offset; <-offset if a memory resource length; <- length if a memory resource policy; } __tgtresourceinfo{ type; subtype; id; <- resource type identifier offset; <-offset if a memory resource length; <- length if a memory resource policy; }ここで、type と subtype は以下のいずれかの値にすることができます。表 8. resourcedetach プローブ: type 値と subtype 値 リソース・タイプ 説明 R_NADA なし - 無効な指定 R_PROCESS プロセス R_RSET リソース・セット R_SUBRANGE メモリー範囲 R_SHM 共有メモリー R_FILDES オープン・ファイルによって識別されるファイル R_THREAD スレッド R_SRADID SRAD ID R_PROCMEM プロセス・メモリー サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__mst,__tid,__pname.実行環境
プロセス環境で実行されます。
- drphasestart
このプローブは、dr ハンドラーが呼び出されようとしているときに起動されます。
構文:
@@sysproc:drphasestart:*サポートされる特殊な組み込み変数
__drphaseinfo{ dr_operation; ← dr operation dr_flags; dr_phase; handler_rc; ← always 0 in drphasestart }dr_operation は、以下の値のいずれかになります。
- DR 操作
- DR_RM_MEM_OPER
- DR_ADD_MEM_OPER
- DR_RM_CPU_OPER
- DR_ADD_CPU_OPER
- DR_CPU_SPARE_OPER
- DR_RM_CAP_OPER
- DR_ADD_CAP_OPER
- DR_RM_RESMEM_OPER
- DR_PMIG_OPER
- DR_WMIG_OPER
- DR_WMIG_CHECKPOINT_OPER
- DR_WMIG_RESTART_OPER
- DR_SOFT_RES_CHANGES_OPER
- DR_ADD_MEM_CAP_OPER
- DR_RM_MEM_CAP_OPER
- DR_CPU_AFFINITY_REFRESH_OPER
- DR_AME_FACTOR_OPER
- DR_PHIB_OPER
- DR_ACC_OPER
- DR_CHLMB_OPER
- DR_ADD_RESMEM_OPER
dr フラグには、次の値を組み合わせることができます。- フラグ
- DRP_FORCE
- DRP_RPDP
- DRP_DOIT_SUCCESS
- DRP_PRE_REGISTERED
- DRP_CPU DRP_MEM DRP_SPARE
- DRP_ENT_CAP
- DRP_VAR_WGT
- DRP_RESERVE
- DRP_PMIG DRP_WMIG
- DRP_WMIG_CHECKPOINT
- DRP_WMIG_RESTART
- DRP_SOFT_RES_CHANGES
- DRP_MEM_ENT_CAP
- DRP_MEM_VAR_WGT
- DRP_CPU_AFFINITY_REFRESH
- DRP_AME_FACTOR
- DRP_PHIB
- DRP_ACC_UPDATE
- DRP_CHLMB
サポートされるその他の組み込み変数
__errno__kernelmode,__arg1 to __arg7,__tid実行環境
プロセス環境または割り込み環境で実行されます。
例