Jmeter压测过程中遇到问题(1)
1. 内存溢出
jmeter是一个java开发的开源性能测试工具,在性能测试中可支持模拟并发压测,但有时候当模拟并发请求较大或者脚本运行时间较长时,压力机会出现卡顿甚至报异常————内存溢出,
这里就介绍下如何解决内存溢出及相关的知识点。。。
首先来看看我们常说的内存泄漏、内存溢出是什么?
内存泄露是指你的应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述;
内存溢出是指你应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致崩溃,这事一种结果描述;
通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出。
在利用jmeter测试过程中,如果内存溢出的话,一般会出现这个提示:java.lang.OutOfMemoryError: Java heap space:意思就是堆内存溢出,不够用了。
说到堆栈内存,顺带简单介绍下堆栈的相关知识:
![](https://img2018.cnblogs.com/blog/1034798/201907/1034798-20190720224644741-1345518235.png)
内存溢出解决方法:调整堆内存大小
步骤:
1、打开jmeter安装文件(可以用notepad++打开),bin目录下的jmeter.bat文件:
![](https://img2018.cnblogs.com/blog/1034798/201907/1034798-20190720224720471-1317508985.png)
2、找到set HEAP开头的内容,根据具体需要修改堆(heap)值大小,以及NEW分配的内存值大小:
![](https://img2018.cnblogs.com/blog/1034798/201907/1034798-20190720224811534-1792020434.png)
这里默认值为:
set HEAP=-Xms512m -Xmx512m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m
将其修改为:
set HEAP=-Xms512m -Xmx4096m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m
注意:一般而言,堆的最大值不要超过物理内存的一半,否则容易导致jmeter运行变慢、卡顿甚至内存溢出(因为java本身的垃圾回收机制是动态分配内存,
调整时候其本身会占用很多内存),NEW分配的内存,不宜太大!
3、修改完成后,关闭文件,重启jmeter既可以:
2. slave启动jmeter-server.bat,提示“Could notfind ApacheJmeter_core.jar”
原因:程序找到jmeter下的文件,是因为没有配置JMETER_HOME
解决方法:
(1)高级系统配置->环境变量,新建系统变量:JMETER_HOME等于你jmeter保存的根目录
(2)系统环境变量path中增加%JMETER_HOME%\bin。
然后重启jmeter-server.bat。jmeter环境是基于Java环境已配置。
3. 客户机可以正常ping通,但是不支持master访问,jmeter_server.bat也正常启动。
原因:客户机的防火墙没有关闭。最好两边防火墙都关闭。(加入公司域,处于安全考虑,个人无法关闭防火墙,需要找网络安全部)
5.启动jmeter-server.bat时抛出了如下异常 (用过-是可以的)
-
Server failed to start: java.rmi.server.ExportException: Listen failed on port:
-
0; nested exception is:
-
java.io.FileNotFoundException: rmi_keystore.jks (系统找不到指定的文件。)
-
-
An error occurred: Listen failed on port: 0; nested exception is:
-
java.io.FileNotFoundException: rmi_keystore.jks (系统找不到指定的文件。)
-
errorlevel=1问题分析
1.可能监听的端口被占用,修改端口号
2.Server相关的rmi配置需要调整
解决方案 -(用过是可以的)
在目录\apache-jmeter-5.0\bin下,用Notepad++编辑器打开名为jmeter.properties的文件
找到server.rmi.ssl.disable=false,改为true,并把前面的#去掉
保存配置调整,重新启动jmeter-server.bat即可恢复正常。
2.Server相关的rmi配置需要调整
解决方案 -(用过是可以的)
在目录\apache-jmeter-5.0\bin下,用Notepad++编辑器打开名为jmeter.properties的文件
找到server.rmi.ssl.disable=false,改为true,并把前面的#去掉
保存配置调整,重新启动jmeter-server.bat即可恢复正常。
这个最好在做分布式的时候,控制机和代理机的jmeter.properties文件这个地方一并修改,不修改还是会报错。
6.jmeter-server.bat 启动报:WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002.
尝试使用 :以管理员身份启动。
7. 分布式下测试master机器没有返回结果
slave机器服务终端显示,但是一个非常简单的脚本,执行超级慢,感觉不应该:
Starting the test on host 192.168.5.158:1099 @ Fri Aug 17 14:00:44 GMT+08:00 2018 (1534485644989)
Finished the test on host 192.168.5.158:1099 @ Fri Aug 17 14:05:18 GMT+08:00 2018 (1534485918786)
Finished the test on host 192.168.5.158:1099 @ Fri Aug 17 14:05:18 GMT+08:00 2018 (1534485918786)
master机器没有返回结果。
解决:
1.怀疑jmeter环境变量配置,反复查看没有问题
2、怀疑jmeter.properties文件修改错误,反复查了master、slave机器的配置文件,没有问题
3、将问题转向机器IP,查看master机器IP,slave机器IP,都用的固定IP,没有问题
4、重新启动master机器的jmeter-server.bat,发现了和slave机器异样的地方,master机器显示的endpoint:IP是Vmware network Adapter vmnet1(安装VMWare的虚拟IP),jmeter-server启动的时候自动识别了虚拟机IP,没有识别本地网络IP
5、将网络适配器中的虚拟适配器禁用掉,重新启动jmeter-server.bat,endpoint变成了本地IP,再次尝试远程执行,成功,复杂的脚本执行也很快。
最终发现问题出现在第四个上:(我按照第4,5个方式做了,但是最后又有了问题,下面是我的试验情况,以及这样会产生什么问题)
![](https://img-blog.csdnimg.cn/20190907181151382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NDY4MTY5,size_16,color_FFFFFF,t_70)
jmeter-server.bat启动时的ip是虚拟机的ip。可以在本地开启虚拟机,在本事使用 ipconfig查一下:
![](https://img-blog.csdnimg.cn/20190907181332586.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NDY4MTY5,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20190907211235297.png)
上面本机Jmeter-server.bat;启动显示的ip地址。本机jmeter.properties里设置的remote_hosts的ip址要与Jmeter-server.bat启动显示的ip地址一样。不要按照上面那样去禁用网络设配器的虚拟机适配器。如果禁用了网络设配器的虚拟机适配器,本机Jmeter-server.bat启动时它就会用无线网络的ip地址,那样你再把jmeter.properties里的remote_hosts,设置为无线网络的ip地址,那样agent(虚拟机中代理机)机就会响应请求、数据,而界面也会弹出错误,如下图:
禁用网络设配器的虚拟机适配器,再配置本地jmeter.properties里的remote_hosts为无线网络的ip地址的后果:
![](https://img-blog.csdnimg.cn/20190907210456729.png)
那样你在本机用:telnet 192.168.61.128(虚拟机ip) 1099;
发现连接不上;
而当你把禁用的网络设配器的虚拟机适配器启动;再把本地jmeter.properties里的remote_hosts设置为本地meter-server.bat启动时的ip,就会发现:telnet 192.168.61.128(虚拟机ip) 1099 成功。这是自身实践的结果,因为禁用了网络设配器的虚拟机适配器,而去用无线网络的ip导致一直报上图 refused to host错误,再在去网络上找解决这个错误的方法,试了老半天没成功,最终还是启用禁用网络设配器的虚拟机适配器,使用虚拟机的ip才成功。这个是我自身的这错误的原因,希望大家对大家有借鉴作用。
补充:如果你在虚拟机发现telnet 169.254.202.187(本机中ipconfig出来虚拟机ip) 1099连接不同,可以对这个虚拟机适配器进行关闭,使用另外的ip尝试(一般总有一个能够连接上)
8、Jmeter分布式运行时报该错误时(用过):Error in NonGUIDriver java.lang.RuntimeException:Following remote engines could not be configured/或者 Error in NonGUIDriver java.lang.RuntimeException: Could not find the configured时
在做了个负载测试跑半个小时候,再次编辑线程数保存,重新启动分布式运行时报如下错误:
![](https://img2020.cnblogs.com/blog/1307482/202112/1307482-20211202113834574-1241222958.png)
解决方法: 重启一下拒绝连接的那台执行机,然后再重新启动jmeter server.bat,即可。(用过-可以)
9、jmeter分布式报错,Error in rconfigure() method java.rmi.ConnectException: Connection refused to ho st
slave机器:Linux(4台)
准备压力机过程中,为方便省事,只配置了一台,其余3台是从这一台克隆过来的
执行分布式压测,返回如下error:
Error in rconfigure() method java.rmi.ConnectException: Connection refused to ho
st: 192.168.0.105; nested exception is:
java.net.ConnectException: Connection refused: connect
st: 192.168.0.105; nested exception is:
java.net.ConnectException: Connection refused: connect
查看jmeter-server启动命令,发现slave机器使用的ip是克隆源ip
![](https://img2020.cnblogs.com/blog/1307482/202112/1307482-20211202114716709-984593322.png)
解决方法:slave机器上,bin目录下修改jmeter-server,改为slave机器ip(用过)
![](https://img2020.cnblogs.com/blog/1307482/202112/1307482-20211202114707798-1714632439.png)
11、刚跑完负载测试时,改变线程数再次跑分布式运行时,会报如下错误:
![](https://img2020.cnblogs.com/blog/1307482/202112/1307482-20211202154557315-1482472103.png)
解决方法:将执行机与控制机的jmeter server.bat关闭重启即可,因跑完负载测试时,jmeter server.bat运行只有开始没有结束
![](https://img2020.cnblogs.com/blog/1307482/202112/1307482-20211202155026123-1902162261.png)