Post

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 파일을 분석하는 방법에 대한 내용이다.

This post is licensed under CC BY 4.0 by the author.