JMeter分布式测试
为什么要做分布式
JMeter 本身的局限性
由于 JMeter 是 基于java多线程应用,每个并发对应的都是一个线程,对本机 CPU 和内存的消耗较大,在需要模拟大量并发用户数时,单机很容易出现 JAVA 内存溢出的错误,导致测试脚本本身就有瓶颈
JVM 堆内存的局限性
Java 应用的 jvm 堆内存 heap 受压力机硬件限制,虽然我们可以调整堆内存大小,增加 Java 堆内存来满足测试的要求,但是单机无法支撑数以万计大并发,此时,需要多个压力机进行分布式压力测试,这样性能瓶颈就不会是我们的压力机了
分布式压测
JMeter 支持分布式压测,将需要模拟的大量并发用户数分发到多台压力机,使 JMeter 拥有更大的负载量,满足真实业务场景(高并发场景)
分布式的最终目的
- 确保压力机不会出现性能瓶颈
- 在后面进行性能分析时,不需要考虑压力机是否会导致性能瓶颈的主要原因之一
分布式原理
上图可完整解释,原理如下:
- Master 是控制机,Slaves 是多个压力机,Target 是被测系统
- 分布式测试中,Master 通过命令行将测试脚本分发给所有 Slave
- Slave 不需要启动 JMeter GUI,通过 CLI 模式执行测试
- Slave 执行完后,会把结果回传给 Master
- Master 收集所有 Slave 的结果并汇总成一个结果集
分布式专用术语认知
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 可修改任意端口,但不能已被占用的哦
修改 server.rmi.port 端口
和 server_port 保持一致即可, 默认是会帮你保持一致的
设置 server.rmi.ssl.disable
默认 false,代表需要认证 设置为 true,减少不必要的麻烦
启动 jmeter-server 服务
在 bin 目录
如果压力机是 linux 或 mac
./jmeter-server -Djava.rmi.server.hostname=Slave ip
如果是window
jmeter-server.bat -Djava.rmi.server.hostname=Slave ip
检查防火墙
- 检查防火墙是否被关闭,防火墙会影响脚本执行和测试结构收集
- 确认 server_port 的端口没有被占用以及需要对外开放,端口占用会导致压力机报错
控制机配置
修改 jmeter.properties
修改 remote_hosts
- 多个压力机之间用 “,” 隔开
- 不同压力机端口可以不一样,不需要全部都一致
- 如果控制机也测试则加 127.0.0.1:port ,然后修改 server_port 和 server.rmi.port (和压力机一样步骤)
设置 server.rmi.ssl.disable
设置 mode
- 用于查看分布式测试过程中,每个压力机的测试结果
- 若不启用,在运行过程中,控制器是无法实时看到压力机的结果
控制机运行分布式测试
GUI启动远程压力机
这里会显示所有 remote_hosts 添加的压力机
CLI模式启动远程压力机
jmeter -n -t test_tb_upload.jmx -l result/report.jtl -r
两种参数方式
-r, 指启动所有远程压力机
-R 127.0.0.1:1099, 指启动指定远程压力机,多个时用','分割
其它参数可参考–JMeter CLI模式篇 点击启动后,查看压力机
分布式测试结果图表
线程属性
10 个线程,持续运行 60s
活跃线程图表
这里可以看到有两条线,分别代表两个压力机的活跃线程数,不是按照接口来分线哦
TPS 图表
TPS图是统计所有salve执行机的结果,按接口来算
响应时间图表
响应时间也是统计所有salve执行机的结果,按接口来算
分布式测试中踩过的坑
问题一:缺少 rmi_keystore.jks
这就是上面有提到的证书问题
解决方式一
在 jmeter.properties 中设置 server.rmi.ssl.disable=true
解决方式二
在 bin 目录下,执行 create_create-rmi-keystore.sh 或create_create-rmi-keystore.bat
最后会在 bin 目录下生成一个证书
问题二:Slave多网卡问题
压力机启动jmeter-server时启动的ip非指定ip
原因:压力机存在多个网卡,多个ip,尝试修改jmeter-server文件中,如下图,但没有效果 RMI_HOST_DEF=-Djava.rmi.server.hostname=10.**.**.**
解决方法
使用命令执行
jmeter-server.bat -Djava.rmi.server.hostname=10.**.**.**
执行后jmeter-server正常启动
问题三:jmeter版本不一致
解决方法:
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掉。
|