JMeter分布式测试
JMeter分布式测试
1.JMeter分布式测试概念
什么是分布式测试
分布式测试是指通过局域网和internet,把分布于不同地点、独立完成特定功能的测试计算机连接起来,以达到测试资源共享、分散操作、集中管理、协同工作、负载均衡、测试过程监控等目的的计算机网络测试。
即:由多台电脑共同完成一个测试计划的执行,我们称这种测试的方式为分布式测试。换句话说,也就是一个人干不了,就多叫几个人一起干。
为什么要使用分布式测试
在工作中使用JMeter做大并发压力测试的场景下,需要模拟成百上千的用户并发,这样使用单台机器模拟所有的并发用户就有些力不从心。
因为单机受限内存、CPU、网络IO等,会出现被服务器压力还没有上去,但是执行压测的服务器已经由于模拟的压力太大而宕机了。
为了让JMeter工具能够提供更强大的负载能力,JMeter提供了多台机器同时产生负载的机制,也就是我们所说的分布式的执行方式。
即:JMeter的集群模式可以让我们将多台机器联合起来一起产生负载,从而弥补单台机器负载生成能力不足的问题。
JMeter自身的局限性总结:
- 由于一台电脑的CPU、内存有限、无法满足更高的测试要求。一台压力机中的JMeter,默认最大支持1000左右的并发用户数(线程数),再大的话,容易造成卡顿、无响应等情况。
- 由于JMeter是Java应用,对CPU和内存的消耗较大,在需要模拟大量并发用户数时,单机很容易出现Java内存溢出的错误,导致测试脚本本身就有瓶颈。
JMeter分布式测试原理
- 一台电脑作为控制机(Controller、master),其它电脑做为执行机(Agent、slave)。
- JMeter脚本执行时,控制机会把脚本发送到每台执行机上,执行机拿到脚本后就开始执行。
- 在执行机中执行脚本时,不需要启动JMeter工具界面,可以理解它是通过命令行模式执行的。
- 执行完成后,执行机会把结果回传给控制机,控制机会收集所有执行机的信息并汇总。
JMeter分布式测试架构图如下:
说明:
假设我们的测试计划会产生100个threads,我们使用8台机器进行分布式测试的时候,一共会产生100*8=800的负载。
2.JMeter分布式测试前提条件
所有机器,包括master和slave机器:
运行相同版本的JMeter。
使用相同版本的Java环境,即JDK。
所有机器都要在一个网格中。即:同一局域网中,也就是同一网段中。
有基于SSL的RMI的有效密钥库,或者禁用SSL。(本文举例中都是采取的禁用SSL)
即:在jmeter.properties配置文件中,配置server.rmi.ssl.disable=true。
关闭防火墙,尤其是Linux系统。
提示:
- Agent机器上可以不放JMeter的脚本,但如果有用到测试数据,就必须把测试数据放到Agent机器上去。
- Controller和Agent机器上最好装有相同版本的JDK和JMeter,并配置好环境变量。
3.JMeter实现分布式测试
环境说明:
准备四台电脑:
两台Windows系统的电脑:192.168.1.101、192.168.1.102
两台Linux系统电脑:192.168.1.103、192.168.1.104
Java环境:JDK1.8
JMeter版本:5.4.1
提示:
- 设定192.168.1.101为控制机(Controller、master)。
- 设置192.168.1.102、192.168.1.103、192.168.1.104为执行机(Agent、slave)。
在执行机中的配置
修改JMeter的bin目录中jmeter.properties文件。
1
2
3
4remote_hosts=127.0.0.1
server_port=1099
#禁用ssl
server.rmi.ssl.disable=true如下图所示:
提示:Linux系统中,在VIM编辑使用末行命令/,可以搜索目录文本的位置。(后面不再重复说明了)
三台执行机都进行如上的配置:
- 192.168.1.102:remote_hosts:127.0.0.1、server_port:1099
- 192.168.1.103: remote_hosts: 127.0.0.1、server_port:1099
- 192.168.1.104:remote_hosts: 127.0.0.1、server_port:1099
在控制机中的配置
修改JMeter的bin目录中jmeter.properties文件。
1
2
3
4#配置slaves机器的ip和端口
remote_hosts=192.168.1.102:1099,192.168.1.103:1099,192.168.1.104:1099
#禁用ssl
server.rmi.ssl.disable=true如下图所示:
提示:不同压力和端口可以不一样,不需要全部都一致。
如果控制机也需要作为测试机,配置如下:
1
2
3
4
5
6#配置slaves机器的ip和端口
remote_hosts=192.168.1.102:1099,192.168.1.103:1099,192.168.104:1099,192.168.1.101:1099
#向外暴露的端口
server_port=1099
#禁用ssl
server.rmi.ssl.disable=true启动执行机中的JMeter服务
我们在所有需要执行JMeter脚本的执行机上,启动jmeter-server服务。
进入到JMeter安装路径的bin目录中,执行命令:./jmerter-serve或双击jmeter-server.bat。
如下图所示:
提示:
- 在Windows系统中,是直接启动bin\jmeter-server.bat文件。
- 如果控制机也需要执行测试,同样也需要启动jmeter-server服务。
执行机中执行测试计划会出现Starting the test 和 Finished the test字样。
如下所示:
在控制机中执行JMeter测试脚本
因为我的控制机是一台Windows系统的电脑,我们可以使用GUI的方式进行演示。
我们先来使用一台远程执行机执行我们的本地脚本。
在JMeter中操作:运行->远程启动->选择一个远程执行机,则控制机中的脚本,会自动传送到远程执行机上进行运行。
如下图所示:
提示:这里会显示所有remote_hosts添加的压力机
运行脚本完成,控制机中收到的结果如下所示:
我们使用三台远程执行机执行我们的本地脚本。
在JMeter中操作:运行->远程启动所有,如下图所示:
脚本运行完成,控制机会收到的结果如下所示:
我们可以看到,每台执行机执行50次请求,三台执行机就能生成出150个模拟用户的访问压力。
说明:
分布测试总样本数=线程数x循环次数x执行机总数。
样本计数逻辑为:执行机slave执行的测试脚本是由调度机master分发的,故每台执行机执行的测试脚本都是相同的。
故而性能测试总样本数=测试脚本样本数x执行机总数,而测试脚本样本数为线程数x循环次数
以上就是使用JMeter分布式测试的全部过程。
4.Linux系统作为控制机
步骤和windows系统作为控制机操作基本相同。
我们需要先把编辑好的JMeter测试脚本,上传到Linux系统的控制机中。
说明:
- 因为我们配置了JMeter的环境变量,所以可以在任何目录中执行JMeter命令。
- JMeter测试脚本可以放在任何目录中来执行,不一定非要放在bin目录中。
- JMeter测试脚本只需要上传到控制机中,其他执行机上可以不放JMeter脚本,因为控制机启动后会拷贝本地的.jmx脚本文件,到远程执行机上。
- 但如果有用到测试数据,就必须把测试数据文件放到slave机器上去。
我把JMeter测试脚本上传到tmp目录中,主要是找个空闲的目录进行演示。
- /tmp/jmeterscript:存放JMeter脚本。
- /tmp/jmeterlog:存放JMeter日志。
- /tmp/result:存放测试运行结果。
- /tmp/resultforHTML: 存放HTML图形化报表。
在任何路径下执行如下命令即可:
1 | jmeter -n -t/tmp/jmeterscript/CLI_test.jmx -r -l /tmp/result/result.jtl -j /tmp/jmeterlog/test.log -e -o /tmp/resultforHTML/tableResult |
提示:
我开始使用三台Linux虚拟机进行操作,使用其中一台做控制机,其他两台做执行机。然后我用Windows系统做控制机,起三台Linux虚拟机做执行机,发现都不成功。
这是因为都是在我本地的一台机器上启动的这些测试机。因为网卡的识别问题,造成启动jmeter-server服务识别的控制机的网卡不对,控制机始终收不到执行机返回的结果。
而我在另一台电脑中启动所有的执行机,把控制机的虚拟网卡禁用掉,就能成功进行分布式测试。
不过不用担心,在实际的工作中,公司会有很多的云服务器,不太会遇到这样的情况。
这里就简单的描述一下,后面我会总结,我学习JMeter分布式测试中,遇到的所有的坑。
5.分布式测试总结
对分布式测试而言,测试过程是一种对流程控制要求很高的活动,因此系统需要适时地获得全局状态以正确地指导流程。其次在测试过程中,系统要能够方便地监视和操控测试过程。因此分布式测试系统适合采用集中式的分布式策略,即,由一台中心计算机控制若干台受控计算机的执行,整个测试过程和资源管理由中心来完成,它掌握整个分布式测试环境的状态,从而发出控制命令。
提示:
在进行分布式测试的时候,尽量使用Linux系统,因为测试结果的影响更少。
最后在配一个JMeter分布式测试架构图:
本篇文章来源于:博主繁花似锦