当前版本:
- jmeter 5.6.3
- mysql 5.7.39
简介
JMeter 通过 Open Model Thread Group 来实现弹性模拟负载测试,它是5.4.1 版本中引入的一个实验性线程组。例如设置多个线程模式,再根据这些线程模式调整不同的并发数、暂停时间。由于Open Model Thread Group 是一个实验性线程组,可能会存在一些限制和不确定性。
文章目录如下
1. 下载插件
2. 插件用法
2.1. 界面描述
2.2. 线程设置方案
3. 测试步骤
3.1. 添加压测线程组
3.2. 设置JDBC配置
3.3. 构造简单业务
3.4. 配置监听器
3.5. 运行测试
4. 模拟双11业务
1. 下载插件
地址如下(下载2个包,一个用于弹性压测,一个用于增加性能监听器)
https://jmeter-plugins.org/downloads/old/
(注意:JMeter版本5.4.1以上)
将下载的两个zip包解压后,找到 JMeterPlugins-Standard.jar 和 JMeterPlugins-Extras.jar,放到 jmeter\lib\ext\ 下,重启 jmeter 生效。
2. 插件用法
2.1. 界面描述
添加线程组步骤:
- 右击测试计划 → 添加 → 线程(用户) → Open Model Thread Group
中文名称
界面说明
- rate(1/min):设置每分钟流量数。
- rate(60/min) 表示每分钟60个请求(换算每秒1个请求)
- rate(5/sec) 表示每秒钟5个请求。
- random_arrivals(10 min):设置测试时长。
- random_arrivals(1 min) 表示每个请求之间的到达时间在 1 分钟内是随机的。
- pause(1 min):每个线程模式启动之间的暂停时间。
- pause(1 min) 表示每个模式在启动后会等待 1 分钟,然后才会启动下一个模式。
- /* comment */:注释。
- Random seed:用于生成随机数的起始值(默认0)。
单位说明
sec :秒
min :分
hour:时
day :天
2.2. 线程设置方案
【方案一】简单模型:测试100个线程,持续30秒
rate(10/sec)
random_arrivals(30 sec)
【方案二】按阶段压测:不同阶段压测不同线程数
rate(100/sec) random_arrivals(10 min)
pause(2 min)
rate(200/sec) random_arrivals(10 min)
3. 测试步骤
jmeter 通过如下组件来构造高并发:
Open Model Thread Group # 模拟弹性压测
JDBC Connection Configuration # 配置数据库连接信息
JDBC Request # 构造业务
通过如下监听器来查看性能指标
聚合报告 # 查看整体性能指标
jp@gc - Response Times Over Time # 查看响应时间走势图表
jp@gc - Transactions per Second # 查看吞吐量走势图表
jp@gc - Active Threads Over Time # 查看线程数走势
3.1. 添加压测线程组
- 右击测试计划 → 添加 → 线程(用户) → Open Model Thread Group
需求:先模拟10个流量运行1分钟后休眠3秒,再模拟20个流量运行1分钟后休眠5秒,最后模拟10个流量运行2分钟
rate(10/sec) random_arrivals(1 min)
pause(3 sec)
rate(20/sec) random_arrivals(1 min)
pause(5sec)
rate(10/sec) random_arrivals(2 min)
3.2. 设置JDBC配置
- 右击测试计划 → 添加 → 配置元件 → JDBC Connection Configuration
"""MySQL"""
URL:jdbc:mysql://[IP]:[端口]/[数库名] # jdbc:mysql://localhost:3306/mysql
Driver:com.mysql.jdbc.Driver
"""Oracle"""
URL:jdbc:oracle:thin:@[IP]:[端口]:[数库名] #jdbc:oracle:thin:@localhost:1521:orcl
Driver:oracle.jdbc.OracleDriver
"""PostgreSQL"""
URL:jdbc:postgresql://[IP]:[端口]/[数库名] # jdbc:postgresql://localhost:5432/postgres
Driver:org.postgresql.Driver
3.3. 构造简单业务
- 右击线程组 → 添加 → 取样器 → JDBC Request
简单读语句(仅举例)
3.4. 配置监听器
- 右击线程组 → 添加 → 监听器 → 聚合报告
- 右击线程组 → 添加 → 监听器 → jp@gc - Response Times Over Time
- 右击线程组 → 添加 → 监听器 → jp@gc - Transactions per Second
- 右击线程组 → 添加 → 监听器 → jp@gc - Active Threads Over Time
所有基础配置如下:
3.5. 运行测试
点击启动即可
最终结果如下:
【线程数走势图】
【响应时间走势图】
【吞吐量走势图】
4. 模拟双11业务
举一个模拟双11的简单用例,需求如下(1天):
- 浏览商品:从早上到晚上最大流量设定100w。10点、12点、18点抢购活动,那么在这几个时间点流量达到最高峰。
- 加入购物车:模拟用户每浏览10件商品加入一个购物车。
- 提交订单:模拟用户在抢购活动时间段提交订单占购物车70%,平时占20%,直接提交订单占整个订单的10%。
- 查询订单:模拟用户在提交订单后会有50%几率查看订单。
- 查询其他信息:模拟一些复杂计算的查询。
我笔记本不支持大并发,这里举例子设定最大流量为100。总体设置如下:
举一个 "浏览商品" 的例子,其他业务根据需求配比
rate(${__Random(1,5,)}/sec) random_arrivals(6 hour) /* 00~06点 */
rate(${__Random(2,30,)}/sec) random_arrivals(1 hour) /* 06~07点 */
rate(${__Random(20,60,)}/sec) random_arrivals(1 hour) /* 07~08点 */
rate(${__Random(40,90,)}/sec) random_arrivals(1 hour) /* 08~09点 */
rate(${__Random(80,100,)}/sec) random_arrivals(1 hour) /* 09~10点 */
rate(${__Random(70,100,)}/sec) random_arrivals(1 hour) /* 10~11点 */
rate(${__Random(80,100,)}/sec) random_arrivals(1 hour) /* 11~12点 */
rate(${__Random(70,100,)}/sec) random_arrivals(1 hour) /* 12~13点 */
rate(${__Random(30,80,)}/sec) random_arrivals(1 hour) /* 13~14点 */
rate(${__Random(20,60,)}/sec) random_arrivals(2 hour) /* 14~16点 */
rate(${__Random(30,100,)}/sec) random_arrivals(2 hour) /* 16~18点 */
rate(${__Random(70,100,)}/sec) random_arrivals(1 hour) /* 18~19点 */
rate(${__Random(50,90,)}/sec) random_arrivals(2 hour) /* 19~21点 */
rate(${__Random(30,70,)}/sec) random_arrivals(2 hour) /* 21~23点 */
rate(${__Random(10,50,)}/sec) random_arrivals(1 hour) /* 23~24点 */
这里主要举个例子,仅测试24分钟。来看一下最终吞吐量走势
一般情况下0~6点只有很少部分用户会浏览商品、下单,从6点开始流量会持续增长,10点、12点会达到最高峰。下午用户吃饭、午觉,流量下跌。14点后开始持续增长,直到18点活动达到最高峰,后面持续下降。