eBPF
eBPF用のバイトコードを渡すとコンパイルされてカーネルに組み込まれる
カーネル内のイベントをhookして処理を実行できる
Berkley Packet Filter
ドライバが受け取りカーネル経由で渡ってきたパケットをアプリケーション側でフィルタすると、カーネル側とユーザ側でスイッチングが多く発生する
パケットフィルタ等の動作を行うアプリケーションをカーネル空間で動作する仮想マシン上で実行できるようにする
フィルタリングをパケット側で完結させ、パフォーマンスを向上させる
Linux Kernel には、version 2.1.75 で libpcap として実装された (1997) eBPFと対比して cBPF (classic BPF) と呼ばれることがある eBPF とは
extended BPF
用途をBPFより汎用にした仕組み
→パケットの操作以外もターゲットにする
Linux Kernel 3.17 で実装・拡張が続いている
つかいかた
さすがにバイトコードの手書きはしない
高級言語でフロントエンドを書く
Python, C++, Lua, (Go, Rust)
BCC (BPF Compiler Collection) というツールチェーンを使ってコンパイルする
注目されている背景(?)
iptables はコンテナ数の増加にともなって遅くなる(らしいlemonadern.icon)
高速なコンテナ間通信の需要がある
eBPFで実現!
参考