Perfetto是用于性能检测和跟踪分析的生产级开源堆栈。它提供用于记录系统级和应用程序级跟踪的服务和库,本机Java堆分析,使用SQL分析跟踪的库以及基于Web的UI以可视化的系统性能分析。在Android上,Perfetto是下一代系统性能的分析工具,它取代了systrace。 仍完全支持SYSTRACE.
其架构图如下:
Perfetto能抓哪些平台的log
Ø Android
Ø Linux
Ø Chrome
Ø 其他baselinux的嵌入式系统
Ø Fuchsia
· 内核跟踪:Perfetto与Linux的ftrace集成,并允许将内核事件(例如调度事件,系统调用)记录到log 中。
· / proc和/sys pollers,它们可以随时间采样进程范围或系统范围的cpu和内存计数器的状态。
· 与Android HALs模块集成,用于记录电池和电量消耗计数器。
· Native memroy profiling:能分析进程的native的memory 包括malloc / free / new / delete并将内存与调用栈相关联。
· Java memory分析:与Android RunTime集成,能分析进程堆保留图的完整快照(类型,字段名称,保留的大小和对其他对象的引用),能分析出java内存使用情况。
PerfettoUI 能解析哪些log
- Perfetto native protobuf format
- Linux ftrace
- Android systrace
- Chrome JSON (including JSON embedding Android systrace text)
- Fuchsia binary format log
- Ninja logs (the build system)
Tracing SDK anduser-space instrumentation
可以在C 程序中添加Perfetto trace来debug 程序的性能问题。如TRACE_EVENT("category", "event_name","x", "str", "y", 42)。
Trace analysis
除抓log外功能外,Perfetto代码库还包括一个专用项目,用于导入,解析和查询新的和旧的systrace log 分析--Trace Processor。
Trace Processor是一个可移植的C 11库,它提供面向列的表存储,专门设计用于将数小时的跟踪数据有效地保存到内存中,并基于流行的SQLite查询引擎公开SQL查询接口。跟踪数据模型成为一组 SQL表,可以通过极其强大和灵活的方式查询和联接这些SQL表以分析跟踪数据。
最重要的是,Trace Processor还包括一个基于跟踪的指标子系统,该子系统由预烘焙和可扩展的查询组成,可以以JSON或protobuf消息的形式(例如,不同频率下的CPU使用率)输出有关跟踪的强类型摘要。状态,按进程和线程细分)。
基于跟踪的度量标准允许在性能测试方案或批处理分析或大型跟踪主体中轻松集成跟踪。
跟踪处理器还设计用于低延迟查询和构建跟踪可视化器。Perfetto UI将跟踪处理器用作Web程序集模块,将Android Studio和 Android GPU检查器用作本机C 库。
Tracevisualization
Perfetto还提供了一个全新的跟踪可视化工具,用于打开和查询长达数小时的跟踪,可从ui.perfetto.dev获得。新的可视化工具利用了现代Web平台技术。基于WebWorkers的多线程设计使UI始终保持响应;浏览器和SQLite的分析能力可通过WebAssembly在浏览器中完全使用。
打开一次后,Perfetto UI可以完全脱机工作。使用UI打开的跟踪由浏览器在本地处理,不需要任何服务器端交互。
Perfetto与systrace
· Perfetto完全兼容systrace
· Perfetto可以抓更丰富、更全面,更长时间的log。Perfetto 适用于多平台。
· Perfetto 是基于SQL lite的,更便于后处理。
· Perfetto 可以显示 sys call/进程memory/系统memory等
· Perfetto 显示不够systrace 友好。
Memory debug 例子
我们可以使用Perfetto从内核获取有关内存管理事件的信息。
- 拍照时memory 使用情况
adb shell perfetto
-c ---txt
-o/data/misc/perfetto-traces/trace
<<EOF
buffers: {
size_kb: 8960
fill_policy: DISCARD
}
buffers: {
size_kb:1280
fill_policy: DISCARD
}
data_sources: {
config {
name: "linux.process_stats"
target_buffer: 1
process_stats_config {
scan_all_processes_on_start: true
}
}
}
data_sources: {
config{
name: "linux.ftrace"
ftrace_config {
ftrace_events: "mm_event/mm_event_record"
ftrace_events: "kmem/rss_stat"
ftrace_events: "kmem/ion_heap_grow"
ftrace_events: "kmem/ion_heap_shrink"
}
}
}
duration_ms: 30000
EOF
拍照完成后,pull trace 文件。
使用提取文件adb pull/data/misc/perfetto-traces/trace ~/mem-trace 并上传到Perfetto UI。这将显示有关系统memory使用情况的总体统计信息,并扩展每个进程的统计信息。这将显示摄像机各种内存统计信息的时间表。
我们可以看到大约有2/3,内存增加了(在mem.rss.anon跟踪中)。这是查看应用程序内存使用情况如何对不同触发器做出反应的好方法。
Analyzing the Native Heap
应用程序通常通过mallocC 获取内存,new而不是直接从内核获取内存。分配器确保您的内存得到更有效的处理,并且确保请求内核的开销仍然很低。
我们可以记录本地分配,并使用heapprofd释放进程执行的 分配。结果配置文件可用于将内存使用情况归因于特定的函数调用堆栈,从而支持本机代码和Java代码的混合使用。配置文件仅显示运行时完成的分配,之前显示的任何分配都不会显示。
使用tools/heap_profile脚本来分析进程
$ tools/heap_profile -n system_server
Profiling active. Press Ctrl C to terminate.
You may disconnect your device.
Wrote profiles to /tmp/profile-1283e247-2170-4f92-8181-683763e17445(symlink /tmp/heap_profile-latest)
Thesecan be viewed using pprof. Googlers: head to pprof/ and upload them.
当您看到“性能分析”处于活动状态时,请测试你的用例。完成后,按Ctrl-C结束配置文件。
然后将raw-trace文件从输出目录 上载到Perfetto UI,然后单击显示的菱形标记。
可用的选项卡是
- space: how many bytes were allocated but not freed at this callstack the moment the dump was created.
- alloc_space: how many bytes were allocated (including ones freed at the moment of the dump) at this callstack
- objects: how many allocations without matching frees were sampled at this callstack.
- alloc_objects: how many allocations (including ones with matching frees) were sampled at this callstack.
默认视图将向您显示配置文件运行时完成但尚未释放的所有分配(空格选项卡)。
我们可以看到,在的路径中分配了很多内存 ResourceManager.loadApkAssets。要获得以这种方式分配的总内存,我们可以在“焦点”文本框中输入“loadApkAssets”。这只会显示某些框架与“ loadApkAssets”匹配的调用堆栈。
Perfetto 提供了更丰富的分析手段和更强大的功能,然而,其坏处非常明显。
· 抓Perfetto log比较复杂,不知道怎么抓,不习惯。
· 就是需要把自己的perfetto 上传到https://ui.perfetto.dev/#!/才能解析。安全性/方便性得不到解决。
然而,我们将会提供非常方便、非常安全的方式解决perfetto 解析的问题,敬请期待!