【Android】火焰图抓取

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采样率的占比,越宽代表当前栈在采样数中占比高,其可能为三种含义:
    1. 函数运行时间较长
    2. 该函数被调用次数多

平顶现象:

  • 平顶现象是由于当前程序的采样数在总采样数中占用过高导致的,出现这种现象需要特意关注一下程序具体的调用栈,采样比例占用
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高启强不卖鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值