性能剖析能力基于 async-profiler 技术实现,以极低的性能开销,生成性能剖析火焰图,帮助用户直观的分析 CPU/内存飙升的原因,快速定位应用性能瓶颈。相比直接使用社区的 async-profiler 方案,应用性能监控提供的性能剖析能力免去了工具的安装、命令执行、剖析结果下载等复杂的操作,大幅提升了排查应用性能问题的效率。
根据反复性能测试的结果,对一个典型的微服务应用执行性能剖析采集,采集过程中的 CPU 开销在5%以下,内存开销在50M 以下,对于TPS和响应耗时基本没有影响。
操作前提
应用使用腾讯云增强版 Java 探针接入,探针版本 1.16-2024030510 及以上。
运行环境需要安装 OpenJDK 或其他基于 HotSpot JVM 开发的 JDK,暂不支持仅安装了 JRE 的环境。
支持 Linux(x64, arm64) 操作系统,暂不支持 macOS 和 Windows。
不推荐使用 Java 8u352 以下的 JDK,可能存在 内存崩溃 风险。
操作步骤
1. 登录 腾讯云可观测平台。
2. 在左侧菜单栏选择点击应用性能监控 > 应用诊断 > 性能剖析页面。
3. 在页面左侧的实例列表中找到需要进行性能剖析的实例,点击采集。
4. 在弹出对话框中,选择数据采集时长和采集类型,点击确认。
5. 采集任务提交后,可以在页面右侧的性能剖析记录中查询剖析结果,当采集状态为采集完成时, 点击查看性能剖析,在弹出页面查看性能剖析火焰图。
选项名 | 说明 |
数据采集时长 | 从应用实例收到采集任务开始,采集剖析数据的时间长度。目前支持5秒、10秒、30秒、3分钟、5分钟。 |
采集类型 | 采集类型决定了剖析数据代表的性能指标,目前支持 CPU、耗时、内存三种采集类型。 CPU:代表 CPU 执行代码块所花费的时间。 耗时:耗时基于墙钟时间(Wall Clock)进行统计,从进入到退出方法所经过的实际时间。所有等待时间、锁定和线程同步的时间都包括在内,所以墙钟时间不会短于 CPU 时间。 内存:代表内存分配。 |
性能剖析火焰图使用说明
性能剖析基于抽样获取剖析数据,性能指标通过函数在抽样中出现的频率来体现,并不是绝对值,所以需要重点关注方法(函数)之间的相对占比。在火焰图中,Y 轴代表方法(函数)栈的深度,X 轴代表被抽样的次数。以 CPU 时间为例,一个方法(函数)的宽度越宽,CPU 执行代码块所花费的时间就越长。
在分析火焰图的时候,建议从深度最深的方法(函数)开始分析。栈最深,出现在火焰图中的位置会越靠近下方,也就是“火苗”的位置(不同于自然界的火焰,在 APM 目前使用的火焰图中,火焰朝向下方)。
注意:
火苗越宽,代表性能上的消耗越大,所以宽火苗往往是引发性能问题的根源。