平时在使用Jmeter做压力测试的过程中,由于单机的并发能力有限,所以常常无法满足压力测试的需求。因此,Jmeter还提供了分布式的解决方案。本文是一次利用Jmeter分布式对业务系统登录接口做的压力测试的实践记录。按照惯例,在正式开始前,先简单介绍一下本文大纲:
集合点是使用Jmeter进行压力测试中一个绕不开的话题。
集合点通俗地理解就是,例如要模拟100个并发用户,集合点会将这100个线程集结完毕后,统一释放,同时对系统进行施压。Jmeter中可以通过同步定时器 Synchronizing Timer 来完成:
同步定时器中”模拟用户组的数量“与线程组的线程数量的关系:
例如数量都是5,那么运行测试,Jmeter会等到5个用户同时准备好后,并发发起请求;
① 未设置超时时间
例如:模拟用户为5,线程数量为8,那么在运行Jmeter后,Jmeter会先同时发起5个请求,剩下3个用户不足集合点的数量5,由于又没有设置超时时间,因此达不到集合点的数量要求,Jmeter就会一直处于等待状态;
② 已设置超时时间
例如:模拟用户为5,线程数量为8,超时时间设置为3000(以毫秒为单位,即3秒)
那么在运行Jmeter后,Jmeter会先同时发起5个请求,由于剩下3个用户不足集合点要求的数量5,因此会超时等待3秒钟,在3秒钟后再同时发起剩下的3个用户的请求,共8个用户;
① 未设置超时时间
例如:模拟用户为8,线程数量为5,超时时间为0
由于设置的模拟用户数量为8,即集合点数量为8,而线程组的总用户数只有5,因此达不到集合点数量要求,且又没有设置超时时间,所以Jmeter会一直处于等待状态,不会发起任何请求,如下图所示:
② 已设置超时时间
例如:模拟用户为5,线程数量为8,超时时间设置为3000(以毫秒为单位,即3秒)
由于设置的模拟用户数量为8,即集合点数量为8,而线程组的总用户数只有5,因此达不到集合点数量要求,但是设置了超时时间为3秒,所以Jmeter会在3秒后,同时发起5个(用户)请求,如下图所示:
参数 | 作用 |
---|---|
-n | 表示在命令行模式下运行 JMeter |
-t | 指定脚本文件 |
-R | 指定从节点(agent)执行测试,多个ip用逗号隔开 |
-r | 表示启动全部agent |
-f | 表示每次都会清空前一次的执行结果,写入新的结果 |
-l | 生成测试结果文件,默认以 jtl 结尾 |
-e | 生成测试报告 |
-o | 指定生成测告的位置,必须为空 |
-g | 指定已存在的jtl结尾的测试文件生成报告 |
常见用法:
-
- ./jmeter.bat -n -t test.jmx # 以命令行方式运行test.jmx脚本
-
- ./jmeter.bar -n -t test.jmx -l test.jtl # 以命令行方式运行test.jmx脚本,并生成测试结果文件test.jtl
-
- ./jmeter.bar -n -t test.jmx -f -l test.jtl -e -o report # 以命令行方式运行test.jmx脚本,每次生成结果前先清空test.jtl,同时在report目录下生成测试报告
-
- ./jmeter.bar -n -t test.jmx -l test.jtl -R 192.168.1.122 # 指定远程主机192.168.1.122执行测试
主机 | IP地址 |
---|---|
Master主节点(Windows) | 192.168.1.131 |
Slave从节点-1(Linux) | 192.168.1.121 |
Slave从节点-2(Linux) | 192.168.1.122 |
Slave从节点-3(Linux) | 192.168.1.123 |
注意事项:
① 主节点负责将测试任务、测试脚本下发给各个从节点;
② 从节点接收到测试任务后,开始驱动各自环境上的Jmeter执行测试任务、模拟并发请求;
③ 从节点执行完成后会将测试结果回传给主节点;
④ 最后主节点将各个从节点的收集回来的测试结果进行展示;
① 编辑主节点jmeter.properties配置文件
② 主节点启动jmeter-server服务
Windows环境下直接点击运行Jmeter的bin目录下的jmeter-server.bat即可,启动成功会出现如下提示:
① 将Jmeter压缩包上传到各个从节点并解压
从节点均为Linux环境,解压命令为:
unzip apache-jmeter.zip
② 修改jmeter.properties配置文件
③ 启动jmeter-server服务
chmod -R +x bin # jmeter-server、jmeter文件都需要执行权限,可以简单粗暴使用chmod -R参数赋予整个bin目录执行权限
./jmeter-server # 启动jmeter-server服务
启动成功会出现如下提示:
可以通过Jmeter工具-运行-远程启动,选择一个从节点;也可以使用命令行-R参数指定一个从节点运行:
如下图所示,Starting...表示主节点已将任务下发到指定的从节点,从节点开始执行测试任务
1)启动远程主机,提示“Engine is busy - please try later”
原因:本地或者远程负载机,未正常关闭
解决:杀掉进程重新启动(可以观察主节点及从节点的jmeter-server日志,如果只有Starting,没有Finished,那么大概率是这台机器出现了问题)
2)主节点发起测试后未接收到结果数据
如:执行成功后,察看结果树无数据,主节点及从节点也没有任何报错
原因:测试脚本中有参数化,远程节点上参数化csv文件跟本地测试中设置的目录不一致,或从节点上缺少csv文件
解决:将csv文件分别上传一份到各个从节点,csv文件最好设置相对路径,不要设置绝对路径,将csv文件存放在bin目录下
3)Jmeter启动从节点运行测试报错“connection refused”
原因:从节点未启动jmeter-server服务
解决:各个从节点均启动jmeter-server服务
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!