Sysproc プローブ・マネージャー

Sysproc プローブ・マネージャーは、sysproc サブシステムの内部に関する詳細を認識することなく、プロセスまたはスレッドに関連したデータを動的にトレースするためのインフラストラクチャーをユーザーと管理者に提供します。

ユーザーまたは管理者にとって、sysproc サブシステムの性質は、以下の主なカテゴリーに分類されます。

  • プロセス (またはスレッド) の作成または終了
  • シグナルの生成と配信
  • スケジューラーとディスパッチャーのイベント
  • DR および CPU バインディング・イベント

プロセス (またはスレッド) の作成または終了

システムのリソースを管理するには、システム管理者には、プロセスまたはスレッドの作成および破棄方法に関連した情報が必要です。 Sysproc プローブ・マネージャーは、以下の重要なユース・ケースに対処します。
  • プロセスが自然に終了したか、エラーのため終了したか?
  • プロセスまたはスレッドはいつ作成または終了されたか?
  • プロセスが実行された時間の長さは?
  • スレッドが例外を受信または例外から戻るときのイベントを追跡する。

シグナルの生成と配信

シグナルは、システム内のプロセッサー・スレッドの現状を決定します。 プロセスまたはスレッドの誤動作を認識するために、管理者はシグナルの状態、およびこれらのシグナルによるプロセスの現状を使用します。 このプローブ・マネージャーが対処する、シグナルの生成と配信カテゴリー (ただしこれに限定されない) の重要なユース・ケースは次のとおりです。
  • 特定ターゲットのシグナル・ソースおよびシグナル情報。
  • 非同期シグナルのシグナル配信。
  • シグナル・クリアのトレース。
  • デフォルト以外のシグナル・ハンドラーがインストールされているときのイベントのトレース。
  • 特定ソースのシグナル・ターゲットおよびシグナル情報。
  • シグナル・ハンドラーの開始または終了のトレース。

スケジューラーとディスパッチャーのイベント

スケジューラーおよびディスパッチャーは、プロセスまたはスレッドがシステム内でどのように実行されるかを規定します。 管理者は、動的トレース・スケジューラーまたはディスパッチャー・サブシステムを使用することによって、システム・パフォーマンスを分析します。

動的トレース・スケジューラーまたはディスパッチャー・サブシステムは、スレッド保存の理由を検出するのに役立ちます。

Sysproc プローブ・マネージャーが対処する、スケジューラーとディスパッチャーのイベント・カテゴリー (ただしこれに限定されない) の重要なユース・ケースは次のとおりです。
  • 実行キューからエンキューまたはデキューされるスレッド (複数の場合あり) をトレースする。
  • システム内のいずれかのスレッドが優先使用されるときのイベントをトレースする。
  • スレッドがイベント中にスリープさせられる時点をトレースする。
  • スリープ状態のスレッドがウェイクアップされる時点をトレースする。
  • スレッドのディスパッチ待ち時間を追跡する。
  • 仮想プロセッサー・フォールディング・イベントを追跡する。
  • カーネル・スレッド優先順位の変更をトレースする。

動的再構成 (DR) および CPU バインディング・イベント

このプローブ・クラスは、プロセスにバインドされているリソースを追跡するユーザーに、動的トレース機能を提供します。

DR および CPU バインディング・イベントのプローブ・マネージャーが対処する、このカテゴリー (ただしこれに限定されない) の重要なユース・ケースの一部は、次のとおりです。
  • スレッド・バインディングが、ある CPU から別の CPU に変更する時点を追跡する。
  • リソースがプロセスに接続または切り離される時点を追跡する。
  • CPU バインディング・イベントを追跡する。
  • DR イベントの開始または終わりを追跡する。

プローブ指定

Sysproc イベントをプローブするには、Vue スクリプトで以下の形式が使用されなければなりません。

@@sysproc:<sysproc_event>:<pid/tid/*>

最初のタプル @@sysproc は、このプローブが sysproc イベントに固有であることを示します。

2 番目のタプルは、プローブ対象のイベントを指定します。

3 番目のタプルは、プロセスまたはカーネル・スレッド ID に基づいて、2 番目のタプルにより指定されるイベントを分離するためのフィルターの役目をします。
注: sysproc プローブでプロセスまたはカーネル・スレッド ID をフィルターとして使用しても、プロセスまたはスレッド・コンテキストでイベントが発生することは保証されません。 Sysproc プローブ・マネージャーは、プロセスまたはスレッド ID をフィルターとしてのみ使用します。 これらのイベントは、プローブ・イベントの実行コンテキストにかかわらず、プロセスまたはスレッドの観点から役立つ場合があります。

シグナルを送信するプロセス、またはシグナルを受信するプロセスのいずれかであるシグナル送信イベントが役立つ場合があります。 以下の情報により、このようなプローブ・イベントに適切なフィルターが指定されます。

プローブ・ポイント (対象となるイベント)

Sysproc プローブ・マネージャーによりプローブできるすべてのイベントの簡単な説明が、以下のテーブルに示されています。

表 1. 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 は、組み込み変数を使用したデータ・アクセスを可能にします。

組み込み変数値は、アクセス可能度に基づいて次の 3 つのタイプに分類されます。
  1. プローブ・マネージャーに関係なく、任意のプローブ・ポイントでアクセス可能。 例: __curthread
  2. 特定のプローブ・マネージャーのプローブ全体でアクセス可能。
  3. 定義されたプローブ (対象となるイベント) でのみアクセス可能。
Sysproc プローブ・マネージャーは、タイプ (1) および (3) の組み込み変数によるデータのアクセスを可能にします。 以下のテーブルは、タイプ (1) の組み込み変数のアクセス可能性を示すのに使用します。 Sysproc プローブ・マネージャーに提供される特殊な組み込み変数の型は long long です。

タイプ (1) の組み込み値のリストは次のとおりです。

  • __trcid
  • __errno__kernelmode
  • __arg1 to __arg7
  • __curthread
  • __curproc
  • __mst
  • __tid
  • __pid
  • __ppid
  • __pgid
  • __uid
  • __euid
  • __ublock
  • __execname
  • __pname

組み込み変数は、コンテキスト固有およびコンテキスト独立としても分類されます。 コンテキスト固有の組み込み変数は、プローブの実行コンテキストに基づいてデータを提供します。

AIX® カーネルは、スレッドまたは割り込みコンテキストで動作します。 コンテキスト固有のプローブは、プローブがスレッドまたはプロセスのコンテキストで開始されたときに正しい結果を生成します。

割り込み実行コンテキストでコンテキスト固有の組み込み変数から、予期しない結果が取得される可能性があります。 コンテキスト独立組み込み変数は、実行コンテキストに依存せず、プローブ実行環境に関係なく安全にアクセスできます。

表 2. コンテキスト固有およびコンテキスト独立の組み込み変数
コンテキスト固有の組み込み変数 コンテキスト独立の組み込み変数
__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);}' | probevue

Which 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());}' | probevue 
以下の例のような出力が表示されます。
nfssync_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);}' | 
probevue
以下の例のような出力が表示されます。
Source=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);}' | probevue
以下の例のような出力が表示されます。
8258004   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);}' | probevue
以下の例のような出力が表示されます。
xmgc 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());}' | 
probevue
次の例に示すような出力が表示されます。
24641983 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 99998

As 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

実行環境

プロセス環境または割り込み環境で実行されます。