コンテンツにスキップ

Perfetto - システム全体 トレーシング と分析 チートシート

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_hprofJava ヒープ ダンプ
track_eventアプリケーション発行スパン/カウンター

UI ワークフロー

ステップアクション
1ui.perfetto.devを開き、トレースをドラッグ イン
2タイムライン表示 CPU、スレッド、トラック
3W/S ズーム、A/D パン
4スライス をクリック。その期間と引数を確認
5範囲を選択 → 何が実行されたかの概要
6SQL 分析用クエリ ボックスを使用

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名前付き、ネストされた期間 イベント
schedCPU 当たりのスケジューリング スライス
thread_state実行/スリープ/ブロック間隔
counter数値 時系列 (周波数、メモリ)
processthreadプロセス/スレッド メタデータ

ローカル分析

# トレース 上の対話的 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 関連ツール

側面Perfettoperfbpftrace
モデルフル タイムライン トレースサンプリング プロファイラーアドホック eBPF プローブ
分析UI + SQLレポート/フレーム グラフカスタム スクリプト
最適用途レイテンシ/コンカレンシー/タイムラインCPU ホット スポット対象を絞った カーネル 質問
オーバーヘッド中程度 (設定可能)低い低い

perf (CPU ホット スポット)およびbpftrace (対象を絞ったプローブ)を補完;Perfetto は「何が起きたかを」答える。

リソース