Perfetto 사용법
Perfetto 사용법
1. What is Perfetto?
Perfetto는 Android와 Linux에서 시스템 성능을 추적(trace)하고 분석할 수 있도록 만든 오픈소스 profiling/tracing 플랫폼이다. 다시 말해, 커널(ftrace), HAL, 프레임워크(Android), 앱 등에서 일어나는 이벤트들을 동시에 기록할 수 있는 system tracer이다. 우리는 android kernel에서 직접 ODPM(On-Device Power Monitor, power rails) + 주요 주파수/스케줄링 이벤트를 함께 캡처하고, trace를 Perfetto UI/SQL로 후처리하여 SoC component별로 power를 측정할 수 있다.
ODPM은 구글 기기에서만 가능하므로 모바일에서는 Pixel 시리즈만 가능하다.
2. Permission check
권한을 확인하자. adb를 사용해 확인하며, adb가 무엇인지 또는 확인법을 모른다면 공부하고 오자.
1
adb devices
결과가 device가 아닌 unauthorized와 같은 상태가 아니도록 잘 권한을 얻어놓자.
TIP: 모드를 다른 걸로 바꿨다가 파일 전송으로 다시 바꾸면 될 수 있다.
3. Command lines
이제 perfetto를 사용하기 위해 어떤 데이터를 수집하도록 만들지 configuration 파일과 유사한 기능의 스크립트 파일을 만들어야 한다. 아래의 명령어를 실행하던지 또는 /data/local/tmp/power_log.pbtx 경로에 아래 파일 내용을 adb push 해놓으면 된다(어떤 상황이 있을지 몰라 일단 명령어를 분리해 놓겠다).
adb shell을 통해서/data/local/tmp에 접근하여 pefetto를 사용하기 위해서는 루트 권한이 필요하여 루팅을 해야한다(필자는 이미 루팅을 해놓은 상태). 하지만, 이 방식이 번거롭다면/sdcard/Documents이런 곳에 저장해서 실행해도 괜찮다.
1
2
3
adb shell 'cat > /data/local/tmp/power_perfetto.pbtxt <<EOF
<아래 스크립트 복붙>
EOF'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
buffers: { size_kb: 16384 } # main buffer (16MB)
duration_ms: 120000 # measurement duration
data_sources: {
config {
name: \"android.power\"
android_power_config {
battery_poll_ms: 250
# collecting battery guage and power rails (SoC components)
battery_counters: BATTERY_COUNTER_CAPACITY_PERCENT
battery_counters: BATTERY_COUNTER_CHARGE
battery_counters: BATTERY_COUNTER_CURRENT
battery_counters: BATTERY_COUNTER_VOLTAGE
collect_power_rails: true
collect_energy_estimation_breakdown: true
}
}
}
# ftrace: CPU Scheduling, frequencies, devfreq (DSU/DDR/GPU, etc.)
data_sources: {
config {
name: \"linux.ftrace\"
ftrace_config {
buffer_size_kb: 4096
ftrace_events: \"sched/sched_switch\"
ftrace_events: \"sched/sched_waking\"
ftrace_events: \"power/cpu_frequency\"
ftrace_events: \"power/cpu_idle\"
ftrace_events: \"devfreq/devfreq_frequency\"
}
}
}
# /proc based memory stat collection
data_sources: {
config {
name: \"linux.process_stats\"
process_stats_config { proc_stats_poll_ms: 1000 }
}
}
# package metadata (optinal, useful for uid/pacakge mapping in SQL)
data_sources: { config { name: \"android.packages_list\" } }
위의 스크립트 중 아래 것을 파일로 직접 작성해 삽입하는 경우, 꼭 \“를 "로 수정한 이후에 삽입하도록 한다.
실행 이후에는 파일이 잘 들어갔는지도 꼭 확인해주자.
4. Execution
아래 명령어로 실행할 수 있고, 실행 이후에는 -o flag 이후의 경로와 파일로 저장이 된다.
1
adb shell su -c 'perfetto --txt -c /data/local/tmp/power_perfetto.pbtxt -o /data/local/tmp/power_trace.perfetto-trace'
루트 권한이 없는 경우 다른 곳으로 경로 설정하자.
제대로 되었다면, 이러한 알림이 뜰 것이다.
1
2
[603.726] perfetto_cmd.cc:1117 Connected to the Perfetto traced service, TTL: 120s
[723.875] perfetto_cmd.cc:1280 Wrote 7186790 bytes into /data/misc/perfetto-traces/power_trace.perfetto-trace
이제 파일을 현재 있는 PC로 가져오자.
1
2
adb shell "su -c 'mv /data/misc/perfetto-traces/power_trace.perfetto-trace /sdcard/Documents/power_trace.perfetto-trace'"
adb pull /sdcard/Documents/power_trace.perfetto-trace .
다음 포스트는 이렇게 가져온 .perfetto-trace 파일을 분석하는 방법에 대한 내용이다.