Brendan Gregg著 "BPF Performance Tools"<sup id="a2">[2](#f2)</sup>(("BPF Performance Tools"自体については、id:go_vargoさんにより熱量のある感想が書かれている。 [BPF Performance Toolsを読んだ感想 - go_vargoのブログ](https://go-vargo.hatenablog.com/entry/2020/03/29/210304)))によると、BPFとはカーネルのプログラマビリティを高めるための汎用実行エンジンを指す。 BPFは、多種多様なカーネルやアプリケーションのイベントに対して、ミニプログラムを実行する方法を提供する。この実行方法は、ウェブブラウザ上で発火するイベントを契機にJavaScriptのコードが呼ばれる方式と類似している。[ebpf.io](https://ebpf.io)の[What is eBPF? An Introduction and Deep Dive into the eBPF Technology](https://ebpf.io/what-is-ebpf#hook-overview)では、カーネルやアプリケーションが事前定義されたフックポイント(システムコール、関数の入出力、カーネルのtracepoints、ネットワークイベント、その他)を通過したときに、BPFプログラムが実行されると説明されている。 BPFは、カーネル内にBPF独自の命令セットを解釈する仮想マシン、カーネル内の複数のミニプログラム間、あるいは、カーネル空間とユーザ空間間でデータを共有するためのストレージオブジェクト、ヘルパー関数から構成されている。BPF命令により記述されたミニプログラムをシステムコール(bpf(2))経由でユーザ空間からカーネルへ送り込んだのちに、ミニプログラムに指定されたイベントが発火すると、ミニプログラムが実行される。この機構により、ファイルを開く、CPUが任意の命令を実行する、ネットワークパケットを受信する、といった各種イベントが発生したタイミングで、そのイベントがもつデータをもとに制約の範囲内で任意のプログラムを実行できる。 このような機構をもつBPFの主要なユースケースは、同書<sup id="a2">[2](#f2)</sup>によるとNetworking、Observability、Securityの3点である。文献<sup id="a4">[4](#f4)</sup>でもほぼ同様に、Networking、Security、Observability & Tracingの3点が挙げられている。この記事では、Observability & Tracingの観点で、BPFをとりあげる。