前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >cpu分析利器 — async-profiler

cpu分析利器 — async-profiler

作者头像
龟仙老人
发布于 2020-12-15 06:47:48
发布于 2020-12-15 06:47:48
3.3K00
代码可运行
举报
文章被收录于专栏:捉虫大师捉虫大师
运行总次数:0
代码可运行

简介

async-profiler是一款采集分析java性能的工具,翻译一下github上的项目介绍:

❝async-profiler是一款没有Safepoint bias problem低开销java采集分析器,它利用HotSpot特殊的api来收集栈信息以及内存分配信息,可以在OpenJDK,Oracle JDK以及一些其他的基于HotSpot的java虚拟机。async-profiler可以追踪以下几种事件:

  • cpu周期
  • 硬件和软件性能计数器,例如高速缓存未命中,分支未命中,页面错误,上下文切换等
  • Java堆中内存的分配
  • 锁尝试,包括Java对象监视器和ReentrantLock

使用方法

首先下载async-profiler,github主页(https://github.com/jvm-profiling-tools/async-profiler)上有已经编译好的文件,找到对应的平台下载即可

基本用法

下载好的文件解压后,有一个profiler.sh脚本,运行脚本即可对java进程进行cpu分析,例如java进程id为1232

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./profiler.sh start 1232
./profiler.sh stop 1232

或者可以用-d指定剖析的时间(秒)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./profiler.sh -d 30 1232 

执行完成后会输出采集的信息:

通常我们会用更加直观的火焰图来绘制输出的信息,使用参数-f {$file_name}.svg

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./profiler.sh -d 30 -f ./nacos.svg 1232

命令执行完成后会生成一个svg格式的文件,用浏览器打开

火焰图怎么看?可以参考阮一峰的文章

❝《如何读懂火焰图》 http://www.ruanyifeng.com/blog/2017/09/flame-graph.html ❞

简单来说:x轴是抽样数,x轴越长说明被这个方法被抽样的次数越多,消耗cpu时间也越长 y轴是栈的深度,通常越往上越细,如果发现往上有一个平顶,且平顶很宽,则说明它可能有问题,消耗cpu时间较多。

其他参数介绍

  • -e event

event 可选参数用这个命令来查看

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./profiler.sh list list 1232

输出样例:

event 默认为cpu,也可以用alloc来查看内存分配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./profiler.sh -e alloc -d 30 -f ./nacos-alloc.svg 1232

lock查看锁情况:

其他的模式这里就不一一尝试,用的最多的还是cpu模式。

  • -i N 设置采样频率,默认是10ms,可使用msuss作为单位,无单位默认为纳秒,如
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./profiler.sh -i 500us -d 30
  • -j N 设置栈采样深度
  • -o fmt 设置输出格式:可选的有 summarytracesflatjfrcollapsedsvgtree,最常用的是svg

更多命令可参考async-profiler github主页

一次网关性能压测实例

笔者有一次在压测全链路异步网关时,RPS在2000左右,始终上不去,cpu消耗比较高,于是使用async-profiler进行cpu剖析,生成的火焰图如下

可以看到这里有个宽又深的栈,它消耗了很多cpu,限于图像大小,再往上拉,看下这块到底是什么

从类名就能看出是log4j,猜测是代码某处打日志过于频繁导致,找到打日志的地方后先去掉日志,压测了一下,果然RPS提升到了5000,一处小小的日志竟有如此大的影响。

原理介绍

看到这里相信你应该会用async-profiler来进行cpu剖析了,如果感兴趣可以了解下async-profiler实现的原理,这块有一篇文章介绍的很详细,可以参考

❝《JVM CPU Profiler技术原理及源码深度解析》 https://mp.weixin.qq.com/s/RKqmy8dw7B7WtQc6Xy2CLA ❞

简单总结一下:

  • cpu profiler实现一般有两种方案:(1)Sampling,采样(2)Instrumentation,埋点;采样对性能损耗较小但没那么准确,埋点(类似AOP)精准但性能影响大
  • Sampling采样只能在Safe Ponit处采样,会导致统计结果偏差,也就是开头说的Safepoint bias problem,例如某些方法执行时间短,但执行频率高,正真占用了cpu,这部分如果Sampling的采样频率不能足够小,可能就采样不到,但采样频率过高又会影响性能,这就是一般的基于采样的cpu profiler的缺点
  • async-profiler是基于采样实现的,但它又没有Safepoint bias problem,它是通过一种叫做AsyncGetCallTrace的方式来采样,这种采样不需要在安全点处采样,但这个函数不是那么容易就调用到的,需要使用一些技巧(黑科技)的方式来获取

正是第三点原因我才写了这篇文章来推荐这款cpu分析利器,比如我用了一款其他的分析器(uber-common/jvm-profiler)来分析上面网关的cpu,得出了如下的火焰图

如果是这样,完全没法找到问题。而且阿里开源的Arthas中的cpu分析也是使用的async-profiler。所以你不试试吗?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 捉虫大师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下
如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然。别慌,这里有一款低开销、自带火焰图、让你大呼好用的 Java 性能分析工具 - async-profiler。
未读代码
2019/12/16
14.9K0
超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下
Arthas profiler(使用async-profiler对应用采样,生成火焰图)
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
刘大猫
2025/04/13
1450
JVM CPU Profiler技术原理及源码深度解析
研发人员在遇到线上报警或需要优化系统性能时,常常需要分析程序运行行为和性能瓶颈。Profiling技术是一种在应用运行时收集程序相关信息的动态分析手段,常用的JVM Profiler可以从多个方面对程序进行动态分析,如CPU、Memory、Thread、Classes、GC等,其中CPU Profiling的应用最为广泛。
美团技术团队
2019/10/12
1.2K0
JVM CPU Profiler技术原理及源码深度解析
使用火焰图进行Java性能分析
内核维护着各种统计信息,被称为Counters,用于对事件进行计数。例如,接收的网络数据包数量,发出的磁盘I/O请求,执行的系统调用次数。常见的这类工具有:
mazhen
2023/11/24
1.3K0
使用火焰图进行Java性能分析
Java问题排查分享
最近翻看以前写的 PPT, 发现了在2019年做的一次技术分享,关于 Java 问题排查,由于没什么公司机密可言,整理下分享给大家~
龟仙老人
2021/12/01
5830
性能优化|火焰图篇
上篇文章写完后,性能调优|成都核酸系统篇 收到了一些夸赞,让我有继续写下去的动力;
用户5166556
2023/03/18
1.1K0
性能优化|火焰图篇
CPU性能优化干货总结
部门成立专项组,对数智平台和站务系统做性能优化,其中目标之一为降低服务端硬件成本,即在32G内存、CPU银牌的配置下,能支撑1万+发客量。要达到此目标,需通过压力测试并配合监控系统,以QPS、RPS、接口响应时间、接口成功率、SQL耗时、JVM运行情况、CPU和内存运行情况等数据指标为依据,找出系统中存在的性能瓶颈。
夕阳也是醉了
2023/10/16
4780
CPU性能优化干货总结
性能提升30%,陌陌应用性能持续剖析产品化实践
Continous Profiling的概念起源于 Google 的论文,是一种在应用运行时收集应用程序相关信息的动态分析手段,让性能分析贯穿应用的整个生命周期,广泛地用于性能巡检、问题定位等场景。当应用程序在运行过程中,正在处理计算或者执行syscall的时候,应用自身会产生大量有价值的运行时信息,我们可以进行实时的数据采集,这个采集过程是read only的,我们要确保我们的采集数据动作不会给应用带来任何Debuff。通过对这些运行时的一手信息的聚合分析,帮助用户做一些疑难杂症的root cause analysis和应用性能的退化原因分析。
童子龙
2025/03/06
4210
性能提升30%,陌陌应用性能持续剖析产品化实践
前端抱怨 API 响应慢,怎么办?
分析API的耗时是将API的总耗时拆分为不同的部分,清晰的知道是什么原因导致耗时过高。我们借助不同的工具,在不同的网络环境下进行耗时分析,从而提出相应的优化建议。 请求发送过慢导致耗时增加; DNS解析过慢导致耗时增加; 恶劣的网络环境导致耗时增加; 一直在排队导致响应过慢; 服务端响应过慢导致耗时增加; 响应体积过大导致耗时增加; 等等…… 一般从感官上觉得API接口响应慢,大部分人会直接归结于服务端处理慢,其实是不合理的。通过在内网环境下的API耗时分析和外网环境下的API耗时分析的对比,一般会认识到原
程序猿DD
2022/03/15
1.8K0
Java性能分析之火焰图
git clone https://github.com/jvm-profiling-tools/async-profiler
千羽
2021/01/14
1.6K0
Java性能分析之火焰图
一次线上服务高 CPU 占用优化实践
线上有一个非常繁忙的服务的 JVM 进程 CPU 经常跑到 100% 以上,下面写了一下排查的过程。通过阅读这篇文章你会了解到下面这些知识。
挖坑的张师傅
2022/05/13
7800
一次线上服务高 CPU 占用优化实践
比较 VisualVM、JMC 和异步分析器
探查器的目的是获取有关程序执行的信息,以便开发人员可以了解某个方法在给定时间段内执行了多少时间。
IT千锋教育
2023/05/31
6530
C++ 之 perf+火焰图分析与调试
在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
芯动大师
2024/09/10
1730
C++ 之 perf+火焰图分析与调试
腾讯云 APM 应用诊断升级:链路追踪与智能剖析的融合
在某电商平台的监控大屏前,弥漫着紧张的气氛,运维工程师们目不转睛地关注着实时跳动的交易成功率数据,随时准备着系统扩容。
腾讯云可观测平台
2025/04/09
1300
腾讯云 APM 应用诊断升级:链路追踪与智能剖析的融合
Linux CPU 性能分析工具火焰图(Flame Graphs)认知
不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树
山河已无恙
2024/02/26
1.7K0
Linux CPU 性能分析工具火焰图(Flame Graphs)认知
Kubernetes Pod应用性能分析工具 Kubectl Flame
性能分析是分析应用程序性能以改善代码段性能的行为。可视化配置文件并快速识别性能问题的最流行方法之一是生成 “火焰图”。例如下图
YP小站
2021/02/26
1.7K0
Kubernetes Pod应用性能分析工具 Kubectl Flame
性能测试工具CPU profiler(gperftools)的使用心得
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/83820080
10km
2019/05/25
16.1K0
2024-4-10 群讨论:JFR 热点方法采样实现原理
其实对应的就是 jdk.ExecutionSample 和 jdk.NativeMethodSample 事件
干货满满张哈希
2024/05/25
1230
2024-4-10 群讨论:JFR 热点方法采样实现原理
【Arthas】实战教程
最近团队在研究线上问题排查方式,发现线上存在CPU飙升问题,测试环境无法复现,查阅资料发现 Arthas 能够分析此类问题。
后端码匠
2023/11/05
6570
Kubernetes 应用性能分析工具 - Kubectl Flame
Profile 是分析应用程序性能来改进代码质量的常用方法,最流行的可视化性能分析方法是生成火焰图。
我是阳明
2021/03/01
7080
相关推荐
超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验