linux环境下Jmeter分布式环境搭建及执行(供参考)
1、GUI、非GUI(即命令行)的区别
Jmeter有两种运行方式,GUI、非GUI。
GUI:在Windows系统上运行,图形化界面,方便收集测试结果,但是消耗压力机资源较高,容易卡死,有并发限制。
非GUI:在Linux系统上通过命令行运行,无图形化界面,不方便收集测试结果,但是占用压力机资源较低,可以支持较大并发。
2、GUI遇到的问题
1)图形化界面消耗更多资源,如CPU和内存,容易使压力机达到瓶颈,从而影响测试结果。
Jmeter是基于java程序运行的,在windows上使用Jmeter进行性能测试时,非常耗费客户机的CPU和内存,如果并发数稍微大一点(比如100、1000...并发),单台电脑的配置经常无法支持,很容易卡死,即使不卡死也会使电脑运行很慢,导致我们没办法进行其它操作。
2)图形化界面不支持大型的负载测试和性能测试,并发较大时,jmeter会崩溃。
综上,jmeter压测时需要使用非GUI即命令行执行,减少资源消耗。
3、非GUI单点遇到的问题
在使用Jmeter进行性能测试时,在不进行调优的情况下,并发用户数很难突破1000;Jmeter进行调优后,单台并发数可以突破2000。但是如果要支持更大的并发,例如:5000、20000并发,则需要使用Jmeter提供的分布式测试的功能。
二、Jmeter分布式执行原理
2台16核32G linux环境Centos7.6(代理机),1台8核16Glinux环境(控制机),linux系统版本由jmeter版本兼容环境决定,本次使用的系统是Cenos7.6,Jmeter版本5.2.1,JDK版本1.8。
3台机器分别各自安装好jdk、jmeter。
四、Jmeter分布式搭建
1)官网下载文件
进入安装包目录执行解压命令:tar -xzvf jdk-8u91-linux-x64.tar.gz
3)linux环境变量配置
执行命令java -version,显示java版本信息则表示安装成功
2、Jmeter安装
下载链接:http://jmeter.apache.org/download_jmeter.cgi 或 链接: https://pan.baidu.com/s/1mQ1y8yh0pEU8_tzyxv7zww 提取码: 33ts
本次使用的安装包:apache-jmeter-5.2.1.tgz
2)上传文件并解压
执行命令vi /etc/profile,在文件底部增加如下内容,并保存:
export JMETER_HOME=/opt/apache-jmeter-5.2.1
export CLASSPATH=${JMETER_HOME}/lib/ext/ApacheJMeter_core.jar:${JMETER_HOME}/lib/jorphan.jar:${CLASSPATH}
export PATH=${JMETER_HOME}/bin:${PATH}
执行命令source /etc/profile ,生效文件修改。
4)验证jmeter安装是否成功
如果压测启动和服务配置都是root权限,需要在linux环境下给jmeter和jmeter-server授权,命令:chmod 777 jmeter
3、jmeter控制机配置文件修改
文件路径:jmeter安装路径的bin目录下
修改点1:文件中remote_hosts值,原文件是remote_hosts=127.0.0.1,修改成remote_hosts=134.175.16.161:1099,193.112.110.50:1099,此处IP是代理机IP地址(腾讯云机器此处写内网IP)和端口按默认值则填写1099或直接写IP即可。
修改点2:文件中server.rmi.ssl.disable值,原文件是#server.rmi.ssl.disable=false,修改成server.rmi.ssl.disable=true。若未修改则启动执行时会报错:java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory),如下所示:
2)内存修改
slave执行机与控制机配置文件修改基本一样,不同之处在于控制机需要修改jmeter.properties文件中remote_hosts的值,添加各个执行机IP地址。
1)修改jmeter.properties
3)slave执行机端优化:linux端口数量调整
分布式执行出现报错”No route to host“时需要slave执行机关闭防火墙
查看防火墙状态(CentOS7.6需使用命令systemctl status firewalld)
service iptables status/systemctl status firewalld
关闭防火墙
systemctl stop firewalld
5、jmeter的slave执行机服务启动(两台都分别启动)
只需要上传压测脚本到控制机master服务器,节点机slave不需要上传,压测脚本自动回发到slaver执行机上;但是如果脚本中涉及从外部读取的csv文件,那该文件就需要上传到各个slaver执行机上。
注意:参数化文件路径若只写文件名称无具体路径时,linux环境下默认读取用户目录下的文件(例:登录用户是root,则是在root目录下),windows环境默认读取的是跟脚本同目录的路径。
7、jmeter控制机命令启动执行
单个压测机线程数配置<=1500,太多性能损耗较大,延时高。
1、分布式线程数设置
Jmeter单机可使用传参命令动态修改线程数,但在分布式时不起作用,此问题是Jmeter存在的缺陷。故分布式时,只能通过本机修改线程数后再上传执行。
Jmeter单机传参命令参考如下(脚本中需设置对应的线程参数):
jmeter -Jthreads1=4 -Jrampup=1 -Jduration=20 -n -t /opt/testplanHn/count.jmx -l /opt/testplanHn/result_count_new4.jtl -j /opt/testplanHn/result_count_new4.log
3、分布式的多台单点替代方法
Jmeter为了减少压力机负担,默认是不保存响应结果。需要做以下设置:
修改bin目录下的user.properties文件,追加配置:
jmeter.save.saveservice.output_format=xml
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.requestHeaders=true
jmeter.save.saveservice.url=true
jmeter.save.saveservice.responseHeaders=true
但是该配置添加后,将jtl转化成html格式报告出错(原因:转换成html格式需要jmeter.save.saveservice.output_format=csv,linux环境默认是该配置),出错信息如下:
Error in NonGUIDriver java.lang.IllegalArgumentException: Report generation requires csv output format, check 'jmeter.save.saveservice.output_format' property
An error occurred: Error in NonGUIDriver Report generation requires csv output format, check 'jmeter.save.saveservice.output_format' property
所以以上保存错误信息的方法不可行。
通过以上设置生成的jtl文件,在windows查看会出现乱码,需要修改本机windows机器Jmeter配置:修改jmeter.properties 中的sampleresult.default.encoding=UTF-8
5、分布式保存错误响应结果
1、windows版本jmeter内存修改
2)验证内存修改是否生效
运行文件 D:\Program Files\Java\jdk1.8.0_101\bin\jvisualvm.exe,查看本地Jmeter的信息,如下所示: