「A thorough introduction to eBPF」を読む

2020-02-15 / [ebpf] [linux]

https://lwn.net/Articles/740157/

BPF の進化

もともとはパケットキャプチャのルールを記述するためのレジスタマシンとして実装されていた。

Berkeley Packet Filter (BPF)

BPF が抱えていた課題

ユーザのプログラムをカーネル内で実行するというアイデアは良かった

  • モダンなプロセッサを活用できる命令セットではなかった

eBPF のポイント

  • 最近のプロセッサと親和性の高い仮想マシンになった → 性能が向上した
  • レジスタが64 bit になりレジスタ数も増えたことで → 関数に渡す引数が表現できるようになった (もともとレジスタ 2 本)
  • BPF_CALL 命令でカーネルから提供された関数を呼び出せるようになった

x86_64 において eBPF の性能は cBPF の 4 倍になったと kernel 3.15 で取り込まれたパッチ では提示されている。

使いみち

  • 高性能パケット処理

もともと BPF がパケットフィルタ向けだったことから、eBPFもまたネットワーク機能に適している。

eBPF のパッチを作った人について

Linux カーネル 3.15 で eBPF のパッチを作った Alexei Starovoitov さん。 メールアドレスみると PLUMgrid という SDN ベンダーだったので、もともとのモチベーションは SDN だったのかなとなった。

おそらくその背景で書かれたと思われるスライドがあった。

EBPF and Linux Networking

データセンターにおける仮想化ベースのワークロード間のネットワーキング(主にスイッチング)を主眼において eBPF の適用という感じ。

昔のデータセンターのアーキテクチャ

  • 1サーバに1OS
  • Access, Distribution, Core という三層構成ネットワーク
  • 伝統的なL2/L3プロトコル (spanning treeとか)

課題

これだとスケールしないのでワークロードを仮想化していくことになった。

新たな課題

  • East-West トラフィックが激増した
  • MAC, VLAN の数が増大してスイッチのHW容量を超える

解法の歴史

  1. vSwitch
  2. vRouter
  3. Extensible Data-Plane