在[061]perfetto使用简介中,介绍了如何使用System Tracing的界面中来抓perfetto trace,这个方式的好处就是不需要连接电脑,可以离线抓取,但是perfetto有其他强大的功能,需要使用连接电脑才能发挥。
打开以下链接
https://ui.perfetto.dev/#!/record
简单理解,这个界面是用于可视化开启关闭perfetto的选项生成对应的指令。
首先是选择录制的设置,主要有三种模式,每种模式的作用不一样。
代表每一个核上可以存储的最大的trace的buffer,在内存中,不会影响IO。
设置此次trace抓取的最大时长,图中就是10s。
Stop when full模式下,perfetto停止工作受Max duration和buffer size影响,一旦满足其中一个条件,perfetto将会停止。
优点:trace不会因为overwrite而导致丢失。
缺点:如果trace太多,会导致提前结束,无法录制到出现问题时候的trace。
一般10s,64mb也就够用了。
可以看到选项和2.1 Stop when full一样,意思也是一样。Ring buffer模式只会收到Max duration的影响,时间到了就停止抓取trace,但是trace会有被overwrite的风险。
用于长时间地抓取trace,但是由于需要定时将buffer中的trace写到文件里面去,会有IO的影响。前面两个选项和前两个模式的意思是一样的。
代表生成long trace的最大文件大小,在使用perfetto,你需要评估一下可能生成的文件的大小,如果在你设置的Max duration期间,Max file size超了,会有异常bug产生,perfetto会停不下来来了。
间隔多少时间将buffer中的trace写入到文件中。这个数值不能太大也不能太小。太大了,容易丢trace,太小了容易影响IO。
Long trace主要是受Max duration,或者ctrl + c暂停命令。
我个人最推荐的配置:
64MB,30m,10GB,2500ms。
当然对于long trace,一般是用于用户去复现问题,我更推荐用[061]perfetto使用简介的离线抓取方式。
这三种模式的特性都了解了,可以根据自己的实际使用需求,选择合适的模式抓取perfetto trace。
这个界面就是生成指令的地方,点击右上角的复制按钮,在PC连接手机的情况下,运行这个指令就可以抓取trace了。
CPU选项是经常使用的,基本上除了syscalls不打开,前面三个都会常规打开。
我一般都会开,但是目前没有发现在perfetto的文件打开之后主要对应那块的数据。
可以看到每个cpu上运行的task
可以看到每个cpu的运行频率
可以记录每一个系统调用,但是我一般不开,因为感觉影响性能比较大。
可以记录GPU的主频和GPU的内存
可以看到GPU的频率,繁忙程度
可以看到目前只能在Android12+以上的使用
我基本就不开了,对处理功耗的问题的朋友有用。可以尝试开一下,看看什么效果。
有关内存的那么多选项,大家可以按需选择开启关闭,英文也比较简单的。
我一般不开,当怀疑是内存导致的性能问题,我会选择开启。
这是最重要的选项,性能优化肯定要用到的。
开启这个选项之后,选择合适的atrace tag就可以开启对应的trace了,这个tag就对应了System Tracing的界面的catergray。
这是perfetto一个很牛逼的功能,可以实时记录log,然后将log和trace信息一一对应。
非常有利于分析问题。选择合适的log类型,就可以记录log了。
这个是Android 12(S)的新功能,具体如何使用可以参考这个网址的官方视频
https://www.youtube.com/playlist?list=PLWz5rJ2EKKc-xjSI-rWn9SViXivBhQUnp
可以看到SF某一帧是合成的APP的哪一帧,已经合成的状态,具体作用,大家可以参考上面的链接视频。
这个选项,主要是分析webview相关的性能问题,我也用的不多,大家如果遇到需要分析webview相关的性能问题,可以尝试开启这些功能。
目前就一个功能,开启ftrace,对于需要分析内核性能问题,可以开启这个,选择对应的tag。
这个开关,并不在这个界面中,我们可以手动加上这个flag
atrace_apps: "*"
大家可以发现,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"
atrace_apps: "*"
}
}
}
duration_ms: 10000
EOF