前言: 鸿蒙调优工具系列,初衷是面向 Flutter 鸿蒙应用开发者,我选择了专业性最强的 HiSmartPerf 工具,从入门到精通逐步讲解。本篇重点讲解 CPU 数据的解读,这也是非常重要的一篇!后续会逐步结合具体场景逐一展开,期望大家通过这个系列,更深入地理解其中的原理与机制。由于 HiSmartPerf 工具是基于开源鸿蒙进行端到端构建的,因此只要是鸿蒙系统,无论是手机、平板,还是鸿蒙 PC 等,都可以使用这个工具进行调试调优!
在 DevTools 上,Flutter 鸿蒙应用可以看到每帧在 UI 线程和 Raster 线程上的开销。如果需要进一步分析线程落在哪个核、跑了多久、为什么没跑,那么这些信息就在系统 trace 的 CPU 泳道里了。这一篇是针对 CPU 数据的解读:告诉你哪个线程在什么时候占了多久 CPU、又被谁耽误了、频点有没有问题……

一、CPU 泳道怎么读

trace 页从上到下依次是时间轴、CPU 使用率、CPU 使用情况、进程间通讯、进程线程与方法调用。
CPU 使用率泳道颜色: 颜色越深代表使用率越高。(使用技巧:先在这里框选出可疑的时段,再往下看 CPU 使用情况区)​​在这里插入图片描述
色块的概念: 色块代表当前调用该 CPU 的线程及其所属进程,按进程着色;色块即一段运行时间,没有色块的部分表示线程在这段时间内没有运行。(下图泳道图上的空白部分)在这里插入图片描述
展开后,进行收藏就可以把泳道图置顶,从而进一步分析:在这里插入图片描述
图:置顶展示 CPU 0,CPU1对应的CPU泳道图

鼠标移到某个色块上,同进程的色块全部高亮,其他进程置灰(见下图):在这里插入图片描述
图:鼠标悬停色块,同进程高亮、其他进程置灰

Flutter 鸿蒙应用CPU调测实操:

我们找到自己的Flutter应用,单选一个色块后,外层会加深色边框,在弹出来的详情中会详细展示对应的进程名、线程名、开始时间(相对与绝对)、运行时长、优先级、线程结束状态等信息在这里插入图片描述
在Tread上点击带箭头的标志,就会在 CPU 的线程概览视图和线程详情视图之间进行跳转,跳过去后就可以查看线程的完整状态了(见下图):在这里插入图片描述

二、框选统计Tab页解读

框选 cpu 使用情况区,底部就会弹出8个Tab页:CPU by thread、CPU by process、CPU Usage、CPU Freq Usage、Thread Switches、Thread States、Sched Priority和 Sched Task。在这里插入图片描述

分状态读,先切换到Thread States页:它按进程>线程>状态统计进入该状态的次数与时长(最小、平均、最大)。

如果Running 占比高,线程在干活,占核合理,接下来看它跑了什么;如果发现Runnable 堆积,线程想跑没上核,怀疑核被别的进程占走或优先级不够;如果Sleeping 占大头,那么线程在等外部条件,就要具体分析了:在这里插入图片描述
图:框选后 Thread States Tab,按进程>线程>状态统计次数与时长

Thread Switches页:按状态>进程>线程统计切换次数与时长,Sched Priority 按优先级大小统计框选范围内所有 Running 及其之前的 Runnable 线程的数量与耗时:在这里插入图片描述
Thread States 和 Thread Switches 的行可以点,进入到二级页面后,展示开始时间、进程、线程、线程状态、所在 CPU、优先级等:​在这里插入图片描述
CPU by thread 与 CPU by process 按线程、按进程给总运行时长、平均运行时长、调度次数,用来分析占核大户:在这里插入图片描述
CPU Usage 给各 CPU 频率时间占比前三,结合着其他Tab页进行综合分析:在这里插入图片描述

三、线程唤醒关系树

如何触发:当点击 Sleeping状态的的线程色块,线程唤醒关系树功能就会被触发。

如何操作:这个功能可以清晰的查看线程间的唤醒关系。当功能触发后,可以点击 GetWakeupList,会以链式结构和表格分别在泳道图和 tab 上展示线程的唤醒关系树,按钮旁边的星号会把唤醒树对应的泳道图一键收藏(如下图)。

核心作用:线程唤醒关系树的作用,主要是帮你‌梳理和定位线程之间是谁唤醒谁的调用链,快速看懂并发程序的执行脉络‌。它本质上是一种可视化的“唤醒图谱”,把每次 sched_waking/sched_wakeup 事件串起来,展示出唤醒源与唤醒目标之间的对应关系。

这个功能对于排查‌性能瓶颈、死锁、任务延迟和异常唤醒‌特别有用。在这里插入图片描述
图:GetWakeupList 展开的线程唤醒关系树,链式结构与表格并列展示

四、频点与算力

在CPU这块,频点和算力也是必须要关注的:比如核占了,频点没上去,算力照样不够,同样会导致性能问题。

当我们框选 Cpu Frequency 泳道后,Tab 页里的 GetBusyTime 按钮取每个频点的忙碌时间。通过这个时间可以分析下,是否存在频点比较高、忙碌时间却很短的情况,如果有,也就意味着提频没带来正向的性能提升,就需要进一步分析了。在这里插入图片描述
图:框选 Cpu Frequency 泳道后的 GetBusyTime 按钮,取各频点的忙碌时间

以上就是本次的所有内容了,本次主要针对CPU该如何解读进行了进一步的说明。由于HiSmartPerf比较庞大,后续会逐步根据具体业务场景进行功能展开,期待小伙伴的关注~

点赞+关注

关注 CPF-Flutter 社区

“AI再牛,技术不能丢

​

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐