分布式性能测试
单机能产生的虚拟用户数有限,当需要进行高并发场景时,一台机器的能力有限。因此就会用到分布式,由多台电脑一起产生虚拟用户并向服务器发起请求,实现高并发场景。
分布式的原理:
由一台主控机器控制多台子机器,主控机器会分发指令给子机器,子机器收到指令后向服务器发起请求,服务器收到请求后返回给子机器,子机器再返回给主控机器。
记住,主机器发的是指令,并不是脚本!脚本根本不需要上传到子机器上。
主控机器本身也可产生压力,也可不产生。
前提条件
1、主机和子机器jmeter版本要一致
2、jdk要主版本一致
3、jmeter脚本中csv文件要一致(特别是文件路径)
4、jmeter的插件要一致
5、同一局域网,防火墙可以开放端口
保持一致性的方法:直接压缩本地的jmeter包。然后上传到子机器并解压
另外,进行分布式的时候如果使用WiFi连接,有可能会收不到数据,数据会在网络上阻塞。
操作步骤
配置子机器
1、上传jmeter包并解压
unzip apache-jmeter-5.2.1.zip
2、由于上传上来的文件只有读写权限,没有执行权限,因此要加上执行权限。
chmod +x -R 文件名
3、修改子机器的配置文件(不管子机器是Windows、linux、mac,修改方式都是一样的)
# 编辑配置文件
vim jmeter.properties
修改server_port,定义子机器的端口
server_port=XXXX
#2、修改认证端口server.rmi.port,要与server_port一致
server.rmi.port=XXXX
#3、修改server.rmi.ssl.disable为true,为true就是禁用SSL证书,为false为启用SSL证书
server.rmi.ssl.disable=true
server.rmi.port是认证端口,指的是HTTP/HTTPS这种传输协议的认证,局域网其实可以不设置,但如果要设置的话就还需要设置证书等操作。
4、启动jmeter服务
# 启动子机器
# hostname是子机器的名称,一般是输入IP,主机器将通过hostname找到这台子机
./jmeter-server -Djava.rmi.server.hostname=192.168.83.130
这里可以留意一下输出信息
Aug 16, 2022 6:05:44 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.83.130:43757](local),objID:[-1c3f0f73:173f6bb6b8c:-7fff, 3333993770953996796]]]
在配置文件中虽然已经设置了server_port,这是固定的端口,一般使用这个端口就能找到子机,但在输出信息里面其他它也生成了一个动态端口,endpoint:192.168.83.130:43757 这里面的43757是动态产生的端口,每次启动都会变化,不过一般不用这个端口。
拓展知识
Windows、mac电脑也能做子机器,子机器对系统没要求执行方式也是一样的,只不过Windows下执行的是.bat文件
jmeter-server.bat -Djava.rmi.server.hostname=192.168.83.130
另外如果出现证书错误的提示,可以执行bin/create-rmi-keystore.sh,它可以生成一个证书
主机器配置
由于主机器是Windows,因此以下都是Windows上的操作
1、也是编辑bin\jmeter.properties
# 1、修改remote_hosts,填入子机器的IP及端口,多个时用","分隔
remote_hosts=XXX.XXX.XXX.XXX:XXXX
# 2、修改server.rmi.ssl.disable为true,禁用证书
server.rmi.ssl.disable=true
# 3、修改mode=Standard,使用标准模式,开启之后,才能实时看到助攻机器的数据
mode=Standard
# 备注
#remote_hosts可以配置多个,用“,”分隔.如:192.168.0.1:1234,192.168.0.2:1234
#如果主机器也要产生压力,那么remote_hosts可以加上127.0.0.1:XXXX
2、运行jmeter, 菜单栏的运行->远程启动
拓展知识
#1、如果启动远程机器时出现timeout,先看看子机器的jmeter服务有没有启动,然后再看看防火墙有没有开放端口
#防火墙开放端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
#开放之后要重新加载防火墙
firewall-cmd --reload
#或者重启防火墙
systemctl restart firewalld.service
#查看端口的开放状态
firewall-cmd --query-port=8080/tcp
#查看防火墙所有开放的端口
firewall-cmd --list-port
#不推荐使用的方法,停掉防火墙
systemctl stop firewalld
#2、jmeter脚本并不需要传到子机器中,主机器是会自动分发脚本给子机器
#3、主机器要产生压力,也一样要先启动java服务,执行方法与子机器启动服务是一样的
无界面执行分布式
方法一:
jmeter -n -t 脚本路径.jmx -l report.jtl -H 分布式机器IP -P 分布式机器端口
方法二:
jmeter -n -t 脚本路径.jmx -l report.jtl -r 分布式机器IP:端口,分布式机器2IP:端口
方法三:
# 方法三只写-r意思就是配置文件中写了多少台子机器,就运行多少台
jmeter -n -t 脚本路径.jmx -l report.jtl -r
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
机会,需要我们去寻找。让我们鼓起勇气,运用智慧,把握我们生命的每一分钟,创造出一个更加精彩的人生。
提出问题远比解决问题难,因为解决问题是技术性的,而提出问题则是革命性的。我们身边并不缺少财富,而是缺少发现财富的眼光!
经验固然重要,但观念的正确与否起决定作用。经验只能做好现成的东西,观念则决定长远的方向。思维观念高于工作经验。