JMeter学习笔记(四):分布式测试

JMeter分布式测试

为什么要做分布式

JMeter 本身的局限性

由于 JMeter 是 基于java多线程应用,每个并发对应的都是一个线程,对本机 CPU 和内存的消耗较大,在需要模拟大量并发用户数时,单机很容易出现 JAVA 内存溢出的错误,导致测试脚本本身就有瓶颈

JVM 堆内存的局限性

Java 应用的 jvm 堆内存 heap 受压力机硬件限制,虽然我们可以调整堆内存大小,增加 Java 堆内存来满足测试的要求,但是单机无法支撑数以万计大并发,此时,需要多个压力机进行分布式压力测试,这样性能瓶颈就不会是我们的压力机了

分布式压测

JMeter 支持分布式压测,将需要模拟的大量并发用户数分发到多台压力机,使 JMeter 拥有更大的负载量,满足真实业务场景(高并发场景)

分布式的最终目的
  • 确保压力机不会出现性能瓶颈
  • 在后面进行性能分析时,不需要考虑压力机是否会导致性能瓶颈的主要原因之一

分布式原理


上图可完整解释,原理如下:

  1. Master 是控制机,Slaves 是多个压力机,Target 是被测系统
  2. 分布式测试中,Master 通过命令行将测试脚本分发给所有 Slave
  3. Slave 不需要启动 JMeter GUI,通过 CLI 模式执行测试
  4. Slave 执行完后,会把结果回传给 Master
  5. Master 收集所有 Slave 的结果并汇总成一个结果集

分布式专用术语认知

image-20210917133338222

Master
  • 控制机-控制压力机执行脚本
Slave
  • 压力机
  • 运行 jmeter-server 的机器
  • 它从 master接收命令并将请求发送到目标系统
target
  • 需要进行压力测试的服务器

分布式注意事项

  • 如果并发较高,建议将控制机设置为只启动测试脚本和收集汇总测试结果
  • 分布式测试中,如果 1S 发送 100 个模拟请求,有 5 个压力机,那么需要将脚本的线程数设置为 20,否则模拟请求数会变成 500,和预期结果相差太大
  • 只需要修改控制机的脚本,启动压力机之后,压力机执行的就是最新的脚本

实现分布式的前提条件

控制机和压力机的 jmeter 要一致

具体体现在

  • jmeter 版本要一致
  • jdk 主版本要一致(1.7、1.8…)
  • jmeter 脚本中,参数文件要一致
  • jmeter 的插件要一致
  • 同一局域网,防火墙开放端口
配置文件一致

主要是路径要一致,Windows和Linux路径不一样,需要设置在jmeter安装bin目录下
参数化需要用到只能使用一次的参数时,即参数不能重复使用(如登录认证),需要将不同及其上的csv文件具体内容设置不能重复。

保证一致性方法

直接将控制机的 jmeter 压缩包移到每个压力机上解压使用

压力机配置

修改 jmeter.properties

在 bin 目录

修改 server_port 端口

默认1099
可修改任意端口,但不能已被占用的哦
image-20210918134222613

修改 server.rmi.port 端口

和 server_port 保持一致即可, 默认是会帮你保持一致的
image-20210918134249783

设置 server.rmi.ssl.disable

默认 false,代表需要认证
设置为 true,减少不必要的麻烦
image-20210918134306177

启动 jmeter-server 服务

在 bin 目录

如果压力机是 linux 或 mac
nohup ./jmeter-server -Djava.rmi.server.hostname=127.0.0.1 &
如果是window
jmeter-server.bat -Djava.rmi.server.hostname=Slave ip

检查防火墙

  • 检查防火墙是否被关闭,防火墙会影响脚本执行和测试结构收集
  • 确认 server_port 的端口没有被占用以及需要对外开放,端口占用会导致压力机报错

控制机配置

修改 jmeter.properties

修改 remote_hostsimage-20210918134353033
  • 多个压力机之间用 “,” 隔开
  • 不同压力机端口可以不一样,不需要全部都一致
  • 如果控制机也测试则加 127.0.0.1:port ,然后修改 server_port 和 server.rmi.port (和压力机一样步骤)
设置 server.rmi.ssl.disable

image-20210918134306177

设置 mode

image-20210918134528568

  • 用于查看分布式测试过程中,每个压力机的测试结果
  • 若不启用,在运行过程中,控制器是无法实时看到压力机的结果

控制机运行分布式测试

GUI启动远程压力机

image-20210918134704487
这里会显示所有 remote_hosts 添加的压力机

CLI模式启动远程压力机
nohup jmeter -n -t test_tb_upload.jmx -l result/report.jtl -r &

两种参数方式
-r, 指启动所有远程压力机
-R 127.0.0.1:1099, 指启动指定远程压力机,多个时用’,'分割

其它参数可参考–JMeter CLI模式篇
点击启动后,查看压力机
image-20210922155540049

分布式测试结果图表

线程属性

image-20210922113644100
10 个线程,持续运行 60s

活跃线程图表

image-20210922155757760
这里可以看到有两条线,分别代表两个压力机的活跃线程数,不是按照接口来分线哦

TPS 图表

image-20210922155816822
TPS图是统计所有salve执行机的结果,按接口来算

响应时间图表

image-20210922155920246
响应时间也是统计所有salve执行机的结果,按接口来算

分布式测试中踩过的坑

问题一:缺少 rmi_keystore.jks

这就是上面有提到的证书问题

解决方式一

在 jmeter.properties 中设置 server.rmi.ssl.disable=true

解决方式二

在 bin 目录下,执行 create_create-rmi-keystore.sh 或create_create-rmi-keystore.bat
image-20210922113058513
image-20210922113224172

image-20210922113136592
最后会在 bin 目录下生成一个证书

问题二:Slave多网卡问题

压力机启动jmeter-server时启动的ip非指定ip

image-20210916161921857

原因:压力机存在多个网卡,多个ip,尝试修改jmeter-server文件中,如下图,但没有效果
RMI_HOST_DEF=-Djava.rmi.server.hostname=10.**.**.**

解决方法

使用命令执行

jmeter-server.bat -Djava.rmi.server.hostname=10.**.**.**

执行后jmeter-server正常启动
11111111111

问题三:jmeter版本不一致

image-20210922112527622

解决方法:

JMeter版本或插件不一致会导致各种奇怪的问题,所以直接将Master上的JMeter压缩复制到各个Slave上

问题四:Master多网卡问题

Master存在多网卡时,Slave往Master传数据时会报错,显示的不是控制机的ip

在jmeter.bat文件中添加

set rmi_host=-Djava.rmi.server.hostname=10.80.58.**

然后在下面这一行后面添加%rmi_host%

if not defined JMETER_COMPLETE_ARGS (
    set ARGS=

当然,也可以把Master其它网卡disable掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrlijie00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值