​ 前言: 本次的调优工具系列初衷是面向Flutter 鸿蒙应用开发者的,我选择了专业性最强的HiSmartPerf工具从入门到精通逐步讲解。前几篇会比较基础,后续会逐步结合场景逐一展开,期望大家通过这个系列,能更深一步的理解为什么。由于HiSmartPerf工具是基于开源鸿蒙进行端到端构建的,因此只要是鸿蒙系统,不论是手机,平板,或者鸿蒙PC等,都是可以使用这个工具进行调试调优的!

回归正题,上一篇我们讲解抓取Trace的两种方法,本篇带大家通过3个基本动作看懂Trace。

一、核心模块说明

当你打开一份trace后,界面上是几十条泳道、上百个线程、数不清的色块,看到后别慌,HiSmartPerf 的分析最主要的主要就三个动作:

(1)框选 一段时间看统计

(2)单击 一个色块看详情

(3)搜索 输入名字做定位

打开Trace后从上往下展示依次是:时间轴、CPU 使用率、CPU 使用情况、进程间通讯数据的方法调用情况、进程、线程和方法调用情况。在这里插入图片描述
可以按四层来解读理解:时间轴定范围,CPU 使用率定忙闲,CPU 使用情况看线程在哪个核上跑,进程线程区看细节。

时间轴: 最上方带刻度的是时间轴,展示抓取数据的总时长和刻度分布,左下角标出总时长。

使用技巧:新打开一份trace,第一眼先看左下角:总时长决定框选的粒度,三十秒的录制和三秒的录制,放大的节奏是不一样的

CPU 使用率: 时间轴下面是CPU使用率色带:颜色越深,使用率越高;越浅,越低。

使用技巧:找性能问题的时间段,先在色带上扫出深色区,再放大到那一段,比从第 0 秒开始翻快得多。

CPU 使用情况: CPU 使用情况泳道按 CPU 分组,几个核就是几组。每组前半部分是当前调用这个 CPU 的线程和所属进程,用颜色区分;后半部分是这个 CPU 的使用频率信息。

使用技巧:这层有个高频交互:鼠标移到某个线程上,该线程所属进程的全部线程高亮,其余进程置灰。查一个线程的行为时,同进程的线程一眼可辨,不用逐条扫泳道(见下图)。在这里插入图片描述
进程区域: 最下方是进程、线程和方法数据区,左边展示进程名称和 id,右边显示线程切换关系、线程的调用方法、进程间内存信息。

点击进程名前面的箭头展开线程;存在堆内存占用时,会出现对应的泳道图。展开后有一条识别规则:两个名字和 id 一样的线程并列出现时,第一个是线程的运行情况,第二个是线程内的方法栈调用情况。(见下图)在这里插入图片描述

Flutter鸿蒙应用进程: 在HiSmartPerf上,Flutter应用只是一个普通进程,引擎工作线程、插件加载的 native 线程和系统进程都以泳道图进行展示,一目了然。(见下图)在这里插入图片描述

实操举例: 这里我们找到 1.raster 线程,然后选中一个正在running的子线程:对应的线程信息,持续时间,当前跑在哪个CPU上的,被哪个线程唤醒的等等信息一目了然~在这里插入图片描述

二、三个关键动作:框选、单选、搜索

框选:按下鼠标,拖拽,松开。

框选后数据被筛选出来,高亮显示的部分就是所选区域,时间轴和各条泳道上都生效。框选落在 CPU 使用情况泳道上,最下方的弹出层给出统计表格,表格间可以互相切换。在这里插入图片描述
​单选:单击一个色块。

CPU 使用情况的色块被选中后,外层加一圈深色边框,弹出层展示当前 CPU 上的进程名、线程名、开始时间的相对时间和绝对时间、运行时长、优先级、线程结束状态。(见下图)在这里插入图片描述

单选线程的 state 数据,展示状态数据、开始时间(相对和绝对)和持续时长、线程状态、所在进程名称,还有选中状态的前一个状态和后一个状态。单选调用栈里的方法,方法外层加黑色边框,弹出层展示方法名、开始时间(相对和绝对)、运行时长、调用栈深度。(见下图)在这里插入图片描述
​
搜索:在搜索框输入线程名、线程号,命中的结果高亮显示;输入调用栈的方法名,直接跳到对应的调用栈。一份 trace 几十个进程,逐条展开找线程太慢,搜索是唯一现实的定位方式。 在这里插入图片描述
​

三个动作通常连着用:搜索把线程找出来,框选圈住可疑区间,单选确认某个色块的细节。

三、框选统计的数据表

在 CPU 使用情况泳道框选一段,弹出层的统计核心六个 Tab 页,维度和字段如下:

Tab 页统计维度字段
CPU by thread线程进程名、进程号、线程名、线程号、总运行时长、平均运行时长、调度次数
CPU by process进程进程名、进程号、总运行时长、平均运行时长、调度次数
CPU UsageCPU 频率框选区间内各 CPU 频率时间占比前三
Thread Switches状态 > 进程 > 线程次数、持续时长、最小时长、平均时长、最大时长
Thread States进程 > 线程 > 状态线程名、进入该状态次数、该状态下时长、最小时长、平均时长、最大时长
Sched Priority优先级框选范围内所有 Running 及其之前的 Runnable 线程的数量、持续时长、最小、最大、平均耗时

​(1)CPU by thread 按线程列 CPU 消耗,框选掉帧区间后按总运行时长或调度次数排序,应用线程和系统线程谁占了 CPU,直接排出名次

(2)CPU by process 把同一口径收到进程级,用来区分「应用忙」和「整机忙」

(3)CPU Usage 看频率停留区间,大核长时间停在低频

(4)Thread Switches 和 Thread States 是一对:前者按状态、进程、线程的顺序统计,后者按进程、线程、状态的顺序统计,字段都落在次数和最小时长、平均时长、最大时长上。线程的 Runnable 时间长,是在排队等 CPU;Sleeping 时间长,是在等事件。

(5)Sched Priority 按优先级大小显示调度,统计框选范围内所有 Running 及其前序 Runnable 线程。低优先级线程长期 Runnable 上不了 CPU,优先级问题从这张表查。

四、快捷键表

快捷键作用
w / s界面的放大 / 缩小
a / d界面的左移 / 右移
m对指定区域进行临时标记
Shift+m对指定区域进行永久标记
ctrl+[ / ctrl+]对 Shift+m 的标尺进行左 / 右跳转
ctrl+, / ctrl+.对旗子标志进行左 / 右跳转
Ctrl+滚轮界面的放大 / 缩小
Ctrl+按住拖动界面的左 / 右拖动

以上就是本次的所有内容了,HiSmartPerf比较庞大,后续会逐步根据具体业务场景进行功能展开,期待小伙伴的关注~

点赞+关注

关注 CPF-Flutter 社区

“AI再牛,技术不能丢

​

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐