当前位置: 首页 > news >正文

【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 篇

相关文章:

  • eNSP学习——配置高级的访问控制列表
  • 计算机网络时延计算的单位换算问题
  • SpringCloud专题
  • canvas的使用方法
  • 【Linux取经路】守护进程
  • vue router中的导航守卫,它的5个使用场景举例
  • 航天科技集团与SPACEX公司的思考与分析
  • vue2+echarts实现简易的2d地图效果
  • 算力巅峰对决,一文读懂CPU、GPU、GPGPU、FPGA、DPU、TPU
  • apache poi 插入“下一页分节符”并设置下一节纸张横向的一种方法
  • Python版本管理器-Miniconda
  • 【Linux】线程(一)
  • 在大数据时代:为何硬盘仍是数据中心存储的核心
  • 基于springboot的人力资源管理系统源码数据库
  • WEB基础--TOMCAT服务器
  • 2017前端实习生面试总结
  • Android优雅地处理按钮重复点击
  • C++类的相互关联
  • DataBase in Android
  • echarts花样作死的坑
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JAVA之继承和多态
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Mysql优化
  • quasar-framework cnodejs社区
  • spring学习第二天
  • 设计模式走一遍---观察者模式
  • 时间复杂度与空间复杂度分析
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 用jquery写贪吃蛇
  • Prometheus VS InfluxDB
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #php的pecl工具#
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (13)Hive调优——动态分区导致的小文件问题
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (4.10~4.16)
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (第一天)包装对象、作用域、创建对象
  • (动态规划)5. 最长回文子串 java解决
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ./和../以及/和~之间的区别
  • .Net Core 中间件与过滤器
  • .net refrector
  • .Net Remoting常用部署结构
  • .net 调用海康SDK以及常见的坑解释
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET 药厂业务系统 CPU爆高分析
  • .Net多线程总结
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】