Linux bpftrace コマンド
bpftrace は eBPF(拡張バークレーパケットフィルタ)をベースにした高度なトレーシングツールで、開発者はカーネルコードを変更することなく、Linux システムの実行状態を動的に観察・分析できます。
eBPF は Linux カーネルにおける画期的な技術で、カーネル内でユーザー定義のコードを実行できる安全な仮想マシン環境を提供します。bpftrace は eBPF の上に構築されており、よりシンプルで高度な抽象レイヤーを提供します。
bpftrace の主な利点
リアルタイムシステム監視
- システムやアプリケーションの再起動が不要
- 非常に低いパフォーマンスオーバーヘッド
- カーネルおよびユーザー空間のプログラムを監視可能
柔軟なプローブ機能
- 関数の入口/出口、タイマー、ハードウェアイベントなど、さまざまなプローブポイントタイプをサポート
- システムコール、ネットワークイベント、ディスク I/O などをトレース可能
シンプルなスクリプト言語
- AWK に似た構文で、学習曲線が緩やか
- 豊富な組み込み関数と変数を搭載
- 条件フィルタリングと集計統計をサポート
bpftrace のインストールと設定
インストール方法
例
# Ubuntu/Debian
sudo apt install bpftrace
# CentOS/RHEL
sudo yum install bpftrace
# ソースコードからコンパイル
git clone https://github.com/iovisor/bpftrace.git
mkdir bpftrace/build && cd bpftrace/build
cmake ..
make
sudo make install
sudo apt install bpftrace
# CentOS/RHEL
sudo yum install bpftrace
# ソースコードからコンパイル
git clone https://github.com/iovisor/bpftrace.git
mkdir bpftrace/build && cd bpftrace/build
cmake ..
make
sudo make install
インストールの確認
sudo bpftrace -e 'BEGIN { printf("Hello, bpftrace!n"); }'
bpftrace 基本構文
bpftrace プログラムはプローブポイント(probe)と関連するアクション(action)で構成され、基本構造は次のとおりです:
probe /filter/ {
action
}
プローブポイントの種類
| プローブポイントの種類 | 説明 | 例 |
|---|---|---|
kprobe |
カーネル関数の入口 | kprobe:vfs_read |
kretprobe |
カーネル関数の戻り | kretprobe:vfs_read |
uprobe |
ユーザー空間関数の入口 | uprobe:/bin/bash:readline |
tracepoint |
カーネル静的トレースポイント | tracepoint:syscalls:sys_enter_open |
interval |
タイマートリガー | interval:s:5 |
software |
ソフトウェアイベント | software:faults:major |
よく使われる組み込み変数
pid:現在のプロセス IDtid:現在のスレッド IDcomm:現在のプロセス名nsecs:ナノ秒単位のタイムスタンプarg0-argN:関数の引数retval:関数の戻り値
bpftrace 実用サンプル
1. システムコールのトレース
例
# open システムコールの回数を集計
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { @[comm] = count(); }'
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { @[comm] = count(); }'
2. 関数の実行時間の分析
例
# vfs_read の実行時間を測定
sudo bpftrace -e '
kprobe:vfs_read { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ {
@times = hist(nsecs - @start[tid]);
delete(@start[tid]);
}'
sudo bpftrace -e '
kprobe:vfs_read { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ {
@times = hist(nsecs - @start[tid]);
delete(@start[tid]);
}'
3. プロセスのファイルアクセスの監視
例
# 指定したプロセスが開いたファイルをトレース
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /pid == 1234/ { printf("%s -> %sn", comm, str(args->filename)); }'
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /pid == 1234/ { printf("%s -> %sn", comm, str(args->filename)); }'
4. TCP接続の統計
例
# プロセスごとに TCP 接続数を集計
sudo bpftrace -e 'kprobe:tcp_connect { @[comm] = count(); }'
sudo bpftrace -e 'kprobe:tcp_connect { @[comm] = count(); }'
bpftrace の高度な機能
1. マップ(Map)機能
bpftrace はデータ集計用に複数の組み込みマップタイプを提供しています:
例
# ヒストグラムを集計
@hist = hist(nsecs);
# 平均値を計算
@avg = avg(nsecs);
# ユニーク値を集計
@unique = count();
@hist = hist(nsecs);
# 平均値を計算
@avg = avg(nsecs);
# ユニーク値を集計
@unique = count();
2. 条件フィルタリング
例
# 特定のプロセスの read 呼び出しのみをトレース
tracepoint:syscalls:sys_enter_read /pid == 1234/ {
printf("PID %d reading %d bytesn", pid, args->count);
}
tracepoint:syscalls:sys_enter_read /pid == 1234/ {
printf("PID %d reading %d bytesn", pid, args->count);
}
3. 複数プローブの組み合わせ
例
# socket 作成から接続までの全プロセスをトレース
kprobe:sock_alloc {
@socket[tid] = 1;
}
kprobe:tcp_connect /@socket[tid]/ {
printf("socket %d connecting to %s:%dn", args->sock->__sk_common.skc_dport,
ntop(args->sock->__sk_common.skc_daddr),
args->sock->__sk_common.skc_dport);
delete(@socket[tid]);
}
kprobe:sock_alloc {
@socket[tid] = 1;
}
kprobe:tcp_connect /@socket[tid]/ {
printf("socket %d connecting to %s:%dn", args->sock->__sk_common.skc_dport,
ntop(args->sock->__sk_common.skc_daddr),
args->sock->__sk_common.skc_dport);
delete(@socket[tid]);
}
bpftrace のベストプラクティス
- トレース範囲を制限する:PID またはコマンド名でフィルタリングし、システムオーバーヘッドを削減
- 過剰な出力を避ける:printf が多すぎるとパフォーマンスに影響する
- 集計を使用する:count()、sum() などの集計関数をできるだけ使用する
- リソースのクリーンアップ:長時間実行するスクリプトはマップデータを定期的にクリーンアップする
- セキュリティの考慮事項:bpftrace は root 権限が必要。未知のスクリプトは慎重に実行すること
bpftrace と他のツールの比較
| ツール | 長所 | 短所 |
|---|---|---|
| bpftrace | 柔軟、高性能、使いやすい | root 権限が必要 |
| strace | シンプル、コンパイル不要 | パフォーマンスオーバーヘッドが大きい |
| perf | 機能が充実、低オーバーヘッド | 学習曲線が急 |
| SystemTap | 強力な機能 | コンパイルが必要、設定が複雑 |
おすすめの学習リソース
bpftrace は、システムパフォーマンス分析とトラブルシューティングに強力なツールです。これらの例を実践し、中核となる概念を習得することで、Linux システムの動作をより深く理解し、最適化できるようになります。
その他の拡張機能