一、问题描述
服务器出现时不时的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