记一次cpu优化,使用jprofiler11

一、问题描述

服务器出现时不时的cpu瞬间升高。
在这里插入图片描述

二、解决方式

先附最终解决方式,后面再讨论我解决这个问题的探索过程。
这里是在cpu view 或 thread view菜单下第一个,可以看到cpu耗时占比最高的java方法,一般看到方法后,大概就知道是哪里的问题。
在这里插入图片描述

我们这里是在频繁的接收一个第三方的回调,每次回调处理执行耗时300~2000ms,回调里有图片处理,相关开发人员说这个图片处理可以免去,因为在其它地方已经处理过了。改完部署上线看看效果。
后面观察了2天再也没有cpu的瞬间上升,问题解决。
在这里插入图片描述

三、探索过程

检查日志

一开始查服务器日志,但是服务器日志充满了大量其它更高频率的信息,看不出什么东西。

检查哪些地方会触发一段程序的执行

然后猜测可能是用户操作图片上传或表格下载导致,于是检查了用户操作的记录,也没发现异常。
还怀疑过是什么定时任务或第三方的回调(这里查数据出现了疏忽),把能想到的触发程序执行的方式都想过了,都没找到问题所在。

使用jstack和arthas

先后使用了jstack工具、arthas。但这两个工具查到的总是队列,可能线程运行完回归到线程池的队列里了,无法定位到具体代码。
一般arthas能看到的是耗时长的程序,一个线程长时间执行或卡死。
在这里插入图片描述
最后是在没办法了,才研究别的jvm监控工具,一番筛选后选择了jprofiler,装起来还是有点费劲的。下面贴上安装流程。

四、jprofiler11安装流程

这里参考了这位大佬的博客,后续大部分操作都是参考里面的,稍微做了些补充。
jprofiler远程监控JVM

1.下载本机(windows或mac)用的jprofiler11

下载地址,用在你自己机器上并非服务器上的,根据你自己电脑选择型号下载。
jprofiler11下载

2. 下载服务器端的jprofiler

本机和服务器的jprofiler版本需要保持一致,这里统一用jprofiler11.0.2。
直接命令下载

# 进入opt目录
cd /opt
# 下载
wget https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_linux_11_0_2.tar.gz
# 解压
tar -zxvf jprofiler_linux_11_0_2.tar.gz
# 重命名文件夹(简化文件夹)
 mv jprofiler11.0.2/ jprofiler11

部分服务器可能会有安全检测机制,导致无法下载,这里提供一下附件,应该是在博客顶部下载

3. 配置linux服务器的jprofiler环境变量

先检查服务器是64还是32位,选择不同的配置添加到环境变量。

# 检查服务器是64位还是32位
uname -m
# 修改环境变量
vim /etc/profile
# 32位的添加
export LD_LIBRARY_PATH=/opt/jprofiler11/bin/linux-x86
# 64位的添加
export LD_LIBRARY_PATH=/opt/jprofiler11/bin/linux-x64
# 刷新环境变量
source /etc/profile

4.配置本机的jprofiler

这里图片我就照抄了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用你服务器的jprofiler根目录
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后一个选项选择稍后启动。

5.启动服务器的jprofiler

刚才本机的配置文件放到服务器/opt/jprofiler11/config 目录。

springboot启动脚本在 & 符号之前添加以下内容

-agentlib:jprofilerti=port=8849 -Xbootclasspath/a:/opt/jprofiler11/bin/agent.jar -agentpath:/opt/jprofiler11/bin/linux-x64/libjprofilerti.so=port=8849,nowait 

然后重启你的springboot项目。

再启动jprofiler

# 进入jprofiler的bin目录
/opt/jprofiler11/bin
# 执行 jpenable
./jpenable
# 如果想退出的话可能要重启springboot项目

在这里插入图片描述
你的服务器需要在防火墙里开放8849端口,防火墙操作这里不再描述。
本机检查服务器是否可访问8849,去掉下面命令的<>

# windows
telnet <服务器IP或域名> <端口号>
# mac
nc -zv <服务器IP或域名> <端口号>

五、启动本机jprofiler,对服务器进行监控

打开你本机的jprofiler,点击左上角的Start Center,选择刚刚配置的一个连接
在这里插入图片描述
如果有这个选项,根据你服务器的情况选择。Instrumentation可以监控到更多的数据,Sampling是简版,数据少很多,但是官方推荐的。我在用Instrumentation时弄崩过服务器,压力太大了,迫不得已再切换到Sampling,正常其实Sampling够用了。
在这里插入图片描述
在这里插入图片描述
最后就是看监控了,排查问题了。
一般在cpu view 或 thread view菜单下第一个就可以看到足够的数据
这是jprofiler的官方文档。
https://www.ej-technologies.com/resources/jprofiler/help/doc/main/introduction.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值