Perfetto - システム全体 トレーシング と分析 チートシート
Perfetto は Google のオープンソース、本番グレードトレーシングとプロファイリング スタック (Linux、Android、Chrome 用)。それはシステム全体トレースをキャプチャ — CPU スケジューリング、syscall、周波数変更、メモリ イベント、カスタム アプリケーション イベント — コンパクト protobuf フォーマットに、その後、洗練されたウェブ UI で探索することを可能にするか、独自に、SQL でクエリ。perf が スタック をサンプルするところ、Perfetto は、レイテンシとコンカレンシー問題に必要な、すべてのスレッドと CPU が何をしていたかのタイムラインを記録。
インストール
| コンポーネント | 方法 |
|---|
| UI (インストール不要) | ブラウザでui.perfetto.devを開く |
| CLI ツール | GitHub Releases からtracebox/perfettoをダウンロード |
| Android | 組み込み (adb shell perfetto ...) |
| trace_processor | ローカル SQL 分析用にダウンロード |
| 確認 | ./tracebox --help |
トレースをキャプチャ (Linux)
# ftrace スケジューリング データを使用した簡単な 10 秒間システム全体トレース
./tracebox -o trace.pftrace --txt -c - <<EOF
buffers: { size_kb: 65536 }
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "sched/sched_switch"
ftrace_events: "sched/sched_wakeup"
ftrace_events: "power/cpu_frequency"
}
}
}
duration_ms: 10000
EOF
| エレメント | 目的 |
|---|
buffers | トレース データ用リング バッファー サイズ |
data_sources | 何をレコード するか (ftrace、procstats、heapprofd、…) |
ftrace_events | 特定の カーネル トレースポイント |
duration_ms | キャプチャ 長さ |
-o | 出力 トレース ファイル |
共通のデータ ソース
| ソース | レコード |
|---|
linux.ftrace | スケジューリング、syscall、IRQ、カスタム トレースポイント |
linux.process_stats | 時間経過に伴う プロセス別 CPU/メモリ |
linux.sys_stats | システム全体カウンター (meminfo、vmstat) |
android.heapprofd | ネイティブ ヒープ プロファイリング |
android.java_hprof | Java ヒープ ダンプ |
track_event | アプリケーション発行スパン/カウンター |
UI ワークフロー
| ステップ | アクション |
|---|
| 1 | ui.perfetto.devを開き、トレースをドラッグ イン |
| 2 | タイムライン表示 CPU、スレッド、トラック |
| 3 | W/S ズーム、A/D パン |
| 4 | スライス をクリック。その期間と引数を確認 |
| 5 | 範囲を選択 → 何が実行されたかの概要 |
| 6 | SQL 分析用クエリ ボックスを使用 |
SQL 分析 (スーパーパワー)
Perfetto のトレース プロセッサー はトレース をクエリ可能なテーブルとして公開。
-- 最長実行スライス
SELECT name, dur/1e6 AS ms
FROM slice
ORDER BY dur DESC
LIMIT 20;
-- プロセス別 CPU 時間
SELECT p.name, SUM(s.dur)/1e6 AS cpu_ms
FROM sched s JOIN thread t USING(utid) JOIN process p USING(upid)
GROUP BY p.name ORDER BY cpu_ms DESC;
-- スレッド がなぜ ブロック されたのか?
SELECT ts, dur, state
FROM thread_state
WHERE utid = 42 AND state != 'Running'
ORDER BY dur DESC;
| テーブル | 含まれるもの |
|---|
slice | 名前付き、ネストされた期間 イベント |
sched | CPU 当たりのスケジューリング スライス |
thread_state | 実行/スリープ/ブロック間隔 |
counter | 数値 時系列 (周波数、メモリ) |
process、thread | プロセス/スレッド メタデータ |
ローカル分析
# トレース 上の対話的 SQL シェル
./trace_processor trace.pftrace
# クエリ を実行し、スクリプト作成用 JSON を出力
./trace_processor -q query.sql --query-output json trace.pftrace
Perfetto が最適な場合
| 問題 | Perfetto はなぜ 役に立つか |
|---|
| レイテンシ スパイク | その瞬間に正確に何が実行/ブロック されたかを確認 |
| ロック競合 | thread_stateはブロック間隔と理由を表示 |
| CPU マイグレーション/スケジューリング | すべてのスレッドの CPU 当たりタイムライン |
| 周波数/熱エフェクト | cpufreq カウンター をスローダウン と相関 |
| アプリ + カーネル 相関 | カーネル イベント と同じタイムライン上のアプリケーション スパン |
Perfetto vs 関連ツール
| 側面 | Perfetto | perf | bpftrace |
|---|
| モデル | フル タイムライン トレース | サンプリング プロファイラー | アドホック eBPF プローブ |
| 分析 | UI + SQL | レポート/フレーム グラフ | カスタム スクリプト |
| 最適用途 | レイテンシ/コンカレンシー/タイムライン | CPU ホット スポット | 対象を絞った カーネル 質問 |
| オーバーヘッド | 中程度 (設定可能) | 低い | 低い |
perf (CPU ホット スポット)およびbpftrace (対象を絞ったプローブ)を補完;Perfetto は「何が起きたかを」答える。
リソース