perfetto入门[一]-抓trace
1、基本概念
Perfetto 是一个开源的 SDK、守护进程和工具套件,使用 tracing 帮助开发者理解复杂系统的行为,并在客户端/嵌入式系统上定位功能和性能问题的根本原因。
- 高性能 tracing 守护进程
- 低开销 tracing SDK
- Android 和 Linux 上丰富的系统级 Probe(例如调度状态、CPU 频率、memory profiling、调用栈采样)
- 完全本地的、基于浏览器的 UI
- 强大的、基于 SQL 的分析库
2、可以使用perfetto来做什么呢?
2.1 性能优化
如果我们是android应用或者平framework开发者,perfetto是用来做性能开发的强大工具,它也是android默认的tracing工具。性能优化常见场景:
- 某个操作耗时很长
- 事件序列异常
- 不同进程和系统服务之间的交互
- 应用或者系统内存占用过高
- 如何优化cpu使用
- 各系统组件状态
2.2 学习系统代码
有了perfetto之后学习framework代码不再只依靠日志,可以同时查看多个进程在同一时刻的状态,以及各进程之间的交互。系统 trace 提供了跨内核、系统服务和应用程序活动的详细、时间相关的视图。这对于理解复杂的交互和调试跨多个组件的问题非常宝贵。 perfetto 相当于⼀个“可视化的⽇志系统”。
3、如何采集系统traces数据
3.1 命令行-adb shell perfetto
简易版本抓取trace
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 10s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace
3.2 脚本抓取 - record_android_trace
谷歌有提供工具,用于在 Android 上从命令行采集 traces并在结束后直接打开perfetto UI。 要求是要USB连接Android设备和电脑,要有adb。 脚本获取谷歌路径
curl -O https://raw.githubusercontent.com/google/perfetto/main/tools/record_android_trace
如果没有魔法,可以直接使用源码里external/perfetto/tools/record_android_trace。
~/work/android16/external/perfetto/tools$ python3 record_android_trace -o trace_file.perfetto-trace -t 10s -b 32mb -a '*' sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
#详细设置说明
python3 record_android_trace \
-o trace_file.perfetto-trace
# 此选项将 trace 配置为运行 10 秒。
-t 10s \
# 此选项将主缓冲区大小配置为 32MB。
-b 32mb \
# 此选项启用来自系统上所有应用程序的 atrace annotations。
-a '*' \
# 这些选项指定设备上一些最重要的插桩:CPU scheduling/frequency 以了解 CPU 上正在运行什么以及
# 系统对工作的重要性,以及 atrace annotations 以了解 userspace 进程(平台和应用程序)内部发生的情况。
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
3.3 perfetto UI直接抓取需要谷歌网下载工作!改用里面提供的命令行搭配config
如果你有谷歌网络可以根据perfetto UI提示:
1 导航到perfetto UI
2 点击左侧工具栏Record New Trace
3 进入到如下界面按照屏幕上的说明连接到你的设备
4 启用你想采集的probe(cpu、gpu、android系统服务、网络、内存、堆栈等)
5 点击绿色的 "Start Recording" 按钮,当 trace 正在录制时,在 Android 设备上执行一些操作
6 等设置的采集时间到后trace 将自动停止,将切换到收集的 trace 的
Timeline 视图。
如果没有谷歌网络,可以之间使用config文件,配置想采集的probe信息。config文件可以在UI界面选择后
Cmdline instructions里看到完整的配置和命令行。
# 在网页下载好config文件后,保存到到与设备usb连接的电脑,然后执行以下命令,就开始采集traces
cat config.txtpb | adb shell perfetto -c - --txt -o /data/misc/perfetto-traces/trace.pftrace
#trace停止后再拉取下来
adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace
目前这种方式是最常用的,可以根据自己的需求来采集trace。 一个简单的config实例:
buffers {
size_kb: 65536
fill_policy: DISCARD
}
buffers {
size_kb: 4096
fill_policy: DISCARD
}
data_sources {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "sched/sched_process_exit"
ftrace_events: "sched/sched_process_free"
ftrace_events: "task/task_newtask"
ftrace_events: "task/task_rename"
ftrace_events: "sched/sched_switch"
ftrace_events: "power/suspend_resume"
ftrace_events: "sched/sched_blocked_reason"
ftrace_events: "sched/sched_wakeup"
ftrace_events: "sched/sched_wakeup_new"
ftrace_events: "sched/sched_waking"
ftrace_events: "sched/sched_process_exit"
ftrace_events: "sched/sched_process_free"
ftrace_events: "task/task_newtask"
ftrace_events: "task/task_rename"
ftrace_events: "power/cpu_frequency"
ftrace_events: "power/cpu_idle"
ftrace_events: "power/suspend_resume"
ftrace_events: "power/psci_domain_idle_enter"
ftrace_events: "power/psci_domain_idle_exit"
ftrace_events: "power/gpu_frequency"
ftrace_events: "gpu_mem/gpu_mem_total"
ftrace_events: "power/gpu_work_period"
ftrace_events: "ftrace/print"
atrace_categories: "aidl"
atrace_categories: "am"
atrace_categories: "binder_driver"
atrace_categories: "camera"
atrace_categories: "dalvik"
atrace_categories: "disk"
atrace_categories: "freq"
atrace_categories: "gfx"
atrace_categories: "hal"
atrace_categories: "idle"
atrace_categories: "input"
atrace_categories: "memory"
atrace_categories: "memreclaim"
atrace_categories: "network"
atrace_categories: "power"
atrace_categories: "res"
atrace_categories: "sched"
atrace_categories: "ss"
atrace_categories: "sync"
atrace_categories: "thermal"
atrace_categories: "view"
atrace_categories: "webview"
atrace_categories: "wm"
atrace_categories: "workq"
atrace_apps: "*"
symbolize_ksyms: true
disable_generic_events: true
}
}
}
data_sources {
config {
name: "linux.process_stats"
target_buffer: 1
process_stats_config {
scan_all_processes_on_start: true
}
}
}
data_sources {
config {
name: "linux.sys_stats"
sys_stats_config {
stat_period_ms: 1000
stat_counters: STAT_CPU_TIMES
stat_counters: STAT_FORK_COUNT
cpufreq_period_ms: 1000
}
}
}
data_sources {
config {
name: "android.gpu.memory"
}
}
data_sources {
config {
name: "android.log"
android_log_config {
}
}
}
data_sources {
config {
name: "android.surfaceflinger.frametimeline"
}
}
duration_ms: 15000
4、查看trace
这里只看下perfetto UI timeline视图的样子。