FBTプロバイダ
fbt (関数境界トレース)プロバイダには、Oracle Linuxカーネル内のほとんどの関数の開始および終了に関連するプローブが含まれています。 そのため、数万のfbtプローブが存在する可能性があります。
sudo dtrace -lP fbtFBTプローブを効果的に使用するには、カーネル実装に関する知識が必要です。 したがって、FBTはカーネル・ソフトウェアの開発時や、他のプロバイダが不十分な場合にのみ使用することをお薦めします。
使用可能なFPBプローブは多数あるため、プローブを有効にするモジュールと関数は具体的にします。 FBTプローブの全範囲が同時に有効になっていると、パフォーマンスに影響する可能性があります。
fbtプローブの引数
entryプローブの引数は、対応するオペレーティング・システムのカーネル関数の引数と同じです。 これらの引数には、arg0、arg1、arg2...の変数を使用して、int64_t値としてアクセスできます。
関数に戻り値がある場合、戻り値はreturnプローブのarg1に格納されます。 関数に戻り値がない場合、arg1は定義されません。
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システム・コールをコールする内部カーネル関数を示していて、システムで最も頻繁にカーネル仮想メモリーを割り当てるカーネル関数を調べるために使用できます。