Perfetto分析Trace后,如何定位问题?

667 阅读8分钟

一图查››

image.png

一、APP问题

  1. 普通耗时问题

  1. 主线程阶段耗时

案例Trace图示发生阶段/所属策略原因说明/执行建议
input主线程input事件处理流程时间较长
deliverInputEvent主线程deliverInputEvent事件处理流程过长
animation主线程动画流程时间过长,需要关注动画相关callback中的具体逻辑
AssetManager::OpenXmlAsset主线程
relayoutWindow主线程该流程触发了relayoutWindow。有可能是由于界面发现变化导致。需要关注实际触发relayoutWindow的原因。
measure主线程
layout主线程存在较长的layout流程,需要关注界面变化
inflate主线程
draw主线程draw 流程较长
syncAndDrawFrame主线程较长的 Draw 流程是由于上一帧渲染线程存在耗时导致,因此触发 postAndWait 状态,需要对上一帧渲染线程进行重点分析
postAndWait主线程本帧/上一帧的渲染线程中XXX过长,是导致主线程postAndWait流程过长的原因,请业务侧进一步分析确认说明:postAndWait的深度分析策略
Record View#draw()主线程draw方法中的Record View#draw()耗时过长,需要业务先行排查
ViewTree#OnPreDraw主线程识别到ViewTree#OnPreDraw耗时,该耗时和当前页面视图关系较大,业务侧可以先检查当前绘制流程是否正常
dispatchOnGlobalLayout主线程dispatchOnGlobalLayout耗时主要由于布局变化频繁或视图层级过多。可以减少不必要的布局更新,尽量降低视图层次复杂度,注意有无addOnLayoutChangeListener等监听导致干扰
  1. 渲染线程耗时长

案例Trace图示发生阶段/所属策略原因说明/执行建议
prepareTree渲染线程
renderFrame渲染线程renderFrame 耗时过长
drawLayer渲染线程存在Layer更新。需要关注页面中界面更新操作
flush layers渲染线程
flush commands渲染线程flush commands耗时过长,主要目的是将收集的绘制命令转化为GPU可以执行的形式。
Texture upload渲染线程渲染线程/FlushCommandsTactic策略发现Texture upload,图片资源相关操作导致耗时
FillRectOp渲染线程FillRectOp耗时主要源于过度绘制和视图层级复杂度。可以尝试简化视图层次结构,减少不必要的透明度和重叠区域的绘制。
  1. GL线程耗时长

案例Trace图示发生阶段/所属策略原因说明/执行建议
onDrawFrameGL线程onDrawFrame方法耗时,需要业务先进行检查
eglSwapBuffersGL线程eglSwapBuffers方法耗时,业务先进行检查
applyGrallocMetadataLockedGL线程applyGrallocMetadataLocked持锁耗时,业务先进行检查持锁情况,也可能和当前机器性能有关系
  1. 特殊耗时问题

案例Trace图示发生阶段/所属策略原因说明/执行建议
前置阶段存在阻塞情况主线程/前置流程耗时识别主线程前置阶段阻塞耗时,需要关注 doFrame 开始前的流程
距离上一帧的间隔过长主线程/前置流程耗时识别发现距离上一帧的间隔过长
上一帧未发现渲染线程,隔帧绘制主线程/前置流程耗时识别上一帧未发现渲染线程,可能导致本帧绘制间隔过长
上一帧主线程耗时过长主线程/前置流程耗时识别上一帧主线程耗时过长,影响到当前帧
MSG_WINDOW_FOCUS_CHANGED识别/主线程/前置流程耗时识别发现MSG_WINDOW_FOCUS_CHANGED,代表正在进行窗口切换
软同步信号可能不规律主线程/前置流程耗时识别软同步信号可能不规律,导致 Vsync-app 信号同步间隔异常
前置流程存在方法阻塞主线程/前置流程耗时识别前置方法存在阻塞,需要app检查耗时原因
activityPaused识别/主线程/前置流程耗时识别处在页面切换期间,发现activityPaused
copyImageInto方法耗时识别主线程/PostAndWaitDepthTatic
其他中间耗时流程识别/主线程/PostAndWaitDepthTatic流程过长,可能是导致主线程postAndWait流程过长的原因,请业务侧进一步分析确认
上一帧渲染线程耗时主线程/PostAndWaitDepthTatic主线程postAndWait流程过长,请业务侧进一步分析确认上一帧的渲染线程

二、surfaceflinger问题

  1. 普通耗时问题

案例Trace图示发生阶段/所属策略原因说明/执行建议
dequeueBuffer/渲染线程、GL线程
queueBuffer渲染线程、GL线程存在较长的queueBuffer流程。这部分可以联系surfaceflinger模块进一步分析处理
waitOnFences渲染线程waitOnFences耗时,正在等待OpenGL渲染的绘制栏栅fence解放,该问题可以先寻求渲染模块进行协助排查
latchBuffersSF线程
chooseCompositionStrategySF线程chooseCompositionStrategy导致composite阶段耗时过长,需要SF团队协助
postCompositionSF线程
postFramebufferSF线程postFramebuffer耗时源于帧缓存传输延迟和资源竞争,需要SF同学协助排查
finishFrameSF线程finishFrame耗时主要由于等待GPU完成渲染和资源同步,需要SF同学协助排查
getDataspaceSF线程getDataspace是获取缓冲区中数据的色彩空间(Dataspace)的重要操作,这部分需要SF同学协助看一下
  1. 特殊耗时问题

案例Trace图示发生阶段/所属策略原因说明/执行建议
AtlasTextOp渲染线程/FlushCommandsTactic策略AtlasTextOp耗时主要是对字体的一些渲染操作,需要SF模块辅助确认能否优化
送显间隔过长,检查是否存在阻塞送显阶段/送显间隔问题需要检查本帧和上一帧的SF阶段是否存在阻塞送显的情况
SF未正确latch Buffer送显阶段/送显间隔问题送显开始阶段距离上次送显间隔过长,可能存在SF周期出现异常或者插入绘制别的进程的frame,未正确latch BufferTX
上帧渲染线程没有正常合成buffer送显阶段/送显间隔问题、上一帧流程检查策略上帧渲染线程没有正常合成产生bufferTX,导致掉帧
SF绘制间隔异常送显间隔问题SF开始阶段距离上次SF间隔过长,需要检查本帧和上一帧的SF阶段是否存在阻塞的情况

三、Display 送显问题

案例Trace图示发生阶段/所属策略原因说明/执行建议
送显流程耗时送显阶段送显阶段耗时过长,需要Display协助分析
送显完成时间不规律送显阶段/送显间隔问题发现上一帧的送显部分完成过快,导致本次送显正常完成情况下,依然产生掉帧
上帧缺少送显阶段送显阶段/送显间隔问题、上一帧流程检查策略前置帧缺少送显阶段,导致发生掉帧

四、性能问题

案例Trace图示发生阶段/所属策略原因说明/执行建议
CPU D状态异常CPU策略流程下存在D状态的情况,且时间占比较高。需要系统侧帮忙分析确认。
CPU 较多的CPU Runnable情况CPU策略流程下存在较多的 CPU Runnable 情况,需要确认是由于整体CPU繁忙还是CPU频率较低导致。
CPU CPU频率过低CPU策略可以根据实际情况考虑提频处理
Cache miss渲染线程/FlushCommandsTactic策略建议联系对应项目的性能组
Cache hit渲染线程/FlushCommandsTactic策略建议联系对应项目的性能组
eglSwapBuffersWithDamageKHR渲染线程该流程是一个数据交换相关的操作,该流程较慢一般并非由于上层导致。可能与当时的内存情况有关。
monitor contention with owner/任意阶段
GC性能问题任意阶段内存开销过大导致GC线程持续运行,容易引发主线程和renderThread线程D状态。一般这种情况需要结合当前整机内存情况综合分析
主线称阶段GC主线程

五、其他问题

案例Trace图示发生阶段/所属策略原因说明/执行建议
iq报点异常导致滑动频率异常,隔帧绘制主线程/前置流程耗时识别
Trace尾部切割异常无阶段归属在自动化脚本执行过长时,Trace文件超过一定大小会自动进行分割分割的文件可能在尾部的信息发生丢失,此时perfetto解析异常,Atrace也容易误判此处发生严重掉帧针对该情况,目前只有复测,或者看atrace工具是否可以优化该场景,不进行掉帧判定
送显脚本识别错误异常送显阶段此处送显间隔过长是发生掉帧的直接原因,但需要去检查是否是掉帧脚本判定有误,掉帧脚本可能对本帧送显阶段的识别存在异常