性能剖析产品功能调研
一、调研背景
近期接触了一下性能分析平台,主要是基于安卓和Linux,看了下这三个平台
二、竞品详情
2.1 Simpleperf
产品介绍
现代的CPU具有一个硬件组件,称为性能监控单元(PMU)。PMU具有一些硬件计数器,计数一些诸如经历了多少次CPU周期,执行了多少条指令,或发生了多少次缓存未命中等的事件。Linux内核将这些硬件计数器包装到硬件perf事件(hardware perf events)中。此外,Linux内核还提供了独立于硬件的软件事件和跟踪点事件。Linux内核通过perf_event_open系统调用将这些都暴露给了用户空间。
Simpleperf 是如何工作的
功能清单
一级功能模块 二级功能点 特色功能标注
- 数据采集 (Record) 周期性采样 (Sampling) 基于 CPU 周期或时间频率获取堆栈
硬件计数器监测 (Hardware Events) 【特色】 监测 Cache Miss、Branch Prediction 等底层硬件行为
特定进程/线程追踪 支持按 PID、TID 或应用包名进行过滤采样
系统全量记录 (System-wide) 监控整机 CPU 运行状况,捕获系统级抖动 - 堆栈回溯 (Unwinding) Dwarf 堆栈回溯 利用调试信息还原复杂的 C++/Rust 调用链
FP (Frame Pointer) 回溯 极低开销的快速堆栈获取方式
JIT/Interpreter 支持 【特色】 能够混合还原 Java 代码与 Native C++ 代码的调用栈 - 数据分析 (Report) 交互式 HTML 报告 生成可缩放、可搜索的单文件离线分析页面
函数热点统计 (Annotate) 【特色】 将采样数据直接对应到源代码的特定行号上
指令级分析 (Disassemble) 查看汇编指令层级的 CPU 消耗分布 - 格式转换 (Dump/Conv) pprof 格式转换 【特色】 完美对接 Pyroscope 等通用调优平台
Perfetto / Firefox 格式导出 支持将数据注入到主流的可视化 Trace 工具中 - 自动化脚本 (Scripts) App 启动分析脚本 专门针对安卓应用启动阶段的自动化采样脚本
二进制符号化 (Symbolize) 【特色】 支持利用远程符号表服务器或本地库还原混淆代码
特色功能
二进制符号化 (Symbolize)
•原理:利用符号表(Symbols)将地址还原。
•价值:支持远程符号服务器。这意味着你可以在本地分析用户的 Release 版(混淆过)崩溃/性能堆栈,而不需要手动下载几百兆的符号文件。
原理:直接读取 ARM 处理器的 PMU(性能监控单元)。
功能:记录 Cache Miss(缓存未命中,导致 CPU 等待数据)、Branch Prediction(分支预测失败,导致流水线排空)。
价值:当代码逻辑看起来没问题但运行慢时,通常是硬件效率问题。这是高级调优的“杀手锏”。
Simpleperf官方说明文档中提供的内容
JIT/Interpreter 支持
•原理:Android 的 Java 代码在运行时(ART 虚拟机)会不断变换形式。
•功能:混合回溯。它能把 Java 方法、JIT 生成的代码和底层的 C++ Native 代码缝合在一起。
•价值:避免了开发者只能看到底层的 libart.so,而看不到业务逻辑函数名。
Simpleperf生成的报告中的火焰图对具体的libart.so的穿透分析
函数热点统计 (Annotate)
•原理:结合源代码。
•深度:它不只告诉你 calculate() 慢,还能标注出是代码的第 15 行(一个大循环)最慢。
•价值:这是离线调优阶段最直接的“处方笺”。
官方文档中对函数热点统计的描述
pprof 格式转换
•价值:这是对接可视化UI的关键。将 Android 原生的 perf.data 转换为通用的 pprof。
•场景:实现你之前看到的“红蓝对比图”,让移动端数据能使用 Web 端的各种高级可视化工具。
官方文档中对支持pprof的可视化UI界面功能的说明
二进制符号化 (Symbolize)
•原理:利用符号表(Symbols)将地址还原。
•价值:支持远程符号服务器。这意味着你可以在本地分析用户的 Release 版(混淆过)崩溃/性能堆栈,而不需要手动下载几百兆的符号文件。
2.2 Perfetto
Perfetto也是使用注入( hook)的方式,将内存分配和释放的几个函数修改为自己的代码指令后,当内存分配和释放时进行统计。与 LoliPerfiler不同的是,它有得天独厚的优势,就是它本身就是安卓系统自带的程序,不需要用 JDWP方式启动某个程序,直接启动执行程序就可以了。
Perfetto 包含了三大块:
1.Record traces :即数据抓取模块,可以看到抓取的内容和来源非常丰富,Java、 Native 、Linux 都有涉及到,相比 Systrace 要丰富很多。
2.Analyze traces :主要是 trace 分析模块,包括 Trace 解析、SQL 查询、Metrics 分析等,这部分有专门的命令行工具提供,方便大家直接调用或者在工具链里面去调用。
3.Visualize Traces:Trace 的呈现、抓取等
功能清单
一级功能模块 二级功能点 特色功能标注
- 数据采集 (Data Sources) 内核追踪 (Ftrace) 【特色】捕获线程调度 (Scheduling)、系统调用与 CPU 频率波动
用户态追踪 (ATrace) 采集 Android UI 绘制、Activity 生命周期等框架层埋点信息
内存剖析 (Profiling) 【特色】支持 Native 堆 (Heapprofd) 与 Java 堆内存分配追踪
硬件状态监控 实时监测 GPU 负载、电池电量、温度及各电轨功耗状况 - 数据处理 (Analysis) SQL 查询引擎 【特色】将 Trace 转化为 SQLite 数据库,支持用 SQL 批量计算性能指标
跨进程关联 (IPC) 自动连接 Binder 调用链,追踪请求在不同进程间的流动轨迹
自动化指标 (Metrics) 内置预设 SQL 脚本,直接输出冷启动、掉帧率等标准报表 - 可视化界面 (UI) 多泳道时间轴视图 提供数百万数据点下的丝滑缩放交互,按进程/线程展示生命周期
流向线 (Flow Events) 【特色】用箭头直观展示异步任务触发关系与线程间的唤醒逻辑
聚合统计分析 支持手动框选时间段,实时计算该区间内的 CPU 消耗排行榜 - 集成与兼容 (Interoperability) Simpleperf 数据叠加 【特色】支持在 Perfetto 时间轴上直接导入并展示 Simpleperf 的函数堆栈
多格式导入导出 兼容旧版 Systrace (JSON)、Chrome Tracing 以及 Firefox 格式数据
HTTP RPC 接口 支持外部自动化工具通过接口直接读取并处理实时采集的数据流 - 自动化工具 (Tools) 云端采集控制台 提供 Web UI 勾选配置,自动生成针对真机的复杂采集 Shell 脚本
Python API 集成 支持使用 Python 脚本解析海量 Trace 文件,实现性能回归自动化分析
特色功能
内核追踪 (Ftrace)
原理:利用 Linux 内核的 Ftrace 机制,记录 CPU 核心上的低级事件。
功能点:监控线程在 Running、Runnable、Sleeping 状态间的切换,捕获系统调用 (Syscalls) 和硬件中断。
价值:回答“主线程被谁挂起了”以及“CPU 核心在物理层面上忙于处理哪些任务”。
内存剖析 (Profiling)
原理:通过 heapprofd (Native) 和 java_hprof (Java) 插件进行内存采样。
功能点:追踪 malloc/free 分配堆栈,定期抓取 Java 堆快照。
价值:精准定位内存泄漏,分析内存分配尖峰导致的 GC 抖动。
SQL 查询引擎
原理:Trace Processor 将二进制文件解析并导入内存中的 SQLite 数据库。
功能点:支持通过标准 SQL 语句自定义过滤和计算性能数据。
价值:实现自动化诊断。例如:用 SQL 直接筛选出所有耗时超过 100ms 的 Binder 调用。
流向线 (Flow Events)
原理:在时间轴上用连线表示事件的因果或唤醒关系。
功能点:追踪异步任务从 Post 到 Execute 的全过程。
价值:可视化“谁唤醒了谁”,理清主线程卡顿背后的后台线程依赖。
Simpleperf 数据叠加
描述:支持将 Simpleperf 生成的 pprof/proto 文件导入 Perfetto。
价值:实现“上帝视角”与“显微镜”的结合。在 Perfetto 时间轴上看到卡顿时,点击即可看 Simpleperf 抓到的函数堆栈。
2.3 Pyroscope
Pyroscope 由两个主要组件支撑运行:Pyroscope Server 和 Pyroscope Agent。
Pyroscope Agent:记录并汇总您的应用程序一直在执行的操作,然后将该数据发送到 Pyroscope Server。支持多种语言,GO、Python、Ruby、eBPF、JAVA、Rust、PHP、NodeJS、.NET
Pyroscope Server: 处理、聚合和存储来自代理的数据,以便在任何时间范围内快速查询。片刻后可以查看分析数据,并在任何时间范围内进行查询。
Pyroscope作为持续分析工具,整体对性能消耗较小,但没有针对安卓的Agent,可使用Linux Agent在安卓系统底层进行监控,但Pyroscope定位为生产环境服务器监控,对性能与电源消耗仍然存在,且安卓设备必须Root。
特色功能
一级功能模块 二级功能点 特色功能标注
- 数据接入 (Ingestion) 多语言 SDK 集成 支持 Java, Go, Python, C++, Rust 等主流语言
eBPF 零侵扰采集 【特色】无需修改代码,通过内核直接监控应用性能
第三方格式转换导入 支持 pprof、perf.data (Simpleperf) 等标准格式 - 数据存储 (Storage) 长期趋势存储 采用高效压缩算法,支持数月甚至数年的历史数据回溯
多维标签检索 (Tags) 支持按版本号、机型、地域等维度对样本进行过滤
样本自动聚合 将数以万计的瞬时采样自动合并为宏观的火焰图 - 数据分析 (Analysis) 红蓝 Diff 火焰图 【核心】自动对比两个版本或时段,直观显示性能退化点
指标与堆栈联动 点击 CPU 指标异常波峰,立即显示对应的代码调用栈
Self/Total 耗时统计 精确区分函数自身开销与包含子函数的总开销 - 深度诊断 (Diagnostic) 源码级映射 (Annotate) 【特色】在 Web 界面直接将性能损耗标注在源代码行上
异常性能告警 监测关键函数,当耗时超过设定的阈值时自动通知
全链路 Trace 关联 与分布式追踪工具联动,从单次请求定位到具体代码行
特色功能
eBPF 零侵扰采集
功能点:利用 eBPF 技术从内核态直接抓取所有进程的 CPU 热点。
价值:无需修改应用代码,且对系统性能影响极小(通常小于 1%)。
红蓝 Diff 火焰图
功能点:自动对比两个时间段或两个版本的 pprof 数据,红色表示耗时增加,蓝色表示优化。
价值:这是 运营层面最关注的功能,一眼看出新版本上线后哪一行代码变慢了。
源码级映射 (Annotate)
功能点:在 Web 界面直接将采样数据与源代码行关联显示。
价值:让开发者在浏览器中就能看到“第 15 行”代码的 CPU 占用比例。
三、调研结论
3.1 差异对比
维度 Simpleperf Perfetto Pyroscope Bonree
核心数据源 CPU 硬件计数器 内核 Ftrace、系统 Atrace、SQL 数据引擎 SDK 采样、eBPF、聚合引擎 SDK 采样
核心性能指标 1. IPC
- CPU Cycles & Instructions
- Cache Misses (L1/L2/L3)
- Branch Mispredictions 1. Scheduling Latency
- Wall Clock vs CPU Time
- Binder RPC Latency
- Thread State (Runnable/Sleeping) 1. Self CPU Time
- Total CPU Time
- Memory Allocation Rate
- Baseline Diff (版本差异值) 1.CPU Time
2.Allocated Memory
3.Wall Time
4.I/O | Socket I/O Read Time
解决的痛点 为什么这段代码跑得这么慢?
——算法低效、不利用缓存、计算指令过多) 为什么我的 App 会掉帧/卡死?
——(线程被抢占、等锁、跨进程通信慢) 这个版本比上个版本性能退化了吗?
——(线上长效监控、识别高价值优化函数) 覆盖基础功能的定时服务性能切片数据
关键可视化视图 函数火焰图 (Flame Graph)
多轨道时间轴 (Timeline)
对比火焰图 (Diff Graph)
函数火焰图 (Flame Graph)
内存指标侧重 侧重硬件层:内存访问延迟、缓存未命中率。 侧重系统层:RSS (物理内存)、虚拟内存、内存页交换。 侧重应用层:堆内存分配频率、临时对象创建速度。 侧重应用层:服务对硬件资源的占用
演示数据
report.html https://ui.perfetto.dev/
https://demo.pyroscope.io/ https://one.bonree.com/login?returnTo=%2Fobservation%2Fworkbench调研一:数据采集 (Data Sources)
产品名称 Simpleperf Perfetto Pyroscope
产品介绍
Simpleperf 是 Android 的原生 CPU 分析工具。它可用于分析 Android 应用程序以及 Android 上运行的本地进程。它可以分析 Android 上的 Java 和 C++ 代码。simpleperf 可执行文件可在 Android L 及更高版本上运行,Python 脚本可在 Android N 及更高版本上使用。Simpleperf 是 Android 开源项目的一部分。
Simpleperf 包含两部分:simpleperf 可执行文件和 Python 脚本。
simpleperf 可执行文件的工作方式与 linux-tools-perf 类似,但针对 Android 分析环境有一些特定的功能:
1.它在分析数据中收集更多信息。由于常见的工作流程是“在设备上记录,并在主机上报告”,simpleperf 不仅在分析数据中收集样本,还收集所需的符号、设备信息和录制时间。
2.通过极致的存储优化与全链路追踪技术,Simpleperf 实现了在几乎不占空间的前提下,能够跨越 Java 和系统底层,精准还原应用从‘忙碌执行’到‘卡顿等待’的全过程真相。
3.Simpleperf 是深度嵌入 Android 系统的‘原生分析仪’,它能无视系统加固和权限限制,利用与官方工具一致的标准,实现对 App 及其内部代码的最权威、无偏差诊断。
4.Simpleperf 是一套‘开箱即用’的分析体系:它无需安装即可运行在任何安卓设备上,并能在电脑端实现高效、自动化的数据解码与报表生成。
simpleperf 可执行文件的详细文档位于 此处 。
根据其功能,Python 脚本分为三个部分:
1.用于录制的脚本,支持 app_profiler.py 和断开 USB 录制。
2.用于报告的脚本,提供 report_html.py 和 inferno(火焰图)。
3.用于解析分析数据的脚本,提供simpleperf_report_lib.py 用于二次开发。
Perfetto 是一个开源的 SDK、守护程序和工具套件,它们使用 追踪以帮助开发者理解复杂系统的行为以及客户端/嵌入式系统中的功能性和性能问题根源。它包含:
•高性能追踪守护进程 ,用于将单台机器上多个进程的追踪信息捕获到一个统一的追踪文件中,以便离线分析和可视化。
•低开销追踪 SDK,用于直接追踪您的 C/C++代码的计时和状态变化。
•在 Android 和 Linux 上进行广泛的操作系统级探针 ,以在跟踪过程中捕获更广泛的系统级上下文(例如调度状态、CPU 频率、内存分析、调用栈采样)。
•完全本地、基于浏览器的 UI,用于在时间轴上可视化大量复杂且相互关联的数据。我们的 UI 适用于所有主要浏览器,无需任何安装,支持离线使用,并且可以打开由其他(非 Perfetto)跟踪工具录制的跟踪。
•强大的、基于 SQL 的分析库 ,用于程序化分析时间轴上的大量复杂且相互关联的数据,即使这些数据不是使用 Perfetto 录制工具收集的。
Grafana Pyroscope 是一个多租户的持续剖析聚合系统,其架构设计与 Grafana Mimir、Grafana Loki 和 Grafana Tempo 相符。这种集成能够将剖析数据与现有的指标、日志和追踪进行有机结合。探索连续分析数据,深入了解应用性能。你可以以结构化的方式查询和分析生产数据。使用 Pyroscope 界面或 Grafana 来可视化数据。
使用 Pyroscope,您可以访问核心分析功能,利用这些功能可以找到性能瓶颈并优化应用程序。核心功能包括:
•极低的 CPU 开销和高效的压缩确保最佳性能。
•与 Loki、Mimir 和 Tempo 一致的架构,促进更流畅的用户体验。
○水平可扩展:您可以在多台机器上运行 Grafana Pyroscope。您可以轻松扩展数据库以处理工作负载生成的分析量。
○可靠:高可用性设置确保持续运行,即使在升级或系统故障期间也是如此。
○多租户支持:使得为多个独立团队或业务单元运行一个数据库成为可能。
○规模经济:利用对象存储,允许在不产生重大成本的情况下存储大量历史数据。它与多种对象存储实现兼容,包括 AWS S3、Google Cloud Storage、Azure Blob Storage、OpenStack Swift,以及任何 S3 兼容的对象存储。
•高级分析界面:提供高级界面、高基数性标签/标签处理功能,以及区分标签/标签和时间段性能的能力。
功能说明 Android 的原生 CPU 分析工具,通过脚本在本地生成性能文件——NDK 开源的 SDK、守护程序和工具套件,它们使用 追踪以帮助开发者理解复杂系统的行为以及客户端/嵌入式系统中的功能性和性能问题根源。 Pyroscope SDK 提供了直接对应用程序进行 instrumentation 的能力,以实现更精确的分析。
功能分析 1.开箱即用:Simpleperf 是深度嵌入 Android 系统的‘原生分析仪’
2.数据录制:基于“中断”的采样 (Sampling),利用 Linux 内核的 perf_event_open 系统调用。它通过 CPU 硬件计数器触发“中断”,在中断发生的那一刻,记录下当前的函数调用栈
3.数据生成:安卓设备端会生成一个perf.data
1.录制配置:○选择数据源:CPU、GPU、内存、系统事件
○生成配置脚本:工具会根据你的勾选,自动生成一段文本格式的 Config 文件
2.执行录制:
○方式 A:浏览器直接控制
▪手机连接电脑,在 Web 界面点击 "Start Recording",网页会通过 WebUSB 直接操控手机。
○方式 B:命令行启动
▪使用 adb shell perfetto 命令,并将刚才生成的 Config 文件传给它。
○方式 C:系统开发者选项
▪在安卓手机设置里开启“系统跟踪”,直接用手机操作录制,不需要电脑 1.引入SDK
2.初始化代码
○配置服务端地址:告诉 SDK 采集到的数据发往哪个服务器(Alloy 或 Pyroscope Server)。
○设置采样率:定义每秒钟抓取的频率。
○设置标签(Tags):可以给数据打上标签,比如 version: v1.0 或 env: dev。
3.自动录制
○后台采样:SDK 在后台以极低的损耗定期抓取堆栈信息。
○数据压缩:SDK 会将采集到的原始数据在本地进行初步压缩和聚合。
○定时上报:每隔一段时间(通常是 10 秒),SDK 自动通过网络将数据包推送到远端服务器。
功能洞察
1.基于Android原生:Android 系统的‘原生分析仪’2.数据录制:通过在设备本地的python脚本进行录制性能数据源文件
1.SDK连续录制:无论是通过哪种方式,本质上都是在设备中运行Perfetto的开源SDK,录制连续的基于时间线的性能数据2.可选性能指标:
•CPU:选择是否查看调度频率、每个核心的占用。
•GPU:是否看渲染频率、显存占用。
•内存:是否开启 heapprofd(Native 内存采样)。
•系统事件:是否开启 ATrace(系统预设的打点)。
采集配置
1.后台采样:SDK 在后台以极低的损耗定期抓取堆栈信息。2.持续分析:依据采集SDK中配置的采样频率,不间断持续的从设备中采集应用数据
3.定时上报:每隔一段时间(通常是 10 秒),SDK 自动通过网络将数据包推送到远端服务器。
调研二:数据处理
产品名称 Simpleperf Perfetto Pyroscope
功能说明 Simpleperf基于本地生成的性能数据源文件,通过脚本的方式生成可视化的html报告 Perfetto录制的性能文件一般为perfetto-trace文件,可在Perfetto UI中直接打开
Pyroscope SDK 采集数据后,可通过云端的Grafana Alloy进行统一处理,处理后再将数据传输至Grafana平台或Pyroscope平台进行实时数据查看功能分析 1.拉取数据:使用 adb pull 将perf.data文件拉取到电脑/服务端上。
2.报告生成:使用 report_html.py 将原始数据转化为交互式网页报告 生成 Trace 文件:录制结束后,手机端会产出一个 .perfetto-trace(或者 .trace)格式的二进制压缩文件。
加载可视化界面:将文件拖入 ui.perfetto.dev。 1.Grafana Alloy:可观测性数据流水线(Telemetry Collector)
功能洞察 1.基于Android原生:Android 系统的‘原生分析仪’
2.数据录制:通过在设备本地的python脚本进行录制性能数据源文件
3.符号表适配:
•多路径符号搜寻
○动作:Simpleperf 不仅会读取 App 内部的符号,还会扫描 Android 系统库(如 libc.so)以及嵌入在 APK 中的共享库。
○特点:支持从 .gnu_debugdata 节读取压缩的调试信息,这是为了适配从 Android O 开始系统库的构建方式。
•运行时与离线符号映射
○动作:在录制阶段,它会记录每个进程的内存映射(VMA),确定每个 .so 文件加载到了哪个地址。
○处理:在报告阶段,它将采样到的指令地址(Instruction Pointer)减去加载基址,并在符号表中查找到对应的函数名。
•源码级关联
○动作:如果提供了带有调试信息的未剥离(unstripped)二进制文件,Simpleperf 可以利用 DWARF 信息将采样点对齐到具体的源码行号。
•静态与动态库的适配
○动作:它使用标准的 Android 堆栈展开器,确保符号解析的结果与其他 Android 官方工具(如 Perfetto)保持高度一致。 1.协议解码与重组
•动作:将录制产生的二进制 ProtoBuf 原始数据流进行解压和解码。
•目的:由于原始数据是为了节省性能而采用碎片化存储的,预处理需要将这些散落在不同时间点的数据片段,按时间顺序重新排列。
2.符号化与名称还原
•动作:将数据中的内存地址、函数指针与符号表(Symbol Tables)进行比对。
•目的:将枯燥的十六进制地址(如 0x7f12...)翻译成研发能看懂的函数名(如 onDraw())。这也是为什么你能在 SQL 查询中直接搜索函数名的原因。
3.跨维度关联与建模
•动作:这是最核心的一步。它会将 CPU 调度信息、线程状态、函数调用栈(Slices)以及硬件计数器(Counters)全部映射到同一个时间轴上。
•目的:建立数据间的因果关系。例如,它会自动识别出“线程 A 被阻塞”是因为“线程 B 持有了锁”,并将这种关系写入底层的虚拟表中。
4.预计算指标
•动作:在数据加载完成前,预先运行一些内置的 SQL 脚本。
•目的:提前计算出一些关键指标,如“掉帧次数”、“App 启动总耗时”等,确保用户在打开界面时能立即看到概况总结,而不需要等待手动计算。
•数据统一预处理:○统一管控:如果你有 100 台设备,你不需要给每台设备配置如何发送数据,只需要让它们都发给 Alloy,由 Alloy 统一管理出口。
○降低损耗:Alloy 可以在本地先对数据进行聚合和过滤。比如,如果一秒钟产生了 1 万条重复报错,Alloy 可以只发 1 条给服务器,节省带宽和存储成本。
○高度兼容:它支持 Prometheus、OpenTelemetry、Loki 等几乎所有主流协议。
调研三:可视化数据分析
产品名称 Simpleperf Perfetto Pyroscope
功能说明 Simpleperf生成的report.html是独立的离线可交互的报告,基于函数热力与cpu调用可查看设备、进程的整体报告
Perfetto UI中可进行查看Perfetto SDK录制的perfetto-trace或其他平台SDK录制的prof文件转换的perfetto-trace文件,基于时间线进行查看对设备、进程的旅程 Pyroscope 的界面(通常是 Web UI)是为**“线上实时监控”设计的。它的界面风格更接近于股票走势图或云监控大盘,侧重于时间维度的连续性和多版本对比。功能分析 1.全局统计看板
•包含内容:显示的采样总时间、总样本数、涉及的线程数以及事件类型(如 cpu-cycles)。
2.交互式火焰图
•结构:纵向是调用栈深度(越往上函数越深),横向是耗时占比(越宽代表这个函数占用的 CPU 越多)。
•交互功能:
○点击缩放:点击某个函数块,它会放大填满整个宽度,让你看清其内部更细微的子函数调用。
○实时搜索:右上角有搜索框,输入函数名(如 Choreographer),所有相关的块都会高亮。
3.函数详情列表
•关键列:
○Overhead (占比):该函数(及其子函数)消耗的 CPU 百分比。
○Sample Count:被抓拍到的次数。
○Symbol:函数名。
○Binary:该函数属于哪个 .so 或库文件。
4.源码/汇编对照模块
○功能:如果录制时关联了源码,它能直接展示该函数每一行代码消耗了多少百分比。如果没有源码,它会展示汇编代码及其耗时。 1.时间轴控制区
•功能:显示整个录制过程的时间进度(从 0 秒到结束)。你可以通过键盘(W/S 放大缩小,A/D 左右移动)在海量数据中精准定位到卡顿发生的那几毫秒。
2.侧边栏菜单
•功能:包含“打开文件”、“录制新配置”以及最重要的 “数据层级切换”。你可以通过它快速跳转到不同的进程、线程或硬件指标视图。
3.主视图轨道区
•包含内容:
○CPU 调度轨道:显示每个 CPU 核心在每一时刻都在跑哪个进程。
○线程状态轨道:用不同颜色标记线程是处于“运行(Running)”、“睡眠(Sleeping)”还是“阻塞(Runnable)”状态。
○方法调用栈轨道:类似火焰图的横向展开,显示函数的调用层级(ATrace/SDK 打点)。
○硬件指标轨道:如内存占用曲线、电量消耗、GPU 频率等。
4.详细信息面板
•功能:展示该事件的精确开始时间、持续时长、所在的线程信息等。
5.SQL 查询引擎
•功能:Perfetto 背后其实是一个 SQLite 数据库。你可以直接输入 SQL 语句来筛选数据。 1.时间范围筛选器
•功能:显示一个随时间波动的 CPU 或内存占用曲线。你可以像看视频进度条一样,自由拉取过去 1 小时、1 天甚至 1 个月 的数据。
2.核心火焰图展示区
•功能:与 Simpleperf 类似,展示函数的调用层级和耗时占比。但它的特点是“实时聚合”——它展示的是你所选时间段内,成千上万个样本累加后的平均状态。
•交互:支持点击放大、搜索高亮,并且可以在 表格 和 火焰图之间一键切换。
3.对比分析模块
•功能:支持左右双屏对比。
○时间对比:对比“今天”和“昨天”的性能差异。
○版本对比:对比“版本 1.0”和“版本 2.0”的火焰图。
•视觉呈现:它会用红色标记耗时增加的函数,蓝色标记耗时减少的函数。
功能洞察 1.资源占用占比:由于Simpleperf的技术底层是基于Linux的perf_event_open 的系统调用,可统计进程、线程、函数调用对CPU周期、指令运行、缓存未命中的整体占用比例
2.函数详情列表 :通过在列表展示设备/进程中所有的函数列表
3.交互式火焰图
•结构:纵向是调用栈深度(越往上函数越深),横向是耗时占比(越宽代表这个函数占用的 CPU 越多)。
1.时间线视图:基于设备、线程的连续录制,可通过时间线视图查看CPU、线程、内存等资源的时间维度的运转2.详细信息面板:展示该事件的精确开始时间、持续时长、所在的线程信息等。
3.SQL 查询引擎:Perfetto 背后其实是一个 SQLite 数据库。你可以直接输入 SQL 语句来筛选数据。
•版本对比:支持左右双屏对比,基于时间/版本,对比相同函数在不同版本下的耗时对比
图示
函数/进程热度对比
函数列表
函数火焰图
时间线视图
详细信息面板
SQL脚本查询视图
•操作区,主要用到 Current Trace 下的几个选项
○Show timeline :显示当前 Trace,切到了别的界面之后,再点这个就会回到 Trace View 界面
○Query:写 SQL 查询语句和查看执行结果的地方
○Metrics:官方默认帮你写好的一些分析结果
○Info and stats :当前 Trace 和手机 App 的一些信息
•信息区:时间与搜索。
•Trace 内容区:图形化展示 Trace 的区域
•信息区:展示Trace 内容区中选择中的元素的详细信息
Trace 内容区中主要有以下一些元素:
slice,片段
鼠标单击后会有一个黑框包围住,信息区会显示相关信息:
counter,计数器
CPU Sched Slice, cpu 调度片段
thread_state,线程状态
点击片段上方线程调度信息片段(Running),可以看到线程当前运行在哪个CPU上
点击信息区中的 Running on CPU 7 旁边的斜箭头:
就可以跳转到 CPU 调度区域中:
再次点击信息区域的斜箭头,可以回到原来位置
这里选择的 thread_state 是 App 的主线程,由用户点击屏幕唤醒运行,实际很多线程都是由其他线程/进程唤醒的,比如在 CPU 调度区域中选择一个 Slice:
信息区右侧的意思是当前 thread 由 P(Process)/system/bin/surfaceflinger [584] 中的 T(Thread)app [689] 唤醒。
线程从就绪到运行延迟了 48us 381ns
当我们把鼠标放在某一个任务上时,该任务就会高亮,其他任务变成灰色,方便我们查看单个任务的调度情况
核心火焰图
版本对比火焰图
标签查询
产品名称 Simpleperf Perfetto Pyroscope
监测事件 Simpleperf事件清单.txt
ftraceFtrace事件清单.txt
○调度 activity:
▪sched/sched_switchCPU调度切换
▪sched/sched_wakeupCPU调度唤醒
▪sched/sched_wakeup_new唤醒新创建的任务
▪sched/sched_process_exec启动新程序
▪sched/sched_process_exit创建进程
▪sched/sched_process_fork进程主动申请退出
▪sched/sched_process_free内核彻底清理掉这个进程占用的所有遗留资源
▪sched/sched_process_hang进程挂起/僵死
▪sched/sched_process_wait在等另一个进程结束
○文件系统事件:
▪ext4 (Fourth Extended File System)文件的创建、删除、修改
▪f2fs(Flash-Friendly File System)文件系统层面的操作
▪block(块设备驱动层)关心把数据写进存储芯片
○atrace 事件
▪view
▪gfx
▪Activity Manager
▪dalvik
▪binder_driver
Atrace监测事件.txt
进程统计信息
○系统级
▪/proc/meminfo系统内存使用的详尽快照
▪/proc/vmstat虚拟内存管理的动态过程统计
▪/proc/statCPU 自开机以来的所有运行状态指标
○每个进程
▪/proc/<pid>/status记录了内存,权限和线程信息
▪/proc/<pid>/oom_score_adjAndroid 系统管理进程生死的核心指标
heapprofd
借助 heapprofd,您可以对使用本地内存的原因进行采样。
CPU 核心指标 (算力消耗)•process_cpu:cpu (CPU 时间):
○分析意义:这是衡量“谁最费电/最占资源”的终极指标。如果一个函数在这里很宽,说明它正在疯狂运算。
•process_cpu:samples (采样数):
○分析意义:通常与 cpu 指标成正比,用于验证统计结果的置信度。
Memory 指标 (内存分配与占用)
•memory:alloc_objects (累计分配对象数):
○分析意义:即使对象被回收了,这个数也只增不减。对应你之前提到的 alloc 动作频率。
•memory:alloc_space (累计分配空间):
○分析意义:关联内核的 mm_page_alloc 事件。如果这个数值增长极快,说明程序在频繁申请内存,会导致严重的缺页中断(Page Fault)。
•memory:inuse_objects (当前使用对象数):
○分析意义:用于排查内存泄漏。如果这个数一直涨,说明对象没被回收。
•memory:inuse_space (当前占用空间):
○分析意义:这就是任务管理器里看到的“内存占用量”。
Block 指标 (线程阻塞)
•block:contentions (阻塞次数):
○分析意义:对应你看到的 runtime.selectgo 现象。次数多意味着程序逻辑中有大量的同步等待。
•block:delay (阻塞延迟时长):
○分析意义:这是导致 OPS/s 掉落 的直接原因。如果 delay 很高,说明 CPU 在空转等待。
Mutex 指标 (锁竞争)
•mutex:contentions (锁竞争次数):
○分析意义:这就是你关心的“锁维度”。次数越多,系统的并发性能越差。
•mutex:delay (锁等待时长):
○分析意义:直接量化了锁对业务吞吐量的损耗。
- Goroutines 指标 (并发状态)
•goroutines:goroutine (协程堆栈):
○分析意义:全景图。用来确认是否因为开了太多协程(类似线程)导致内核调度过载。
CPU相关
•cpu-cycles (CPU 周期)•branch-misses(分支预测失败)
•cpu-migrations(CPU 迁移)
•instructions(执行指令数)
•context-switches(上下文切换) CPU计数、CPU频率、CPU调度
•process_cpu:cpu•process_cpu:samples
CPU相关界面功能
进程层事件占比展示——branch-misses
点击具体进程可进行穿透至线程调用占比
线程层事件占比展示——branch-misses
点击具体线程可进行穿透至.so库调用占比
.so库层事件占比展示——branch-misses
点击具体library可进行穿透至方法调用占比
方法层事件占比展示——branch-misses
方法列表展示
可通过按钮进行切换展示方式为出现次数或出现百分比
点击方法列表中的某一个方法,可穿透查看该方法的火焰图调用
函数火焰图调用
点击火焰图中某个方法,可查看以点击的方法为主方法进行展示的方法调用链
点击火焰图中具体方法
CPU 信息的抓取要查看 CPU 信息,在抓取之前,需要勾选上下面几个选项:
在 CPUX Frequency 区域可以看到每个核心的频率变化情况:
一个常见的场景是查看某段 slice 跑在哪个 CPU 以及对应的频率
找到我们关心的 slice,假设是下面的 Choreogrepher#doFrame 78786:
选择其上方的 Running,可以在信息区看到下面的信息:
点击 Running on CPU 6,跳转到 CPU 区域,可以看到当前 Task 运行在 CPU 6 上,鼠标移动到下方的频率区域即可查看到对应的频率了:
调用堆栈样本将显示为时间线上的即时事件通过选择带有 perf 样本的时间区域,底部面板将显示所选调用堆栈的动态火焰图视图
带有 perf 样本的时间区域的动态火焰图
轨道的高度代表频率,颜色代表空闲状态(彩色:非空闲,灰色:空闲)
在下方的信息区域可以查看到每个线程/进程的 CPU 时间占用情况
线程状态分析
•Running,深绿色
•Runnable,浅绿色
•Sleeping,白色
•Uninterruptible Sleep (IO),橙色
•Uninterruptible Sleep (Non IO),紫红色
Running
浅绿色表示线程处于可运行状态(Runnable),线程正在等待调度器的调度上 CPU 执行。
Runnable
Uninterruptible Sleep (IO)
CPU录制配置
GPU录制配置
Tag Explorer(标签视图)标签视图为查看所有服务集群的视图,再次菜单中,可以查看所有服务在相同时间线中对资源的占用情况,并通过标签筛选的维度查看不同服务对CPU的占用占比与峰值调用情况
通过左上角选择指标,可以看到整体服务集群的概览页面,可以看到基于选定的筛选器查询到默认last 12hours内的所有服务的CPU负载(process_cpu:cpu、process_cpu:samples)平均运行水平
可通过拉去时间范围快速切换选定时间周期
可通过饼图查看进程的占用百分比情况,点击
分别快捷跳转单一详情视图,版本对比火焰图和版本对比视图
最下方可查看函数调用列表,默认通过自身函数调用时间倒序排序,可通过点击某个函数进行在火焰图中高亮显示该函数,也可通过点击函数列表最左侧按钮,将右侧火焰图进行切换该函数及其子函数的调用火焰图
通过再次点击列表按钮可清除筛选
对函数调用关系的火焰图或列表可进行展示配置操作
可通过
按钮进行切换展示样式,展示样式支持列表样式、火焰图样式和两者都展示
可通过点击重制按钮
切换回初始状态,火焰图支持通过函数名区分颜色或通过函数调用热度展示颜色
Single View(服务详情视图)
单一服务视图是通过筛选器筛选出的服务进行单独查看分析的页面
服务占用CPU时常(纳秒级)
便签筛选器
单个服务方法调用
Comparison View(火焰图差异视图)
通过对单个服务或多个服务不同时间选择进行对比,展示CPU占用时间、函数调用等指标的不同,展示不同时间或服务情况下,函数火焰图的调用差别
Diff View(版本调用差异视图)
选定不同服务的不同时间的热度火焰图对比,相比不同版本,基线版本中调用过的、对比版本中如果未调用该函数,则显示removed,基线版本中未调用过,但是对比版本中新调用的,展示为new,其余为均调用过的函数方法,则更快显示为负,呈现绿色,更慢展示为正数,展示为红色,最终以百分比情况展示在火焰度中,正负越靠近百分百则越接近红/绿色
•process_cpu:samples
内存相关 •cache-misses(缓存未命中)
•Cache-references(缓存引用/访问)
•LLC-load-misses(末级缓存读取缺失)
•L1-dcache-load-misses (一级数据缓存读取缺失) •Heap Prefile
•mem.rss
○mem.rss.anon (匿名页内存)
○mem.rss.file (文件映射内存)
○mem.rss.shmem (共享内存)
○mem.locked (锁定内存)
•memory:alloc_objects•memory:alloc_space
•memory:inuse_objects
•memory:inuse_space
内存相关界面功能
进程层事件占比展示——sched:sched_wakeup
点击具体进程可进行穿透至线程调用占比
线程层事件占比展示——sched:sched_wakeup
点击具体线程可进行穿透至.so库调用占比
.so库事件占比展示——sched:sched_wakeup
点击具体library可进行穿透至方法调用占比
方法事件占比展示——sched:sched_wakeup
方法列表展示
可通过按钮进行切换展示方式为出现次数或出现百分比
点击方法列表中的某一个方法,可穿透查看该方法的火焰图调用
函数火焰图调用
点击火焰图中某个方法,可查看以点击的方法为主方法进行展示的方法调用链
点击火焰图中具体方法
在线抓取native相关内存,在配置record new trace的memory选项中需要放开Native heap profiling,这里需要注意的需要手动放开如下选项“Continuous dump interval”
这一个Heap Prefile轨道上进行箭头点击,每一个箭头代表一次native内存采样,点击箭头后可以看到明显有这个时间点的内存情况,点击箭头后展示如下:
其他内存录制配置
•memory:alloc_objects
•memory:alloc_space
•memory:inuse_objects
•memory:inuse_space
调度相关 •sched:sched_wakeup (调度唤醒)
•sched:sched_stat_runtime(运行时间统计)
•sched:sched_process_exit(进程退出)
•sched:sched_process_fork(进程创建/分身) •CPU TimeLine
•Thread State
•Thread Start time
•Thread End time •block:contentions
•block:delay
•goroutines:goroutine
•mutex:contentions
•mutex:delay
调度相关界面功能
进程层事件占比展示——cache-misses
点击具体进程可进行穿透至线程调用占比
线程层事件占比展示——cache-misses
点击具体线程可进行穿透至.so库调用占比
.so库事件占比展示——cache-misses
点击具体library可进行穿透至方法调用占比
方法层事件占比展示——cache-misses
方法列表展示
可通过按钮进行切换展示方式为出现次数或出现百分比
点击方法列表中的某一个方法,可穿透查看该方法的火焰图调用
函数火焰图调用
点击火焰图中某个方法,可查看以点击的方法为主方法进行展示的方法调用链
点击火焰图中具体方法
通过每个进程、线程、以及对应CPU的详细信息,点击详情后可进行穿透查看调度信息选择其上方的 Running,可以在信息区看到下面的信息:
点击 Running on CPU 6,跳转到 CPU 区域,可以看到当前 Task 运行在 CPU 6 上,鼠标移动到下方的频率区域即可查看到对应的频率了:
在 CPU 信息区域,我们可以看到每个线程/任务在 CPU 上的调度情况。
锁竞争(lock contention)
看到lock contention 片段,可以点击上边的monitor contention来查看当前对象锁竞争发生的调用栈,如下详情中显示当前对象锁被Owner (Binder:1754_16)持有,其持锁当前运行在serviceDoneExecuting (AMS.java 16426行),且当前等待该对象锁的线程已经有2个了;当前线程执行被阻塞在getUidState方法中(AMS.java 6614行)。
•block:contentions
•block:delay
•goroutines:goroutine
•mutex:contentions
•mutex:delay
IO相关 •syscalls:sys_enter_write(发起文件写入申请)
•syscalls:sys_exit_write(文件写入操作返回)
•syscalls:sys_enter_read(发起文件读取申请)
•syscalls:sys_exit_read(文件读取操作完成)
•block:block_rq_insert(I/O 请求进入待处理队列)
•block:block_rq_complete(硬件层读写任务彻底结束) •syscalls:sys_exit_fadvise64_64
•syscalls:sys_enter_fadvise64_64
•syscalls:sys_exit_readahead
•syscalls:sys_enter_readahead
•block:block_rq_issue
•block:block_rq_insert
•block:block_rq_complete
•block:block_rq_requeue
IO相关界面功能
进程层事件占比展示——syscalls:sys_enter_write
点击具体进程可进行穿透至线程调用占比
线程层事件占比展示——syscalls:sys_enter_write
点击具体线程可进行穿透至.so库调用占比
.so库事件占比展示——syscalls:sys_enter_write
点击具体library可进行穿透至方法调用占比
方法层事件占比展示——syscalls:sys_enter_write
方法列表展示
可通过按钮进行切换展示方式为出现次数或出现百分比
点击方法列表中的某一个方法,可穿透查看该方法的火焰图调用
函数火焰图调用
点击火焰图中某个方法,可查看以点击的方法为主方法进行展示的方法调用链
点击火焰图中具体方法
在perfetto中需要监测IO需要先在录制配置中打开Syscalls的开关
录制数据后,可通过事件名称进行SQL查询(安卓样例中未提供I/O功能展示)
没有评论