CPU消耗过高的问题
在我们压测的过程中,可能会出现cpu消耗较高的情况(大于80%),那么通常出现cpu过高通常有两种情况:
- 接口性能好,比如响应时间<10ms,tps很高,此时CPU使用率高是正常的,不需要优化
- 接口性能不好,比如响应时间>200ms, tps很低,此时需要考虑优化
下面我们来压测一个cpu消耗较高的接口:
我们压测30个线程,持续运行脚本5分钟,可以看到我们的TPS平均只有300左右,响应时间大概在90ms左右。
那么我们来看一下cpu的数据,没有压测之前,cpu的空闲率还有90%多,但是开始执行压测之后,cpu使用率几乎到了100%。后面我们停止压测之后,cpu空闲率又恢复90%左右。
那么上方压测我们可以发现,主要问题就是在cpu上面,如果说cpu降下来,我们tps才能压上去。那么我们怎么去分析这个cpu使用过高的情况呢?
首先我们使用top命令,查看究竟是哪个进程占用我们cpu的资源过多。
我们可以看到有个java的进程,cpu达到了157%。(我的这台服务器是4G2核的,所以我们cpu最高可以达到200%)
使用Jprofiler定位响应时间过长的问题
通常做过性能测试的朋友都知道这个工具,Jprofiler是一个非常强大的工具,一般像线程死锁、阻塞、内存溢出等问题都可以进行监控。
jprofiler的安装
可以选择不同的操作系统安装包进行安装。
链接:https://pan.baidu.com/s/1BVYzp2zcU2Nb7077-FWywQ 密码:rvw9
我们服务器是linux的,所以我将该安装包上传到linux环境,并且 chmod +x jprofiler_linux_11_0.rpm
给文件添加相关权限。
上传成功之后,输入如下命令进行安装
rpm -ivh jprofiler_linux_11_0.rpm
进入 /opt/jprofiler11
路径下,可以看到如下这些文件,则说明已经安装成功了。
然后在tomcat的bin目录下,找到catalina.sh文件,配置如下JVM参数。
JAVA_OPTS="-agentpath:/opt/jprofiler11/bin/linux-x64/libjprofilerti.so=port=8849,nowait"
配置成功之后,我们在安装客户端,直接安装到你本地电脑。
安装jprpfiler客户端
可以使用我这个licese key,或者也可以自己用注册机生成。
A-J11-Everyone#214297-3cdzjcgmyvi2j#452548
安装成功之后,则进入到这个页面。
点击图中圈出按钮区域
点击[New Session] —> [New Remote Integration]
选择连接远程机器,机器类型选择Linux X86
选择JVM供应商,Oracle,JDK版本
添加我们要连接的远程服务器IP
输入我们服务器 jprofiler的安装地址
确认jprofile的默认端口是否正确,我这里用的是默认端口8849
这里有提示让我们把参数加入到配置中,我们前面已经将相关的配置配到tomcat中了。
最后下一步点击完成即可。
下面会问你需要选择哪种模式,第一个是所有的模式,第二个是cpu模式,程序中推荐使用第二个,第二个性能会好一点,但是这里我们为了学习,选择第一个,可以监控到更多数据。
点击ok就可以连接成功了。
注意:如果你的没有连接成功,首先排查防火墙是否关闭,还有就是jprofiler的端口没有被监听上,需要判断8849端口是否配置到了阿里云安全组中。
jprofile基础功能介绍
首先显示的是一些概要数据,映入眼帘的第一个是 Memory
,这是是JVM的数据,第一个是内存,第二个是GC是的活动情况,第三方是classes类,第四个是cpu的数据。鼠标光标移动至鼠标,可以查看详细的数据情况。
下方可以看到每一个数据的具体情况,如memory,我们还可以再上面去查看JVM每个区域的数据,默认是heap所有堆内存的数据,我们还可以筛选查看如Eden、S0、S1、old区域。还可以查看非堆的内存数据,如元空间。
下面这个是GC的活动图,我们可以看到一些GC的详情情况。
还有显示我们程序中所有的classes类
下方显示了我们线程的具体情况,可以看到线程的状态,runable、blocked、waiting等
如果你的jprofile用起来特别卡的话,可能是你JVM中的元空间配置比较小,可以稍微配置大一点。
还有这个我们现在可以查看所有堆的内存信息,那个对象占用的内存最大。
在这里我们可以看到所有的进程状态,这里的状态显示会比jprofile清晰一些。
这个功能也特别好用,如果说你的程序当前遇到线程锁的情况,他会检测到具体是哪个类导致的死锁。