查看原文
其他

Android 系统分析工具:Perfetto 进阶使用

Editor's Note

Perfetto 进阶使用说明,主要是介绍 Perfetto 的网页抓取页面的参数是做什么的。相比传统 Systrace,Perfetto 有更丰富的功能,也可以打开更大的文件,同时可在传统 Systrace 和 Perfetto 之间切换,值得大家去学习

The following article is from 王小二的Android站 Author 王小二的Android站

前言

在[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

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存