Perfetto - 시스템 전체 추적 및 분석 치트시트
Perfetto는 Linux, Android, Chrome용 Google의 오픈소스 프로덕션 등급 추적 및 프로파일링 스택입니다. 시스템 전체 추적을 캡처합니다. 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 | 특정 커널 tracepoint |
duration_ms | 캡처 길이 |
-o | 출력 추적 파일 |
일반적인 데이터 소스
| 소스 | 기록 |
|---|
linux.ftrace | 스케줄링, syscall, IRQ, 커스텀 tracepoint |
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 | Running/sleeping/blocked 간격 |
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 카운터를 slowdown과 상관관계 |
| 앱 + 커널 상관관계 | 커널 이벤트와 같은 타임라인의 애플리케이션 스팬 |
Perfetto vs 관련 도구
| 측면 | Perfetto | perf | bpftrace |
|---|
| 모델 | 완전 타임라인 추적 | 샘플링 프로파일러 | 임시 eBPF 프로브 |
| 분석 | UI + SQL | 보고서/플레임 그래프 | 커스텀 스크립트 |
| 최적 용도 | 지연/동시성/타임라인 | CPU 핫 경로 | 대상 커널 질문 |
| 오버헤드 | 중간 (조정 가능) | 낮음 | 낮음 |
perf (CPU 핫 스팟)를 보완하고 bpftrace (대상 프로브)를 보완합니다; Perfetto는 “언제 무엇이 일어났는가”에 답합니다.
리소스