性能剖析(新版)

最近更新时间:2025-10-16 14:57:22

我的收藏
性能剖析能力通过智能分析引擎直接输出性能优化建议,并提供增强版火焰图等强大的可视化分析工具,帮助用户快速定位应用性能瓶颈。性能剖析目前支持 Java 和 Go 应用。其中,Java 应用的性能剖析能力基于 async-profiler 技术实现,Go 应用的性能剖析能力基于 pprof 技术实现。腾讯云增强版 OpenTelemetry Java 探针以及腾讯云 OpenTelemetry-Go 探针已经内置性能剖析能力,不依赖任何其他组件,即可以以极低的性能开销,采集剖析数据。

前提条件

Java
Go
应用使用腾讯云增强版 Java 探针接入,探针版本2.3-20250131及以上。
运行环境需要安装 OpenJDK 或其他基于 HotSpot JVM 开发的 JDK,暂不支持仅安装了 JRE 的环境。
支持 Linux(x64, arm64)以及 macOS 操作系统,暂不支持 Windows。
不推荐使用 Alpine 镜像。Alpine 镜像所包含的 JDK 通常为精简版,可能缺少 JDK 调试符(二进制文件$JAVA_HOME/lib/server/libjvm.so),导致内存采集失败。
不推荐使用 Java 8u352以下的 JDK,可能存在 内存崩溃 风险。
应用使用腾讯云 OpenTelemetry-Go 探针接入,探针版本1.0.1及以上。
Go 版本大于等于1.23。
支持 Linux(x64, arm64)。

操作步骤

2. 在左侧菜单栏选择应用性能监控 > 应用诊断,进入性能剖析(新版)页面。
3. 在页面左侧的实例列表中找到需要进行性能剖析的实例,单击发起任务
4. 在弹出对话框中,根据需要调整采集类型等选项,单击确认
选项名
说明
采集类型
目前支持 CPU 采样分析内存采样分析两种采集类型:
CPU 采样分析:基于代码块在 CPU 上的执行时间进行剖析。
内存采样分析:基于内存占用进行剖析。
采样时长
采样时长代表每一次剖析采集数据的时间长度。实际的采集时间会略大于采样时长。
目标时间
目标时间代表剖析任务创建以后,第一次剖析的执行时间:
立即执行:不等待,立即执行剖析。
指定时间:指定未来24小时内的任意时间点执行剖析。
执行次数
执行次数代表一个剖析任务将被执行多少次:
单次执行:仅执行一次。
重复执行:剖析任务将按照固定的时间间隔被执行多次,用户需要指定总次数以及间隔时长。

任务状态

采集任务提交后,可能出现以下任务状态。
状态
说明
采集中
正在执行数据采集与分析任务。
采集完成
完成采集与分析。
无数据
由于采集时间较短,未能获取到有效数据。
采集失败
任务间隔时间过短、采集数据量过大或数据解析失败。

剖析结果

当采集状态为采集完成时,可以在页面右侧的性能剖析记录中查询剖析结果,单击剖析结果,在弹出页面查看性能剖析结果。剖析结果包含5个模块,通过不同的标签页进行展示。
模块名
说明
分析建议
分析建议模块基于预置的智能分析引擎输出性能优化建议。针对每条性能优化建议,单击标记,可以对优化建议的价值进行反馈,帮助 APM 提升分析建议的准确度。
活跃线程
活跃线程模块列出了每条线程被采中的次数,次数越高,代表线程的活跃度越高,可以重点关注。
热点函数
热点函数模块列出了每个函数被采中的次数,次数越高,代表函数的性能消耗越大,可以重点关注。
火焰图
火焰图是一种用于可视化程序性能数据的强大工具,是一个由多个矩形条堆积而成的图形,每一层矩形条代表一个函数调用栈中的函数。
调用图
调用图是一种有向图,用于可视化展示程序中函数之间的调用关系和执行流程。与火焰图比较类似,同样能够体现每个函数在整个程序执行过程中的相对性能开销占比。

Go 应用内存采样分析

针对 Go 应用内存采样分析,APM 将剖析结果通过 Heap(堆)和 Goroutine(协程)两种维度进行展示。两个维度对应的内存空间说明如下:
Heap(堆):多个协程共享的内存空间。
Goroutine(协程):每个协程私有的轻量级内存空间。
其中,热点函数火焰图调用图功能支持独立的标签页展示两种维度的剖析结果。分析建议功能将两种维度的剖析结果合并到同一个标签页进行展示,若在某个维度未检测到明显瓶颈,对应的性能优化建议为空。

火焰图

火焰图中水平方向矩形条宽度表示函数性能开销,垂直方向表示调用栈深度。通过观察宽矩形条可快速定位热点函数进行优化,沿垂直方向则可分析调用关系,深入理解执行流程和性能瓶颈。在分析火焰图时,建议从深度最深的函数开始分析。栈最深,出现在火焰图中的位置会越靠近下方,也就是“火苗”的位置(不同于自然界的火焰,在 APM 目前使用的火焰图中,火焰朝向下方)。苗越宽,代表性能上的消耗越大,所以宽火苗往往是引发性能问题的根源。
在火焰图的使用过程中,可以关注如下两类指标数据:
总计占比:表示从函数调用栈的最底层到当前函数(包括当前函数及其所有子函数)的性能开销的占比。这个数据反映了当前函数及其整个调用路径在整个程序执行过程中的相对重要性。
自身占比:指当前函数自身的性能开销,不包括它调用其他函数的性能开销。这个指标可以帮助开发者了解当前函数本身的性能开销,而不受到其调用的其他函数的影响。
单击火焰图中的其中一个矩形条,火焰图中将只展示在垂直方向上处于该矩形条调用路径上的矩形条。在这种情况下,该矩形条可以被称为所选区域,而整个应用进程所占的区域可以被称为整体区域(也就是最上层的 root 矩形条)。因此,总计占比自身占比都可以基于所选区域整体区域来计算。单击最上层的 root 矩形条,可以回到火焰图的初始状态,在这种情况下,整体区域等同于所选区域。


调用图

调用图和火焰图比较类似,同样能够体现每个函数在整个程序执行过程中的相对性能开销占比。和火焰图不同的是,当一个函数有多个调用方时,调用图更能够体现出函数之间的调用关系。但调用图不能通过矩形的宽度直观展示性能开销,因此大多数场景下,调用图都是配合火焰图来使用。