Perfetto 是谷歌开发的用于性能检测和跟踪分析的生产级开源堆栈。它提供用于记录系统级和应用程序级跟踪的服务和库,包括本机 + Java堆分析,使用SQL分析跟踪数据的C++库以及基于Web的可视化UI,能够清晰地展示GB级别体量的跟踪数据。Perfetto 适用于Linux内核和Android的整个系统范围内的性能数据收集、可视化及数据分析。
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-16497bc3a148f6c3a2a8bcedc04f76a9.png)
开启设备追踪
Android 11 (R)及以上默认开启Perfetto,Android 9 (P)和10 (Q) 需要手动开启,其他设备暂不支持:
# Needed only on Android 9 (P) and 10 (Q) on non-Pixel phones.
adb shell setprop persist.traced.enable 1
启动抓取方式
通过脚本工具tools/record_android_trace
,使用命令行工具启动设备抓取
adb shell perfetto [ --time TIMESPEC ] [ --buffer SIZE ] [ --size SIZE ]
[ ATRACE_CAT | FTRACE_GROUP/FTRACE_NAME]...
通过抓取页面Perfetto UI
Perfetto UI抓取简介
Recording settings
三种录制设置,适用不同的使用场景
Stop when full
- in-memory buffer size
设置存储trace的最大buffer大小,存储在内存中,不会影响到IO。 - Max duration
设置此次 trace 抓取的最大时长
该模式下Perfetto的停止受buffer大小和trace时长的控制,满足两个任意条件之一,即可停止trace。
优点:trace不会因为overwrite而导致丢失。
缺点:如果trace太多,会导致提前结束,无法录制到出现问题时候的trace。
Ring buffer
该模式只会收到Max duration的影响,时间到了就停止抓取trace,但是trace会有被overwrite的风险。
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-4abfd5486f957de5445b753b3b041ba1.png)
Long trace
用于长时间地抓取trace,但是由于需要定时将buffer中的trace写到文件里面去,会有IO的影响。
Flush on disk every
间隔多长时间将buffer中的trace写入到文件,这个数值不能太大也不能太小,太大容易丢trace,太小容易出现IO问题。trace的停止主要受控于Max duration,或者手动停止。
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-352740970472650930979d157c500a2b.png)
CPU
CPU相关的常见功能统计
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-f989c870409bf8cc776781e6874a095f.png)
- Coarse CPU usage counter
粗粒度的CPU相关使用统计 - Scheduling details
详细查看CPU运行的每个task - CPU frequency and idle states
查看每颗CPU的运行频率和是否空闲 - Syscalls
记录每一个系统调用,对性能影响较大,需要userdebug版本。
GPU
记录GPU的主频和内存使用
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-432dd40dd25513da9d44827068718205.png)
- GPU frequency
记录GPU的频率 - GPU memory
GPU内存使用量及各个进程的占用,仅支持Android 12+
Power
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-09c5c5c2aba05daa9c060b4a877a3567.png)
Memory
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-c780796814081bb7edd8e118aca9b843.png)
Android apps & svcs
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-c1268728882723761b068572142aff16.png)
- Atrace userspace annotations
开启这个选项之后,选择合适的atrace tag就可以开启对应的trace了,这个tag就对应了System Tracing的界面的catergray。 - Event log (logcat)
可以实时记录log,然后将log和trace信息一一对应。 选择合适的log类型,就可以记录相应的log。
Chrome
如果需要分析webview相关的性能问题,可以开启该选项的相关功能
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-72e4715043531dff8473599976b09e5e.png)
Stack Samples
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-f1a75ae8fade84f8705e323811c6a7f2.png)
- Callstack sampling
定期记录进程的当前函数调用堆栈
Advanced settings
目前只有一个开启ftrace功能,用于分析内核性能问题,可以选择相应的tag进行记录
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-86208c4b8aa42a01992ea652490b9f97.png)
Recording command
配置汇总和执行,完成上述参数配置后,可以在改选项中获得所有的配置参数,拷贝命令,直接adb开启录制追踪。
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-7ec84ae896c38a832636b48606339bd1.png)
adb shell perfetto
-c - --txt
-o /data/misc/perfetto-traces/trace
<
trace 文件获取
使用 adb pull /data/misc/perfetto-traces/trace ~/trace.perfetto-trace
提取跟踪日志文件并在 Perfetto UI 中打开它。
trace文件过大加载问题
当trace文件大于1G时,Open trace file会出现oops 内存溢出无法访问。
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-d0b0e5c6510cd3029fa6692dd4c113fb.png)
可以使用Trace Processor来加载trace文件
# Download prebuilts (Linux and Mac only)
curl -LO https://get.perfetto.dev/trace_processor
chmod +x ./trace_processor
# Start the interactive shell
./trace_processor trace.perfetto-trace
# Start a local trace processor instance to replace wasm module in the UI
./trace_processor trace.perfetto-trace --httpd
执行./trace_processor trace.perfetto-trace --httpd
后,Chrome浏览器打开 https://ui.perfetto.dev/#!/ ,会自动检测本地是否已经有trace_processor生成的HTTP SERVER(9001端口),如下图提示,请选择“YES, use loaded trace”,将自动解析 trace_processor已经加载的pftrace文件。
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-e1cb789a8d704e45d95c8f5dd196c048.png)
分析方法简介
slice 片段
对应代码中 Trace.beginSection/ATRACE_BEGIN 记录的事件,选中后会显示黑色边框
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-eecd56ad40e70b3c5d3a8f237a7e2ef9.png)
counter
计数器,记录离散的数值点,对应代码中 Trace.beginCounter/ATRACE_INT 记录的事件
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-c5c602c6990fa1eb402d2cbeef8c8df7.png)
CPU调度和频率
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-19f73a35215dd93bfe61fc77c030e56b.png)
线程状态
点击片段上方线程调度信息片段(Running),可以看到线程当前运行在哪个CPU上
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-a31209ca2ff54af7f85a55c602abd870.png)
点击箭头 ,可以在CPU调度中看到该运行片段以及调度时延信息。
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-e651c979fec04193385e4fda32ebbd58.png)
被P: /system/bin/traced_probes [1488]T: traced_probes [1488]线程唤醒,从就绪到运行延迟了 774us 792ns,再次点击箭头,可以回到原片段,这个跳转比较灵活方便。
锁竞争(lock contention)
在lock contention 片段上,可以点击上边的monitor contention来查看当前对象锁竞争发生的调用栈,如下详情中显示当前对象锁被Owner (Binder:1754_16)持有,其持锁当前运行在serviceDoneExecuting (AMS.java 16426行),且当前等待该对象锁的线程已经有5个了;当前线程执行被阻塞在getUidState方法中(AMS.java 6614行)。
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-75da938bffe6b3fd4df94aa40479ba7c.png)
SQL查询
Perfetto支持通过sql语句查询数据,提供常见的格式和关键字段信息:
- slice表,横向track上的一条条小片段
- ts:片段起始时间戳(单位ns)
- dur:片段持续时长(ns)
- track_id属于哪个track(水平timeline)
- name: 片段标注的名称,对应Trace中打印的方法名、标记等信息
- thread_track表,utid标识线程tid,并不是真实的线程tid
- thread表,表示各线程信息,其中utid和thread_track表的utid关联
- process表,upid和thread表的upid关联,表示线程所属的父进程
- sched_slice,线程调度片段
- thread_state,各track上边的线程调度片段,标识线程运行状态
Slices
横向轴上的一小段时间片段,具有指定的名称
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-adf4232382729b30018d4bc1c9c04eb6.png)
> SELECT ts, dur, name FROM slice
ts dur name
-------------------- -------------------- ---------------------------
261187017446933 358594 eglSwapBuffersWithDamageKHR
261187017518340 357 onMessageReceived
261187020825163 9948 queueBuffer
261187021345235 642 bufferLoad
261187121345235 153 query
...
Counters
根据时间记录的离散数值点
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-fcfaa4092f175f7bd7205738f542b87b.png)
···
SELECT ts, value FROM counter
ts value
261187012149954 1454.000000
261187012399172 4232.000000
261187012447402 14304.000000
261187012535839 15490.000000
261187012590890 17490.000000
261187012590890 16590.000000
…
···
Scheduler slices
CPU运行的详细task
![](https://www.dandroid.cn/wp-content/uploads/2023/11/frc-dafc892c67263d1db85f8b270035514d.png)
> SELECT ts, dur, cpu, utid FROM sched
ts dur cpu utid
-------------------- -------------------- -------------------- --------------------
261187012170489 267188 0 390
261187012170995 247153 1 767
261187012418183 12812 2 2790
261187012421099 220000 6 683
261187012430995 72396 7 2791
...
参考文章
2、https://ui.perfetto.dev/#!/record
3、https://www.cnblogs.com/treecarrybear/p/17056783.html
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/21882,转载请注明出处。
评论0