FBTプロバイダ
fbt
(関数境界トレース)プロバイダには、Oracle Linuxカーネル内のほとんどの関数の開始および終了に関連するプローブが含まれています。そのため、数万のfbt
プローブが存在する可能性があります。
sudo dtrace -lP fbt
FBTプローブを効果的に使用するには、カーネル実装に関する知識が必要です。したがって、FBTはカーネル・ソフトウェアの開発時や、他のプロバイダが不十分な場合にのみ使用することをお薦めします。
使用可能なFPBプローブは多数あるため、プローブを有効にするモジュールと関数は具体的にします。FBTプローブの全範囲が同時に有効になっていると、パフォーマンスに影響する可能性があります。
fbtプローブ
FBTは、カーネルのほとんどの関数の先頭にentry
というプローブを提供します。return
という名前のプローブは、カーネルのほとんどの関数の末尾に含まれています。すべてのFBTプローブには、関数名とモジュール名があります。
fbtプローブの引数
entry
プローブの引数は、対応するオペレーティング・システムのカーネル関数の引数と同じです。これらの引数には、arg0
、arg1
、arg2
...の変数を使用して、int64_t
値としてアクセスできます。
関数に戻り値がある場合、戻り値はreturn
プローブのarg1
に格納されます。関数に戻り値がない場合、arg1
は定義されません。
指定した関数の開始ポイントは1つだけですが、コール元に戻るポイントは多数ある場合があります。FBTは、関数の複数のリターン・サイトを単一のreturn
プローブに収集します。正確なリターン・パスを知る必要がある場合は、関数テキスト内の戻り命令のバイト単位のオフセットを示す、return
プローブのarg0
値を調べることができます。
fbtの例
カーネルの実装を調べるためにfbt
プロバイダを使用できます。次のサンプル・スクリプトは、それぞれの関数がカーネル仮想メモリーを割り当てる回数に基づいて集積体を作成します。スクリプトが終了すると、集積の結果が出力されます。これは、メモリー集中型の関数を監視する場合に役立ちます。次のDソース・コードを入力して、getkmemalloc.d
という名前のファイルに保存します:
#pragma D option quiet
fbt::kmem*alloc*:entry
{
@[caller] = count();
}
dtrace:::END
{
printa("%40a %@10d\n", @);
}
このスクリプトを実行すると、次のような出力が得られます。
vmlinux`vm_area_alloc+0x1a 1
vmlinux`__sigqueue_alloc+0x65 1
vmlinux`__create_xol_area+0x4d 1
vmlinux`__create_xol_area+0x6f 1
vmlinux`vmstat_start+0x39 1
vmlinux`proc_alloc_inode+0x1d 1
vmlinux`proc_self_get_link+0x5b 1
vmlinux`security_inode_alloc+0x24 1
vmlinux`avc_alloc_node+0x1c 1
vmlinux`ep_ptable_queue_proc+0x3d 2
vmlinux`kernfs_fop_open+0xbf 2
vmlinux`kernfs_fop_open+0x2e8 2
vmlinux`disk_seqf_start+0x25 2
vmlinux`__alloc_skb+0x16c 6
vmlinux`skb_clone+0x4b 6
vmlinux`ep_insert+0xbb 8
vmlinux`ep_insert+0x34c 8
vmlinux`__d_alloc+0x29 9
vmlinux`kernfs_iop_get_link+0x33 9
vmlinux`single_open+0x2a 15
vmlinux`proc_reg_open+0x6e 17
vmlinux`seq_open+0x2a 21
vmlinux`__alloc_file+0x23 29
vmlinux`security_file_alloc+0x24 29
vmlinux`getname_flags.part.0+0x2c 40
この出力は、kmem*alloc
システム・コールをコールする内部カーネル関数を示していて、システムで最も頻繁にカーネル仮想メモリーを割り当てるカーネル関数を調べるために使用できます。