Linux bpftrace コマンド

Linux コマンド大全


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 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:現在のプロセス ID
  • tid:現在のスレッド ID
  • comm:現在のプロセス名
  • nsecs:ナノ秒単位のタイムスタンプ
  • arg0-argN:関数の引数
  • retval:関数の戻り値

bpftrace 実用サンプル

1. システムコールのトレース

例

# open システムコールの回数を集計
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]);
}'

3. プロセスのファイルアクセスの監視

例

# 指定したプロセスが開いたファイルをトレース
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(); }'

bpftrace の高度な機能

1. マップ(Map)機能

bpftrace はデータ集計用に複数の組み込みマップタイプを提供しています:

例

# ヒストグラムを集計
@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);
}

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]);
}

bpftrace のベストプラクティス

  1. トレース範囲を制限する:PID またはコマンド名でフィルタリングし、システムオーバーヘッドを削減
  2. 過剰な出力を避ける:printf が多すぎるとパフォーマンスに影響する
  3. 集計を使用する:count()、sum() などの集計関数をできるだけ使用する
  4. リソースのクリーンアップ:長時間実行するスクリプトはマップデータを定期的にクリーンアップする
  5. セキュリティの考慮事項:bpftrace は root 権限が必要。未知のスクリプトは慎重に実行すること

bpftrace と他のツールの比較

ツール 長所 短所
bpftrace 柔軟、高性能、使いやすい root 権限が必要
strace シンプル、コンパイル不要 パフォーマンスオーバーヘッドが大きい
perf 機能が充実、低オーバーヘッド 学習曲線が急
SystemTap 強力な機能 コンパイルが必要、設定が複雑

おすすめの学習リソース

  1. bpftrace 公式ドキュメント
  2. bpftrace ワンライナーチュートリアル
  3. bpftrace サンプルリポジトリ

bpftrace は、システムパフォーマンス分析とトラブルシューティングに強力なツールです。これらの例を実践し、中核となる概念を習得することで、Linux システムの動作をより深く理解し、最適化できるようになります。


Linux コマンド大全

その他の拡張機能