文章目录
- 1 概述
- 2 抓取火焰图
- 3 SDK火焰图
- 4 分析火焰图
1 概述
Simpleperf 是 Android 的原生 CPU 分析工具。 它可用于分析 Android 应用程序和在 Android 上运行的本机进程。 它可以在 Android 上分析 Java 和 C++ 代码。 simpleperf 可执行文件可以在 Android >=L 上运行,而 Python 脚本可以在 Android >= N 上使用。
火焰图是基于 perf 结果产生的 SVG 图片,用来展示进程在一段时间 CPU 的调用栈。
现代的CPU具有一个硬件组件,称为性能监控单元(PMU)。PMU具有一些硬件计数器,计数一些诸如 经历了多少次CPU周期,执行了多少条指令,或发生了多少次缓存未命中 等的事件。
Linux内核将这些硬件计数器包装到硬件perf事件 (hardware perf events)中。此外,Linux内核还提供了独立于硬件的软件事件和跟踪点事件。Linux内核通过 perf_event_open 系统调用将这些都暴露给了用户空间,这正是simpleperf所使用的机制。
Simpleperf具有三个主要的功能:stat,record 和 report。
Stat命令给出了在一个时间段内被分析的进程中发生了多少事件的摘要。以下是它的工作原理:
给定用户选项,simpleperf通过对linux内核进行系统调用来启用分析。
Linux 内核在调度到被分析进程时启用计数器。
分析之后,simpleperf从内核读取计数器,并报告计数器摘要。
Record 命令在一段时间内记录剖析进程的样本。它的工作原理如下:
给定用户选项,simpleperf通过对linux内核进行系统调用来启用分析。
Simpleperf 在simpleperf 和 linux 内核之间创建映射缓冲区。
Linux 内核在调度到被分析进程时启用计数器。
每次给定数量的事件发生时,linux 内核将样本转储到映射缓冲区。
Simpleperf 从映射缓冲区读取样本并生成 perf.data。
Report 命令读取 “perf.data” 文件及所有被剖析进程用到的共享库,并输出一份报告,展示时间消耗在了哪里。
2 抓取火焰图
simpleperf是集成在谷歌内部.直接使用即可
抓取30s的perf.data 路径随便你. 我一般放在data/vendor/camera_dump
adb shell simpleperf record -p 13248 -g --duration 30 -o /sdcard/perf.data
adb shell simpleperf record -p 1791 -g --duration 30 -o /data/vendor/camera_dump/simpleperf_mcu.data
或者
adb shell 进入到手机:
simpleperf record -g -p `pidof cameraserver` --duration 60 -o /sdcard/perf.data
simpleperf record -g -p `pidof camerahalserver` --duration 60 -o /sdcard/perf.data
//示例中的 " -p 13248 " 指的是需要分析的进程号
//示例中的 " -p 1791 " 指的是需要分析的进程号
3 SDK火焰图
谷歌官网下载Android NDK: https://developer.android.google.cn/ndk/downloads/
进入到android-ndk-r25b-linux/android-ndk-r25b/simpleperf
将上述生产的perf.data文件拉取出来放到这个同级目录下
adb pull /sdcard/perf.data
直接运行
python report_html.py
会生成对应的火焰图.这个火焰图有三种呈现方式.呈现的偏重点不一样.
以下都是进入到adb shell中执行操作:
MCPS每秒百万个时钟
(Million Clocks Per Second)
simpleperf record -g -e cpu-cycles -p `pidof camerahalserver` --duration 60 -o /sdcard/perf.data --call-graph dward
MIPS每秒数百万条指令
(Million Instructions Per Second)
simpleperf record -g -e instructions -p `pidof camerahalserver` --duration 60 -o /sdcard/perf.data --call-graph dward
MCPS_MIPS:
simpleperf record -g -e cpu-cycles,instructions -p `pidof camerahalserver` --duration 60 -o /sdcard/perf.data --call-graph dward
#可以将相关线程合入到一个报告表中
simpleperf record -g -e cpu-cycles,instructions -p `pidof camerahalserver`,`pidof cameraserver`,`pidof com.sec.android.app.camera` --duration 60 -o /sdcard/perf.data --call-graph dward
simpleperf record -g --exclude-pid 813 880 11872 --duration 60 -o /sdcard/perf.data --call-graph dwarf
-e cpu-cycles
python report_html.py
4 分析火焰图
火焰图x-y轴代表
- x轴代表的不是时间,而是采样总量
- y轴代表方法的调用栈深度,倘若方法调用用的越多,火焰越高,顶部的栈就是当前正在执行的方法
栈宽含义(cpu时间)
- 宽度可以理解为CPU采样率的占比,越宽代表当前栈在采样数中占比高,其可能为三种含义:
- 函数运行时间较长
- 该函数被调用次数多
平顶现象:
- 平顶现象是由于当前程序的采样数在总采样数中占用过高导致的,出现这种现象需要特意关注一下程序具体的调用栈,采样比例占用