『詳解 システム・パフォーマンス 第2版』を読む:第13〜15章 トレーシングツールの深淵(perf, Ftrace, BPF)

Progress 12 / 13
目次

はじめに

[!NOTE] この記事は、筆者が鈍器本を読みながら書き殴った個人的な読書メモをAIに食べさせ、ブログ用に読みやすく再構成させたものです。

これまでCPU、メモリ、ファイルシステム、ディスク、ネットワークといった各リソースのサバイバル術を整理してきましたが、今回はいよいよ本書の技術的なハイライトであり、高度なパフォーマンス分析を支える「第13章 perf」「第14章 Ftrace」「第15章 BPF」です。

システムが遅いとき、当て推量でパラメータを変えたり、本番環境でいきなりベンチマークツールを走らせたりするのは素人のやることですよね。私たちが本当にすべきことは、対象のシステムに悪影響を与えることなく、その内部状態を安全に観察することです。

今回は、現代のLinuxパフォーマンス分析において絶対に使いこなすべき3種の神器、**「perf」「Ftrace」「BPF(BCC/bpftrace)」**の内部構造と、現場での使い分けをチートシート化しました。


1. CPUとハードウェアの真実を暴く「perf」(第13章)

perf はLinuxの公式プロファイラであり、大規模なユーザーレベルプログラムでありながらLinuxカーネルソースツリーに含まれている特異な存在です。どのコードパスがCPUリソースを消費しているか、スレッドがなぜCPUを手放したかを明らかにしてくれます。

  • プロファイリングとフレームグラフ: perf はスタックトレースのサンプリングに極めて優れています。perf record を実行して perf.data を生成し、perf script でテキスト化すれば、カーネルとユーザー空間の両方でCPU時間がどこで消費されているかを丸裸にでき、フレームグラフの強力な土台となります。
  • ハードウェアカウンタ(PMC)の解析: CPU内部のキャッシュミスやストールサイクルといったマイクロアーキテクチャレベルの分析を行えるのも強みです。perf stat を使ってサイクル数や命令数を計測すると、サイクルあたりの命令数(IPC)などの「シャドウ統計」も自動的に計算して表示してくれます。
  • 多彩なイベントソースと軽量トレース: ハードウェアイベントのほか、トレースポイント、kprobe、uprobe、USDTを使った静的・動的トレーシングもサポートします。perf tracestrace の軽量版として機能し、ライブでシステムコールやブロックI/Oイベントの所要時間を追跡できるため、現場でのちょっとした調査に非常に便利ですね。

2. カーネルの奥深くを解き明かす職人ツール「Ftrace」(第14章)

カーネルのコードパスがどう分岐し、どの関数が遅いのかを知りたい場合は、カーネル組み込みの公式トレーサー Ftrace の出番です。/sys/kernel/tracing 配下のファイルシステムを直接操作して実行できるため、特殊なパッケージをインストールする必要がなく、組み込み環境からサーバーまで絶大な威力を発揮します。

  • 関数グラフトレーサー: Ftraceの真骨頂は、カーネル関数の呼び出し階層(親関数から子関数への流れ)をグラフィカルに表示し、それぞれの実行時間を計測できる機能です。親関数を遅くしている真犯人の子関数を一撃で特定できます。
  • 強力な hist トリガーと合成イベント: ファイル操作を通じて、指定したキー(PIDやスタックトレースなど)でイベントのヒストグラムを直接生成できます。さらに、複数のイベントの引数を組み合わせて経過時間(デルタ時間)を計算する「合成イベント」という強力な機能も備えており、シェルスクリプトだけで高度なレイテンシ分析が可能です。
  • フロントエンドツールの活用: 生のファイルを直接操作するのは骨が折れるため、現場では trace-cmd などのフロントエンドや、 perf-toolsexecsnoopiolatency などの単一目的ツール集)を活用するのが定石ですね。

3. 本番環境で使える究極の魔法「拡張BPF」(第15章)

旧来のトレーサーはすべてのイベントをユーザー空間に転送するため、本番環境に無視できないオーバーヘッドがかかっていました。BPFはカーネル内で直接・安全にデータを集計(ヒストグラム化など)できる、現代パフォーマンス分析の革命です。

BPFを扱うには、目的に応じて2つのフロントエンドを使い分けます。

  • BCC(複雑で完成されたツール群): biolatency(ディスクI/Oのヒストグラム化)や tcplife など、CやPythonで書かれた強力な既製ツール群です。コマンドのオプションを覚える必要はなく、「ただ実行するだけ」で不要なノイズのない完璧な出力が得られます。
  • bpftrace: awkやC言語にインスパイアされた高水準言語で、短いカスタムプログラムや1行プログラム(ワンライナー)をその場で書くためのツールです。プロセスIDやプロセス名などの「組み込み変数」と、count()sum()hist() などのマップ関数を組み合わせることで、既存のツールでは対応できないアプリケーション固有の事象を自由に分析できます。

おわりに

この3つの章を読むことで、私たちが普段遭遇する「謎の遅延」を解き明かすためには、状況に応じて適切な観測ツールを使い分ける必要があることが痛いほどよくわかります。