【perfetto分析性能学习笔记】
1.perfetto网站
https://ui.perfetto.dev/
2.快捷键
3.线程状态分析
Runnable表示线程正在运行或者等待CPU执行
Runnable (Preempted)表示线程正在运行,但在运行过程中被其他高优先级线程抢占
Running表示线程正在运行
Uninterruptible Sleep Uninterruptible Sleep (IO)不可中断的休眠状态,IO阻塞
Uninterruptible Sleep (non-IO)不可中断的休眠状态,非IO导致,在等内核锁。通常是低内存导致等待、各种各样的内核锁。
Sleeping表示线程正在休眠或者等待某个条件满足
Running 时间长
- 原因 1: 代码本身复杂度高,执行耗时久
这是最常见的一种方式,当然不排除平台有bug,有时候厂商在libc、syscal等高频核心函数,加了一些逻辑导致了代码运行时间长。
优化建议: 优化逻辑、算法,降低复杂度。为了进一步判断具体是哪个函数耗时,可使用 AS CPU Profiler、simpleperf,或者自己通过 Trace.begin/end() API 添加更多 tracepoint 点
当然不排除有的时候平台有bug,在关键的libc或内核函数加了一些逻辑
- 原因 2:代码以解释方式执行
Trace 中看到 「Compiling」字眼时可能意味着它是解释执行方式进行。刚安装的应用(未做 odex)的程序经常会出现这种情况
优化建议: 使用 dex2oat 之后的版本试试,解释执行方式下的低性能暂无改善方法,除非执行 dex2oat 或者提高代码效率本身
除此之外,使用了编程语言的某种特性,如频繁的调用 JNI,反复性反射调用。除了通过积攒经验方式之外,通过工具解决的方法就是通过 CPU Profiler、simpleperf 等工具进行诊断
- 原因 3:线程跑小核,导致执行时间长
对 CPU Bound 的操作来说跑在小核可能没法满足性能需求,因为小核的定位是处理非UX 强相关的线程。不过 Android 没办法保证这一点,有时候任务就是会安排在小核上执行。
优化建议:线程绑核、SchedBoost 等操作,让线程跑尽量跑更高算力的核上,比如大核。有时候即使迁核了也不见效,这时候要看看频率是否拉得足够高,见“原因 4”
- 原因 4:线程所跑的大核运行频率太低
优化建议:
优化代码逻辑,主动降低运行负载,CPU 频率低也能流畅运行
修改调度器升频相关的参数,让 CPU 根据负载提频更激进
用平台提供的接口锁定 CPU 频率(俗称的「锁频」)
- 原因 5:温升导致 CPU 关核、限频
优化建议:
手机因结构原因导致散热能力差或温升参数过于激进时,为了保护体验跟不烫伤人,几乎所有手机厂家的系统会限制 CPU 频率或者直接关核。排查思路是首先需要找到触发温升的原因。
温升的排查的第一步,首先要看是外因导致还是内因导致。外因是指是否由外部高温导致,如太阳底下,火炉边;往往夏天的时候导致手机发热的情况越严重
内因主要由 CPU、Modem、相机模组或者其他发热比较厉害的器件导致的。以 CPU 为例,如果后台某个线程吃满 CPU,那就首先要解决它。如果是前台应用负载高导致大电流消耗,同样道理,那就降低前台本身的负载。其他器件也是同样道理,首先要看是否是无意义的运行,其次是优化业务逻辑本身
除此之外,温升参数过于激进的话导致触发限频关核的概率也会提高,因此通过与竞品对比等方式调优温升参数本身来达到优化目的
- 原因 6:CPU 算力弱
优化建议:
ARM 处理器在相同频率下不同微架构的配置导致的性能差异是非常明显的,不同运行频率、L1/L2 Cache 的容量均能影响 CPU 的 MIPS(Million Instructions Per Second) 执行结果。
优化思路有两条:
编译器参数
优化代码逻辑
第一条比较难,大部分应用开发者来说也不太现实,系统厂商如华为,方舟编译器优化 JNI 的思路本质是不改应用代码情况下提高代码执行效率来达到性能上的提升
第二条可以通过 simpleperf 等工具,找到热点代码或者观察 CPU 行为后做进一步的改善,如:
Cache miss 率过高导致执行耗时,就要优化内存访问相关逻辑
代码复杂指令过多导致耗时,就要优化代码逻辑,降低代码复杂度
设计好业务缓存,尽量提高缓存命中率,避免抖动(反复地申请与释放)
3.1查看Scheduling wakeups
选中CPU的Running状态
然后切到CPU Slice,就可以看到wakeup关系
4.CPU分析
4.1 CPU Usage
圈出需要分析的CPU区域
cpu 使用率 = (Wall duration)/ (cpu 总核数) / (Selected range)
参考文章:
1.第35讲 Perfetto 分析CPU 调度 - Android Camera性能分析
2.Systrace 线程 CPU 运行状态分析技巧 - Running 篇