6/11/2017

Linux Enhanced BPF (eBPF)トレース・ツール

NetflixのエンジニアBrendan Gregg氏のホームページより

このページでは、Linux 4.xのカーネルに追加されたBPF(Berkeley Packet Filter)の拡張機能を利用して、単なるパケットフィルタをはるかに超えたことをBPFが可能にし、一例としてパフォーマンス分析を示す。これらの拡張機能は、Linux上で動的トレース、静的トレース、イベントのプロファイリングをカスタム解析プログラムを使って実行できる。

Bcc tracing tools

eBPFには、DTraceやSystemTapと同じような生のトレース機能があり、私は既にDTraceToolkit中の多くのツールをeBPFに移植している。次のような疑問に答えることに適している:

  • ext4オペレーションが50ミリ秒より掛かったか?
  • 実行待ち時間をヒストグラムで表すとどうなるか?
  • どのパケットやアプリがTCP再送信に悩んでいるか? (送受信をトレースせずに)効率的にトレースする
  • スレッドがブロック(off-CPU)された時、スタックトレースはどうなるか、そしてどのくらいの時間ブロックされていたか?

eBPFは、セキュリティモジュールやSDN(Software Defined Networking)でも利用できる。私はここではそれらをカバーしていない(まだ、とにかく)。また、eBPFはしばしば単に"BPF"と呼ばれることが特にlkmlではあるので、注意してほしい。

(省略)

4. eBPF

BPFはパケットフィルタを最適化する技術として考案された。tcpdumpを式付き(ホストやポートにマッチする)で実行する場合、カーネル内のサンドボックス化された仮想マシンによって実行される最適なBPFバイトコードにコンパイルされる。拡張BPF(別名eBPF、または単にBPF)は、このBPF仮想マシンが実行できるよう拡張された: パケット以外のイベントやフィタリング以外のアクションを実行できる。

eBPFは、SDN、DDoS軽減(早期パケットドロップ)、ネットワークパフォーマンスの改善(XDP: eXpress Data Path)、侵入受けんちなどに利用できる。このページで、私は以下のワークフローの中で示されるように観測ツール(observability tools)に利用に焦点を当てる:

Linux ebpf internals

我々の観測ツールには、レイテンシー測定、ヒストグラムの要約、スタックトレースの取得など、特定のアクションを実行するためのBPFコードを持っている。そのBPFコードは、BPFバイトコードにコンパイルされ、カーネルに送られる。カーネルに送られると、検証者が安全ではないと見なされれば(許可されないループや分岐命令を含むと)、拒絶される。BPFバイトコードが受け入れられると、別のイベントソースにアタッチすることができる:

  • kprobes: カーネル動的トレース
  • uprobes: ユーザレベルの動的トレース
  • tracepoints: カーネル静的トレース
  • perf_events: タイムサンプリングとPMC

BPFプログラムには、測定されたデータをユーザ空間にもおdす2つの方法がある: イベント毎の詳細かBPFマップ経由で、BPFマップは配列、連想配列、ヒストグラムを実装でき、要約統計量を渡すのに適している。

(省略)

Hacker News