前言
在[061]Perfetto 使用简介中,介绍了如何使用System Tracing的界面中来抓 Perfetto trace,这个方式的好处就是不需要连接电脑,可以离线抓取,但是 Perfetto有其他强大的功能,需要使用连接电脑才能发挥
1. Record new trace
打开以下链接
https://ui.perfetto.dev/#!/record
简单理解,这个界面是用于可视化开启关闭 Perfetto 的选项生成对应的指令
2. Recording settings
首先是选择录制的设置,主要有三种模式,每种模式的作用不一样
2.1 Stop when full
2.1.1 In-memory buffer size
代表每一个核上可以存储的最大的trace的buffer,在内存中,不会影响IO
2.1.2 Max duration
设置此次trace抓取的最大时长,图中就是10s
小结
Stop when full 模式下,Perfetto 停止工作受 Max duration 和 buffer size影响,一旦满足其中一个条件,Perfetto 将会停止
优点:Trace 不会因为 overwrite 而导致丢失
缺点:如果 Trace 太多,会导致提前结束,无法录制到出现问题时候的 Trace。
一般 10s,64mb 也就够用了
2.2 Ring buffer
可以看到选项和 2.1 Stop when full 一样,意思也是一样。Ring buffer 模式只会收到 Max duration 的影响,时间到了就停止抓取 Trace,但是 Trace会有被 overwrite 的风险
2.3 Long Trace
用于长时间地抓取 Trace,但是由于需要定时将 Buffer 中的 Trace 写到文件里面去,会有 IO 的影响。前面两个选项和前两个模式的意思是一样的
2.3.1 Max file size
代表生成 Long Trace 的最大文件大小,在使用 Perfetto,你需要评估一下可能生成的文件的大小,如果在你设置的 Max Duration 期间,Max file size 超了,会有异常 bug 产生,Perfetto 会停不下来来了
2.3.2 Flush on disk every
间隔多少时间将 buffer 中的 trace 写入到文件中。这个数值不能太大也不能太小。太大了,容易丢 Trace,太小了容易影响IO
小结
Long Trace 主要是受 Max duration,或者 Ctrl + C 暂停命令。
我个人最推荐的配置:64MB,30m,10GB,2500ms
当然对于 Long Trace,一般是用于用户去复现问题,我更推荐用[061]Perfetto 使用简介的离线抓取方式
2.4 选择合适模式
这三种模式的特性都了解了,可以根据自己的实际使用需求,选择合适的模式抓取Perfetto Trace
3. Recording command
这个界面就是生成指令的地方,点击右上角的复制按钮,在 PC 连接手机的情况下,运行这个指令就可以抓取 Trace 了
下面各个选项的打开关闭,都会更新这个 Recording command
4. CPU
CPU选项是经常使用的,基本上除了 Syscalls 不打开,前面三个都会常规打开
4.1 Coarse CPU usage countor
我一般都会开,但是目前没有发现在 Perfetto 的文件打开之后主要对应那块的数据
4.2 Scheduling details
可以看到每个 cpu 上运行的 task
4.3 CPU frequency and idle states
可以看到每个 cpu 的运行频率
4.4 Syscalls
可以记录每一个系统调用,但是我一般不开,因为感觉影响性能比较大
5. GPU
可以记录 GPU 的主频和 GPU 的内存
5.1 GPU frequency
可以看到 GPU 的频率,繁忙程度
5.2 GPU memory
可以看到目前只能在 Android12+ 以上的使用
6. Power
我基本就不开了,对处理功耗的问题的朋友有用。可以尝试开一下,看看什么效果
7. Memory
有关内存的那么多选项,大家可以按需选择开启关闭,英文也比较简单的。
我一般不开,当怀疑是内存导致的性能问题,我会选择开启
8. Android APP & svcs
这是最重要的选项,性能优化肯定要用到的
8.1 Atrace userspace annotations
开启这个选项之后,选择合适的 atrace tag 就可以开启对应的 Trace 了,这个 Tag就对应了 System Tracing 的界面的 Catergray (注意:这里需要手动选择,或者 Ctrl + A 全选)
8.2 Event log(logcat)
这是 Perfetto 一个很牛逼的功能,可以实时记录 Log,然后将 Log 和 Trace 信息一一对应,非常有利于分析问题。选择合适的 Log 类型,就可以记录 Log 了 (注意:这里需要手动选择,或者 Ctrl + A 全选)
生成的 Perfetto 文件,滑动下方的 Android Log,可以看到有一根竖线,对应到 Trace 的 Tag,日志和 Trace Tag 的一一对应,是不是很牛逼的功能
8.3 Frame timeline
这个是Android 12(S)的新功能,具体如何使用可以参考这个网址的官方视频
https://www.youtube.com/playlist?list=PLWz5rJ2EKKc-xjSI-rWn9SViXivBhQUnp
可以看到 SF 某一帧是合成的 APP 的哪一帧,已经合成的状态,具体作用,大家可以参考上面的链接视频
9. Chrome
这个选项,主要是分析 Webview 相关的性能问题,我也用的不多,大家如果遇到需要分析 Webview 相关的性能问题,可以尝试开启这些功能
10. Advanced settings
目前就一个功能,开启 FTrace,对于需要分析内核性能问题,可以开启这个,选择对应的 Tag
总结
大家可以发现,Perfetto 的功能比传统的 Systrace 的功能强大很多,而且 Google 也在推荐使用这个,这个应该是未来的趋势,我贴一个我常用的 Perfetto 的指令(一次配置好之后,复制到命令行就可以重复使用了)
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
buffers: {
size_kb: 63488
fill_policy: DISCARD
}
buffers: {
size_kb: 2048
fill_policy: DISCARD
}
data_sources: {
config {
name: "android.gpu.memory"
}
}
data_sources: {
config {
name: "linux.process_stats"
target_buffer: 1
process_stats_config {
scan_all_processes_on_start: true
}
}
}
data_sources: {
config {
name: "android.log"
android_log_config {
log_ids: LID_EVENTS
log_ids: LID_CRASH
log_ids: LID_KERNEL
log_ids: LID_DEFAULT
log_ids: LID_RADIO
log_ids: LID_SECURITY
log_ids: LID_STATS
log_ids: LID_SYSTEM
}
}
}
data_sources: {
config {
name: "android.surfaceflinger.frametimeline"
}
}
data_sources: {
config {
name: "linux.sys_stats"
sys_stats_config {
stat_period_ms: 1000
stat_counters: STAT_CPU_TIMES
stat_counters: STAT_FORK_COUNT
}
}
}
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "sched/sched_switch"
ftrace_events: "power/suspend_resume"
ftrace_events: "sched/sched_wakeup"
ftrace_events: "sched/sched_wakeup_new"
ftrace_events: "sched/sched_waking"
ftrace_events: "power/cpu_frequency"
ftrace_events: "power/cpu_idle"
ftrace_events: "power/gpu_frequency"
ftrace_events: "gpu_mem/gpu_mem_total"
ftrace_events: "sched/sched_process_exit"
ftrace_events: "sched/sched_process_free"
ftrace_events: "task/task_newtask"
ftrace_events: "task/task_rename"
ftrace_events: "ftrace/print"
atrace_categories: "am"
atrace_categories: "adb"
atrace_categories: "aidl"
atrace_categories: "dalvik"
atrace_categories: "audio"
atrace_categories: "binder_lock"
atrace_categories: "binder_driver"
atrace_categories: "bionic"
atrace_categories: "camera"
atrace_categories: "database"
atrace_categories: "gfx"
atrace_categories: "hal"
atrace_categories: "input"
atrace_categories: "network"
atrace_categories: "nnapi"
atrace_categories: "pm"
atrace_categories: "power"
atrace_categories: "rs"
atrace_categories: "res"
atrace_categories: "rro"
atrace_categories: "sm"
atrace_categories: "ss"
atrace_categories: "vibrator"
atrace_categories: "video"
atrace_categories: "view"
atrace_categories: "webview"
atrace_categories: "wm"
}
}
}
duration_ms: 10000
EOF