[[BPF]]の位置付けを整理したところで、次はBPFトレーシングを理解するための各要素を説明する。 ### ![[BPFのアーキテクチャ]] ### イベントソース LinuxカーネルはBPFのフックポイントとして様々なイベントソースを提供している。イベントソースは次のような計装により利用可能となっている。 動的計装(動的トレーシングとも呼ばれる)は実行中のソフトウェアに計測ポイントを挿入する機能である。ソフトウェアが変更されずに実行されるため、計測を有効にしなければ、計測オーバヘッドはゼロになる利点がある。 Linuxカーネルの関数向けの動的計装は2004年に開発された **[Kprobe(Kernel probe)](https://www.kernel.org/doc/html/latest/trace/kprobes.html)** である。Linuxのユーザレベルの関数の動的計装は2012年に**Uprobe(User probe)** として開発された。BPFは両者をサポートしている。 動的計装の欠点は、ソフトウェアのバージョン変更によって、対象の名前やパラメータが変更されたり、対象が削除される可能性があることだ。これを回避するには、ソフトウェアのバージョンごとにトレーシングコードを書くことになる。 このようなインターフェイスの安定性の問題を解決する方法は、関数や変数名をそのままトレースするのではなく、イベント名をコード化し、開発者がそれを維持することである。このような計装方法は静的計装と呼ばれる。Linuxカーネルはカーネルレベルの静的計装用の **[tracepoint](https://www.kernel.org/doc/html/latest/trace/tracepoints.html)** とユーザーレベルの **[[USDT]](User Statically-Defined Tracing)** をサポートする。USDTを利用するには、トレース対象のソフトウェアが個々にUSDTをサポートする必要があり、なおかつ、USDTを有効にした状態でビルドされていなければならない。 その他のイベントソースとしては、プロセッサのイベントカウンタであるPMCs(Performance Monitoring Counters)や[perf_events](https://perf.wiki.kernel.org/index.php/Main_Page)などがある。 ### ![[BCC]] (BPF Compiler Collection) ### bpftrace bpftraceは、トレーシングのための専用のスクリプト言語を解釈・実行するためのフロントエンドツールである。bpftraceでは、制約はあるものの、フロントエンドプログラムとBPFプログラムを書き分ける必要がなく、ワンライナーでもトレーシングできる。そのため、アドホックな性能分析には最適なツールである。 bpftraceコミッタであるmm_iさんによる昨年の記事は、bpftraceの最近の動向をチェックするのにとてもよい。[bpftrace 2020 - 睡分不足](https://mmi.hatenablog.com/entry/2020/12/02/031534) ### ![[CO-RE]] (Compile Once - Run Everywhere)