コンテンツにスキップ

ebpf_exporter - Prometheus 用カスタム カーネル メトリクス チートシート

ebpf_exporter - Prometheus 用カスタム カーネル メトリクス チートシート

ebpf_exporter (Cloudflare 製) はeBPF と Prometheusを橋渡し。標準エクスポーター はカーネル が既に公開するカウンター をサーフェス;ebpf_exporter は、カスタム eBPF プログラム をカーネル プローブ に接続し、それが測定する任意のもの を Prometheus メトリクス として公開 — ディスク I/O レイテンシ ヒストグラム、TCP 再送信 の原因、スケジューラー 実行キュー 遅延、ページ キャッシュ 動作。それは深いアドホック カーネル 質問を継続的にスクレイプされる 時系列に変わる。

要件

  • eBPF + BTF 付き Linux カーネル (5.x 推奨)
  • ルート / CAP_BPF 権限
  • メトリクス をスクレイプ する Prometheus

インストール

方法コマンド
バイナリGitHub Releases からダウンロード
Dockerdocker run --privileged -p 9435:9435 cloudflare/ebpf_exporter
ソースからgit clone https://github.com/cloudflare/ebpf_exporter && make
実行sudo ebpf_exporter --config.dir=examples --config.names=biolatency
メトリクスhttp://localhost:9435/metrics

バンドル された例 で実行

# ブロック I/O レイテンシ ヒストグラム をエクスポート
sudo ./ebpf_exporter --config.dir=examples --config.names=biolatency

# 複数のプログラム を一度に
sudo ./ebpf_exporter --config.dir=examples \
  --config.names=biolatency,tcp-syn-backlog,run-queue-latency
フラグ目的
--config.dirプログラム コンフィギュレーション のディレクトリ
--config.namesロード するプログラム (カンマ区切り)
--web.listen-addressバインド アドレス (デフォルト :9435)
--debug冗長 ロード/診断

バンドル されたプログラム (例)

プログラム測定
biolatencyブロック I/O レイテンシ ヒストグラム
bio-tracepointsデバイス/操作別ディスク I/O
run-queue-latencyタスク が実行 される前のスケジューラー 遅延
tcp-syn-backlogSYN バックログ 深さ
tcp-window-clampsTCP ウィンドウ クランピング イベント
timersタイマー/softirq 動作
cachestatページ キャッシュ ヒット/ミス
oomkillOOM キル イベント

コンフィギュレーション 構造

プログラム はコンパイル された eBPF オブジェクトをメトリクス 定義とペア:

metrics:
  histograms:
    - name: bio_latency_seconds
      help: Block IO latency histogram
      bucket_type: exp2
      bucket_multiplier: 0.000001   # マイクロ秒 → 秒
      bucket_min: 0
      bucket_max: 26
      labels:
        - name: device
          size: 32
          decoders:
            - name: string
        - name: bucket
          size: 8
          decoders:
            - name: uint
フィールド目的
counters / histogramsエクスポート するメトリクス タイプ
bucket_typeexp2 / linear ヒストグラム バケッティング
bucket_multiplier生カーネル ユニット をスケール秒 へ
labelseBPF マップ キー を Prometheus ラベル にマッピング
decoders生バイト を変換 (string、uint、ksym、cgroup…)

便利なデコーダー

デコーダー変換
stringバイト 配列 → ラベル 文字列
uint生整数
ksymカーネル アドレス → シンボル 名
majorminorデバイス 番号 → sdanvme0n1
cgroupcgroup ID → パス
static_map数値列挙 → 読み取り可能なラベル

Prometheus でクエリ

# デバイス 別 p99 ブロック I/O レイテンシ
histogram_quantile(0.99,
  sum(rate(bio_latency_seconds_bucket[5m])) by (le, device))

# スケジューラー 実行キュー 遅延 p95 (CPU 飽和 シグナル)
histogram_quantile(0.95,
  sum(rate(run_queue_latency_seconds_bucket[5m])) by (le))

いつ到達するか

質問標準エクスポーターebpf_exporter
「ディスクは ビジー か?」はい (node_exporter)
「I/O レイテンシー の分布は何か?」いいえはい
「タスク がスケジュール される前にどのくらい待つ か?」いいえはい
「TCP 再送信 がなぜ 発生するのか?」部分的にはい
「どの cgroup これを引き起こしたのか?」いいえはい (cgroup デコーダー)

ebpf_exporter vs 関連ツール

ツールモデル
ebpf_exporter継続的 eBPF メトリクス → Prometheus
bpftraceアドホック、対話型 eBPF ワンライナー
bcc-toolsプリビルト eBPF 診断ツール
node_exporter標準カーネル 発行メトリクス
bpftop実行中 eBPF プログラム のオーバーヘッド

bpftraceを使用して質問を対話的に探索してから、答えを永続的な ebpf_exporter メトリクス としてエンコード。

リソース