IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> JMeter学习笔记(四):分布式测试 -> 正文阅读

[开发测试]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

./jmeter-server -Djava.rmi.server.hostname=Slave ip

如果是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模式启动远程压力机

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掉。

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:54:53  更:2021-09-24 10:56:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:36:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码