通过Profiler分析代码性能
Profiler性能分析支持自动获取应用程序运行过程中的CPU、内存、时延的使用情况。通过火焰图实时展示每一个方法的调用关系和执行率,帮助用户优化代码性能。
约束与限制
- Profiler性能分析,仅针对白名单用户开放,如有需求可以通过提交工单,联系工程师为您开放此功能。
- Alpine Linux系统不支持Profiler功能。因为Alpine Linux是一个轻量级的Linux系统发行版,缺少运行Profiler的必要依赖。如果需要支持Profiler功能,建议使用标准Linux操作系统。
- 为了应用运行稳定,强烈建议您按照要求升级JDK至下表所示的版本。在低版本的JDK上使用Profiler性能分析功能,存在应用崩溃的风险。
表1 JDK版本说明 JDK类型
版本
OpenJDK
- OpenJDK 8u352+
- OpenJDK 17.0.5+
Oracle JDK
- Oracle JDK 17.0.9+
- 支持Profiler性能分析功能的Agent版本如下:
表2 Agent版本说明 Agent版本
说明
2.4.12-profiler
优化Debugging诊断处理逻辑。
2.4.11-profiler
Agent版本2.4.11-profiler及以后版本,支持Profiler的Live Object Memory类型以及全采样设置。
2.4.10-profiler
Agent版本2.4.10-profiler及以后版本,支持Debugging诊断以及Profiler的Live Object Memory类型。
2.4.9-profiler
Agent版本2.4.9-profiler及以后版本,时延度量线程采集算法优化。
2.4.8-profiler
Agent版本2.4.8-profiler及以后版本,支持性能优化推荐。
2.4.7-profiler
Agent版本2.4.7-profiler及以后版本,支持用户包数据采集。
2.4.6-profiler
Agent版本2.4.6-profiler及以后版本,支持Profiler的Latency功能。
2.4.5-profiler
Agent版本2.4.5-profiler及以后版本,支持Profiler。
Agent获取地址,请参考:探针下载地址。
- 使用限制及说明如下:
性能影响
CPU&内存诊断功能经性能测试,在一般的Spring Web应用所有功能效果全部开启的情况下,CPU增加开销5%左右,堆外增加内存开销50 M左右,GC以及请求延迟增加不明显。
通过Profiler分析代码性能
Profiler性能分析支持如下功能:
- 开启性能分析Profiler:首次使用Profiler性能分析功能时,需要开启Profiler。
- 分析代码性能:Profiler性能分析会自动获取应用程序运行过程中CPU和内存和时延的使用情况。通过火焰图实时展示每一个方法、类和线程的调用关系和执行效率,帮助您优化代码性能。
- 对代码性能差异:通过火焰图实时展示两个实例或同一个实例不同时间段的方法、类和线程的调用关系和执行效率的差异,帮助您对比代码性能差异。
- 查看代码性能快照:支持快照列表查询功能。快照列表以分钟为时间维度,获取应用程序的调试信息,如CPU核数、内存分配速率、实例名称以及主机名称。
- 查看建议:支持查看建议。Profiler根据用户的性能数据,识别出超过CPU使用率阈值的方法,然后给出合理的建议。
- 登录AOM 2.0控制台。
- 在左侧导航栏选择“应用监控 > 组件列表”,进入组件列表页面。
- 在左侧“快速筛选”栏中,选择“区域”、“应用”以及“技术栈”。
- 单击“组件”列中某一个组件名称,进入该组件详情页,默认展示“接口调用”详细信息。
- 单击“Profiler性能分析”,切换至Profiler性能分析页签。
- 您可以根据需要执行如下操作:
- 首次进入“Profiler性能分析”页签时,单击“开启Profiler”开启Profiler性能分析功能。
图1 Profiler性能分析
- 仅2.4.5-profiler版本及以后版本的Agent,支持Profiler性能分析功能。
- 如需关闭Profiler性能分析功能,可在“组件设置”中关闭Profiler性能分析功能。详情请参考设置组件监控开关。
- 单击“Profiler性能分析”页签下的“性能分析”子页签,进入“性能分析”页面,执行如下操作:
- 在“性能分析”页面选择您想要查看的实例,设置性能分析类型、范围、以及聚合维度查询条件,即可以查看该实例对应的性能分析数据。
查询参数设置请参考下表:
表4 查询参数说明 选择项
参数
说明
类型
CPU Time
每个方法在CPU上的运行时间。
Allocated Memory
已分配的堆内存(包括已被回收和未被回收的部分),使用场景包括频繁GC(Garbage Collection)等。
Live Object Memory
已分配但未被回收的堆内存,使用场景主要包括内存泄漏等。该功能需要JDK版本为JDK17。
Latency
Trace相关线程的代码方法执行的总耗时。包括方法在CPU上的运行时间、等待I/O的时间、以及方法运行时发生的任何其他时间。
范围
My Code
用户代码。
All Code
全部代码。
聚合维度
Line
代码行。
Method
方法。
Class
类。
Package
Java包名称。
查询结果如下:图2 性能分析
表5 性能分析参数说明 参数
说明
火焰图
- 火焰图Y轴(纵轴):表示调用栈。每一层都是一个函数(包),调用的越深,火焰层数越高。最底部(火焰尖)是正在执行的函数,上方是他的父函数。
- 火焰图X轴(横轴):表示占用时间(内存视图表示占用内存)长度。占用的CPU时间越长,其宽度越宽。
- 鼠标放在火焰图上,可展示某一个方法、类和线程的详细信息。
- 单击火焰图中某个方法条,该方法条可横向放大。单击“Total”列标题行,火焰图还原。
- 在火焰图中相同的方法或包显示的颜色相同。
方法路径
- 鼠标放在Location类某个方法名称上,展示该方法的详细信息。
- 单击Location类某个方法名称,火焰图侧对应的方法会高亮显示,其余方法灰化。再次单击同一个方法名称,火焰图恢复原状。
Self
仅方法自身的性能消耗,不包含调用方法。该数值为所有线程执行结果的总和,因此结果有可能大于所选时间段。
Total
总性能消耗,包含方法自身及其调用方法。该数值为所有线程执行结果的总和,因此结果有可能大于所选时间段。
- 您还可以根据需要执行以下操作:
- 设置时间范围,查看已设时间范围内的数据。可通过如下两种方式设置时间范围:
- 方式一:使用AOM预定义好的时间标签,例如,近1小时、近6小时等,您可根据实际需要选择不同的时间粒度。
- 方式二:通过开始时间和结束时间,自定义时间范围,您最长可设置为1天。
- 按照方法路径搜索:搜索框设置搜索条件后,单击,查看满足搜索条件的火焰图。
- 查看每一个线程、方法、类和包的调用关系和执行效率的实时数据。
- 设置时间范围,查看已设时间范围内的数据。可通过如下两种方式设置时间范围:
- 在“性能分析”页面选择您想要查看的实例,设置性能分析类型、范围、以及聚合维度查询条件,即可以查看该实例对应的性能分析数据。
- 单击“Profiler性能分析”页签下的“对比”子页签,进入“对比”页面,执行如下操作:
- 在“对比”页面设置您想要对比的实例对象(包括实例和时间段)、性能分析类型、范围以及聚合维度,比对类型、即可以查看实例对比的性能分析数据。
图3 代码性能对比
- 对比实例对象:和分别支持选择相同或不同时间段的不同实例,或选择不同时间段的相同实例。
- 性能分析类型、范围、以及聚合维度设置请参考表4。
- 比对类型:当前支持table、flame两种类型。
表6 比对类型参数说明 参数
说明
flame
以火焰图形势进行对比:
- 火焰图Y轴(纵轴):表示调用栈。每一层都是一个函数(包),调用的越深,火焰层数越高。最底部(火焰尖)是正在执行的函数,上方是他的父函数。
- 火焰图X轴(横轴):表示占用时间(内存视图表示占用内存)长度。占用的CPU时间越长,其宽度越宽。
- 鼠标放在火焰图上,可展示某一个方法、类和线程的详细信息。
- 单击火焰图中某个方法条,该方法条可横向放大。单击“Total”列标题行,火焰图还原。
- 火焰图颜色:红色表示当前实例对比值较大;绿色表示当前实例对比值较小;蓝色表示该方法、类或线程,仅在当前实例侧存在;白色表示当前实例对比值相同。
table
以表格形势进行对比:
- 展示方法路径、Baseline(基线总性能耗时)、Comparison(对比总性能耗时)、以及Diff(耗时差时)数据。
- 鼠标放任意一行对比结果上,可展示该方法的对比详细信息。
- 您还可以根据需要执行以下操作:
- 设置时间范围,查看已设时间范围内的数据。可通过如下两种方式设置时间范围:
- 方式一:使用AOM预定义好的时间标签,例如,近1小时、近6小时等,您可根据实际需要选择不同的时间粒度。
- 方式二:通过开始时间和结束时间,自定义时间范围,您最长可设置为1天。
- 按照方法路径搜索:搜索框设置搜索条件后,单击,查看满足搜索条件的火焰图。
- 查看每一个方法、类和线程的调用关系和执行效率的实时数据。
- 设置时间范围,查看已设时间范围内的数据。可通过如下两种方式设置时间范围:
- 在“对比”页面设置您想要对比的实例对象(包括实例和时间段)、性能分析类型、范围以及聚合维度,比对类型、即可以查看实例对比的性能分析数据。
- 单击“Profiler性能分析”页签下的“快照列表”子页签,进入“快照列表”页面,执行如下操作:
- 选择您想要查看的实例,可以查看该实例对应的快照数据。
图4 查看快照列表
表7 快照列表参数说明 参数
说明
日期
获取调试信息的时间。
CPU核数
CPU利用率。
内存分配速率
内存的速度,代表该内存所能达到的最高工作频率。
实例名称
实例名称。
- 设置时间范围,查看已设时间范围内的数据。可通过如下两种方式设置时间范围:
- 方式一:使用AOM预定义好的时间标签,例如,近1小时、近6小时等,您可根据实际需要选择不同的时间粒度。
- 方式二:通过开始时间和结束时间,自定义时间范围,您最长可设置为1天。
- 选择您想要查看的实例,可以查看该实例对应的快照数据。
- 单击“Profiler性能分析”页签下的“建议”子页签,进入“建议”页面,执行如下操作:
- 设置时间范围,查看已设时间范围内的建议数据。可通过如下两种方式设置时间范围:
- 方式一:使用AOM预定义好的时间标签,例如,近1小时、近6小时等,您可根据实际需要选择不同的时间粒度。
- 方式二:通过开始时间和结束时间,自定义时间范围,您最长可设置为1天。
图5 查看建议
表8 建议参数说明 参数
说明
类型
性能问题类型,目前只有cpu类型,后期内存,时延类型会依次上线。
性能问题
具体的性能问题的描述。
调用方法
当前问题出现的方法名。
问题出现数
在查询的时间范围内,当前性能问题出现的次数。
CPU使用率
当前问题最后一次出现,所使用的资源(cpu)的使用率。
操作
支持的其他操作类型,目前仅支持查看详情。
- 单击操作列的“查看详情”,展示某个问题的建议。包括:开始时间、结束时间、问题描述、当前状态、建议修改步骤、问题详情,并支持按照方法路径搜索。
图6 建议详情
- 设置时间范围,查看已设时间范围内的建议数据。可通过如下两种方式设置时间范围:
- 首次进入“Profiler性能分析”页签时,单击“开启Profiler”开启Profiler性能分析功能。
常见问题
在Profiler性能分析的火焰图无数据或其他异常情况下,可以查看Profiler日志确定问题原因。详细操作参见Profiler性能分析常见问题。