# Ftrace
Ftrace は Linux の公式トレーサーであり、さまざまなトレーシングユーティリティから構成される多機能ツールである。[[Steven Rostedt]] が作り、Linux 2.6.27(2008年)で初めて追加された。ユーザーレベルフロントエンドなしで使えるため、記憶スペースが限られる組み込み Linux 環境に特に適しているが、サーバー環境でも役立つ。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 14 Ftrace]] §14.1)
## 構成
Ftrace はプロファイラとトレーサーの2層を持つ。プロファイラ(関数プロファイラ、hist トリガー)は回数・ヒストグラムといった集計情報を提供し、トレーサー(関数トレーサー、トレースポイント、[[kprobe]]、[[uprobe]]、関数グラフトレーサー、hwlat トレーサー)はイベントの詳細情報を提供する。これらは tracefs ファイルシステム(`/sys/kernel/tracing` または `/sys/kernel/debug/tracing`)を通じて操作され、シェルの `echo`/`cat` だけで扱えるようテキストインターフェースとして設計されている。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 14 Ftrace]] §14.1〜§14.2)
## 主な機能
- **関数プロファイラ**: `CONFIG_FUNCTION_PROFILER=y` で有効化。コンパイラが全カーネル関数の先頭に挿入する `__fentry__()` 呼び出しを利用し、関数呼び出し回数・所要時間の統計を取る。無効時は nop 命令に置き換わるためオーバーヘッドが小さい。
- **関数トレーサー / 関数グラフトレーサー**: `current_tracer` に `function`/`function_graph` を設定してイベント単位のトレース詳細やコールグラフを取得する。
- **kprobe / uprobe イベントトレーシング**: `kprobe_events`/`uprobe_events` に構文を書き込みカーネル/ユーザー関数を動的計装する。
- **hwlat トレーサー**: 割り込み無効ループで外部ハードウェアレイテンシを検出するマイクロベンチマーク的トレーサー。
- **hist トリガーと合成イベント**: Linux 4.7 でトム・ザヌッシが追加。イベントのカスタムヒストグラムやカーネル内でのレイテンシ計算まで可能にする。
(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 14 Ftrace]] §14.3〜§14.10)
## フロントエンド
tracefs を直接操作する以外に、[[trace-cmd]](Steven Rostedt らが開発、[[KernelShark]] という GUI を持つ)、[[perf]](1) の `ftrace` サブコマンド、[[perf-tools]]([[Brendan Gregg]] が開発したシェルスクリプト集)という3種類のフロントエンドがある。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 14 Ftrace]] §14.11〜§14.13)
## BPF との関係
Brendan Gregg は Ftrace の発展を、PID・スタックトレース別の集計や合成イベントによるカスタムレイテンシ計算など、段階的に拡張 BPF が必要とされていた機能を Ftrace 単体で実現してきた歴史として描写している。それでも [[BPF]]/[[eBPF]] はプログラマブルでより強力な機能を提供するとされ、Ftrace と BPF は補完関係にある。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 14 Ftrace]] §14.10.7, §14.13.6)
## 関連
- 出典: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 14 Ftrace]]
- エンティティ: [[Steven Rostedt]] / [[trace-cmd]] / [[perf-tools]] / [[KernelShark]] / [[Brendan Gregg]] / [[perf]]
- 概念: [[kprobe]] / [[uprobe]] / [[動的計装]] / [[BPF]] / [[eBPF]]