jmeter 之性能分布式压测

背景:

当并发量达到一定数量时,单台测试设备不足以支撑,甚至会出现内存溢出等情况,解决这个问题就可用分布式测试,使用多台测试设备来达到更大的用户并发数。

原理:

1.一台设备作为调度机(master),其他设备作为执行机(slave)

2.执行时,调度机会将脚本发送到执行机,执行机收到脚本后开始执行。

3.执行结束后,执行机会将结果回传到调度机,调度机将收集所有执行机结果信息

环境配置:

1.调度机配置:

进入调度机jmeter/bin目录下(eg:apache-jmeter-5.1.1\bin),打开jmeter.properties文件修改remote_hosts配置,IP地址为执行机IP+端口号(默认1099,可修改),调度机也可作为执行机,即将调度机IP配在remote_hosts,多个执行机间以英文逗号分开(,)

#---------------------------------------------------------------------------

# Remote Hosts - comma delimited
remote_hosts=172.16.40.89:1099, 172.16.40.159:1099
#remote_hosts=localhost:1099,localhost:2010

# RMI port to be used by the server (must start rmiregistry with same port)
#server_port=1099

将  server.rmi.ssl.disable=false 改为true

#server.rmi.ssl.truststore.password=changeit
#
# Set this if you don't want to use SSL for RMI
server.rmi.ssl.disable=true
#---------------------------------------------------------------------------
#         Include Controller
#---------------------------------------------------------------------------

2.执行机配置:

进入执行机jmeter/bin目录下(eg:apache-jmeter-5.1.1\bin),打开jmeter.properties文件修改remote_hosts配置,IP地址为本机IP+端口号(默认1099,可修改)

#---------------------------------------------------------------------------

# Remote Hosts - comma delimited
remote_hosts=172.16.40.159:1099
#remote_hosts=localhost:1099,localhost:2010

# RMI port to be used by the server (must start rmiregistry with same port)

将  server.rmi.ssl.disable=false 改为true

#server.rmi.ssl.truststore.password=changeit
#
# Set this if you don't want to use SSL for RMI
server.rmi.ssl.disable=true
#---------------------------------------------------------------------------
#         Include Controller
#---------------------------------------------------------------------------

 GUI启动执行:

1.远程启动单个执行

调度机端进入bin目录中双击ApacheJMeter.jar文件/jmeter.bat文件,打开jmeter界面->运行->远程启动,此时可见设置的执行机->选中某个执行机启动

以上操作出现错误:

Connection refused to host: 172.16.40.159; nested exception is: 
    java.net.ConnectException: Connection refused: connect

错误原因:

执行机未启动jmeter-server

解决方法:

在对应的执行机中启动jmeter-server(linux 执行jmeter-server文件, windows 执行jmeter-server.bat文件),开启后在调度机上再次远程启动该执行机,并启动脚本

2.远程启动所有

调度机端进入bin目录中双击ApacheJMeter.jar文件,打开jmeter界面->运行->远程启动所有

以上操作出现错误:

Engine is busy - please try later

问题原因:

执行机已被启动,未停止,再次启动就会出错

解决方法:

远程关闭/停止所有执行机或者关闭已开启的执行机再次执行不会出现以上错误

Engine is busy - please try later 问题解决后,再次远程启动所有,此时出现错误:(只要出现以下问题就是服务器之间没有连通)
Error in rconfigure() method java.rmi.ConnectException: Connection refused to host: 172.16.40.159; nested exception is:
java.net.ConnectException: Connection refused: connect   

问题原因:

vm中docker 机子ip 端口只对外网开放了1099.当启动如下命令去启动执行机,会每次跳不同的端口,所以没有办法启动执行机.需要指定端口

.\jmeter-server -Djava.rmi.server.hostname=172.16.40.159 (win10系统用.\)

解决方法:

进入执行机jmeter/bin目录下(eg:apache-jmeter-5.1.1\bin),打开jmeter.properties文件修改remote_hosts配置如下:

# RMI port to be used by the server (must start rmiregistry with same port)
server_port=1099

# To change the default port (1099) used to access the server:
#server.rmi.port=1234
server.rmi.port=1099

# To use a specific port for the JMeter server engine, define
# the following property before starting the server:
#server.rmi.localport=4000
server.rmi.localport=1099

配置后此时执行机重启jmeter-server,调度机重启jmeter再次远程启动所有

 

 当脚本中存在读取外部参数化文件(csv),远程启动所有,未报错,但执行机未执行脚本,查看log显示

2022-05-12 14:28:43,191 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, 172.16.40.159:1099)
2022-05-12 14:28:43,215 INFO o.a.j.e.ClientJMeterEngine: sent test to 172.16.40.89:1099 basedir='.'
2022-05-12 14:28:43,215 INFO o.a.j.e.ClientJMeterEngine: Sending properties {}
2022-05-12 14:28:43,218 INFO o.a.j.e.ClientJMeterEngine: sent run command to 172.16.40.89:1099
2022-05-12 14:28:43,218 INFO o.a.j.e.DistributedRunner: Remote engines have been started
2022-05-12 14:28:43,221 INFO o.a.j.g.u.JMeterMenuBar: setRunning(true, 172.16.40.89:1099)
2022-05-12 14:28:43,254 INFO o.a.j.g.u.JMeterMenuBar: setRunning(false, 172.16.40.89:1099)
2022-05-12 14:28:43,328 INFO o.a.j.g.u.JMeterMenuBar: setRunning(false, 172.16.40.159:1099)

原因:

当脚本中存在读取外部参数化文件(csv,txt),未将外部文件上传到执行机

解决办法:

a.不涉及跨平台:

将脚本中需要用到的外部文件都上传到执行机jmeter下的bin目录中(涉及到分布式压测时,csv配置路径一般都设置为相对路径)

文件上传到执行机后再次启动所有:

b.涉及跨平台:

查看jmeter属性:测试计划->添加->非测试元件->属性显示

属性列表:

查看system属性:user.dir,file.separator

file.separator
user.dir

linux查看属性步骤如上

windows、linux系统的user.dir,file.separator是不一样的,此时可通过函数助手中 __P读取不同平台、不同 Jmeter 安装路径,自动获取 Jmeter 运行路径,然后通过拼接方式配置csv文件读取路径${__P(user.dir,)}${__P(file.separator,)}webadmin.csv,配置OK后,外部文件只需要上传到执行机的jmeter/bin目录下(linux、windows适用)

配置后再次运行

 命令启动执行:

windows

jmeter -n -t D:\API\性能调优.jmx -r -l result.jtl   # 启动所有执行机
jmeter -n -t D:\API\性能调优.jmx -r 172.16.40.159 -l result.jtl  # 启动指定执行机
jmeter -n -t D:\API\性能调优.jmx -r -l result1.jtl -e -o test   # 启动所有执行机,并生成报告    

 

 

 

 









posted @ 2022-05-20 18:28  **绵绵羊**  阅读(611)  评论(0编辑  收藏  举报