Perfetto实战分析
前言
本文主要讲述了我在使用perfetto分析小米系统中桌面滑动卡顿的方法以及步骤。
这是我用的trace文件:
链接:https://pan.baidu.com/s/11EhCvu0pfR7Qfu6bDf_GLw?pwd=ic43
提取码:ic43
一、Perfetto是什么?
Perfetto 是用于性能检测和跟踪分析的生产级开源堆栈。它提供用于记录系统级和应用级跟踪、本机 + java 堆分析、使用 SQL 分析跟踪的库以及用于可视化和浏览多 GB 跟踪的基于 Web 的 UI 的服务和库。
二、分析步骤
1.将Trace文件导入到perfetto中
在地址栏输入https://ui.perfetto.dev/进入到perfetto中然后
点击Open trace file,然后打开刚才下载的trace文件。
2.分析卡顿原因
- 在滑动桌面的时候是松手之后发生卡顿。
- 从图中很明显可以看到有几次Choreographer#doFrame耗费的时间都很长,就可以大致知道桌面发生卡顿的原因应该是在这几个地方。
- 然后我们从系统的角度想想什么原因导致了它运行时间过长
- 大致有以下几个方面:CPU频率不足,CPU大小核调度,systemsever繁忙,surfacefinger繁忙,系统内存低,系统触发温度警报导致频率下降,整机CPU繁忙
- 下面让我们一个个来看:
发现三个可疑点:
很明显RenderThread线程耗时,任务繁忙,受CPU影响频率影响或者是跑到了小核上面。
我们先不看别的,我们先来看看surfacefinger,来看看APP是否提供了可用的Buffer来给surfacefinger进行合成,然后看一下surfacefinger主线程的合成情况,通过对比查看vsync-sf信号到来的时候是否有buffer可用,如果没有,则这一帧就发生了卡顿。(可以发现图中buffer为0)
接下来我们回到RenderThread线程,查看他的运行状态。
可以发现它一直在running状态,那我们基本可以断定是CPU的问题,接下来我们来查看下他是运行到了哪一个CPU,点击running即可查看:
我们可以发现前面未发生卡顿的时候,RenderThread是跑在CPU6上,而发生卡顿的时候是跑在了CPU2上面(一般默认数字小的是小核,数字大的是大核,这里小米10pro是高通骁龙865,有四个小核,三个大核,1个超大核)故可以知道此次掉帧的原因是调度问题,是CPU大小核调度问题。
至于 RenderThread 的任务为啥跑着跑着就掉到了小核,这个跟调度器是有关系的,大小核直接的调度跟任务的负载有关系,任务从大核掉到小核、或者从小核迁移到大核,调度器这边都是有参数和算法来控制的,所以后续的优化可能需要从这方面去入手,比如:
1.调整大小核迁移的阈值参数或者修改调度器算法
2.参考竞品表现,看看竞品在这个场景的性能指标,调度情况等,分析竞品可能使用的策略
总结
这是关于我此前使用perfetto工具对MIUI滑动桌面发生卡顿原因的分析。