# BCC BPF Compiler Collection。2015 年に開発開始された eBPF プログラムの実装フレームワーク。Python/Lua/C++ フロントエンドをサポートし、70 以上のパフォーマンス分析ツールを内包する。**ラピッドプロトタイピング向け**として位置づけられており、カーネルとユーザ空間のコードを組み合わせた高速なイテレーションが可能。 2020 年以降は Python ツール群の [[libbpf]] ベースへの移行が推奨されており、本番実装には libbpf + CO-RE を用いるのが定石となっている。([[@2021__yuuk.io__Linux eBPF Tracing Technology]]) [[ProfInfer]] は Ubuntu 上で BCC を用いて tracer を実装する(OpenHarmony は既定で Python 非対応のため [[libbpf]] を用いる)。(Source: [[@2026__MLSys2026__ProfInfer - An eBPF-based Fine-Grained LLM Inference Profiler]], §2.3, 表1) ## アプリケーション可観測性ツール群(詳解 システム・パフォーマンス 第2版 5章) BCC は BPF を使ってカーネルコンテキストでスタックトレースを集約し、ユーザー空間には一意なスタックとその出現回数だけを渡すことで低オーバーヘッドを実現している。5章で紹介される代表的な BCC/bpftrace ツール: - **profile(8)**: 時間ベースのサンプリングによる CPU プロファイラ。 - **offcputime(8)**: スケジューラのトレーシングを使った off-CPU 分析ツール。off-CPU 時間がしきい値(デフォルト1µ秒、`-m`で変更)を超えるスタックだけを記録し、`-M`で長時間ブロックのスタックを除外できる。 - `cpudist(8)` と `offcputime(8)` は、[[@2017__brendangregg.com__Off-CPU Analysis]] が紹介する代表的な off-CPU 計測ツールである。前者は待機時間の分布、後者は待機理由を示すスタック別の合計時間を扱う。 - **execsnoop(8)**: `execve(2)` をトレースし新プロセスの実行を1行ずつ記録する。 - **syscount(8)**: システム全体またはプロセスごと(`-P`)にシステムコール回数を集計する。 (Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 5 アプリケーション]] §5.5.2〜§5.5.6) ## eBPF 開発ツールチェーンでの位置づけ | フェーズ | ツール | |---|---| | 探索・アドホック | [[bpftrace]] | | プロトタイピング | BCC (このページ) | | 本番実装 | [[libbpf]] + CO-RE | ## BCC と bpftrace の使い分け(詳解 システム・パフォーマンス 第2版 15章) BCC は複雑なカスタムツール(任意の集計・任意のイベント出力型・ライブラリ利用可)に適し、[[bpftrace]] は引数0〜1個のその場限りのワンライナーに適するという役割分担が具体的な数値で裏付けられている。 | 特徴 | BCC | bpftrace | |---|---|---| | ツール数(リポジトリ) | 80以上(bcc) | 30以上(bpftrace)、120以上(bpf-perf-tools-book) | | プログラミング言語 | ユーザー空間: Python/Lua/C/C++、カーネル空間: C | bpftrace 独自言語 | | プログラミングの難易度 | 難しい | 簡単 | | 出力データ型 | 任意 | テキスト、JSON | | ライブラリサポート | あり(例: Python import) | なし | | プログラムの平均的な長さ(コメント除く) | 228行 | 28行 | BCC ツールは bpftrace ツールと比べて開発に**平均10倍の時間・10倍の行数**を要する。ツール開発は一般に複数のイテレーションを要するため、まず bpftrace で手っ取り早く試作し、必要に応じて BCC へ移植する開発フローが時間を節約する。著者はこの違いを「BCC は C プログラム的、bpftrace はシェルスクリプト的」という比喩で説明し、既製の BCC ツールを日常的に使いながら使い捨ての bpftrace ツールを都度書く、という使い分けを自ら実践している。単一目的ツール(biolatency(8) 等)は「ひとつのことをしっかりとこなす」という設計哲学に従い、デフォルト出力を簡潔にして多くの場合それだけで十分にする。多目的ツール(argdist(8)・trace(8) 等)は perf(1) 同様に複数のイベントソースをサポートする分、使い方が複雑になる。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 15 BPF]] §15.1〜§15.1.7) ## 関連 - ソース: [[@2021__yuuk.io__Linux eBPF Tracing Technology]] / [[@2026__MLSys2026__ProfInfer - An eBPF-based Fine-Grained LLM Inference Profiler]] / [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 5 アプリケーション]] / [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 15 BPF]] - エンティティ: [[libbpf]] / [[bpftrace]] / [[Brendan Gregg]] - 概念: [[eBPF]] / [[動的計装|動的インストルメンテーション]] / [[システムコール]] / [[スレッド状態分析]]