blog/简单JMeter压测.md

110 lines
4.9 KiB
Markdown
Raw Normal View History

2023-01-04 13:49:09 +08:00
# 使用 JMeter 做简单的压测
Date: 2022/05/12 09:10
ZhouXY
---
## 需求
1. 模拟:模拟生产者往 ActiveMQ 中发消息
2. 并发:每 5 分钟发 15000 条数据
3. 持续时长:持续 2 个小时
4. 消息格式:消息内容为 JSON 数据,包括 **`dev_code`** *(设备号)*、**`time`** *(当前时间)*、**dev_name** *(设备名称)*
- **dev_code** 从 100 个字符串中随机选择
- **time** 为当前时间的字符串,格式为 `yyyy-MM-dd HH:mm:ss.SSS`
- **dev_name** 为 `DEV_NAME` 加上递增的整数
## 步骤
1. 打开 JMeter有一个默认为空的测试计划 Test Plan修改其名称ActiveMQ 压测 Demo
2. 在测试计划中创建一个线程组
3. 在线程组中创建事务控制器
4. 在事务控制器中一次创建 **计数器**、**BeanShell 取样器**、**JMS Publisher**
5. 在 JMS Publisher 中创建一个 `Precise Throughput Timer`,即准确的吞吐量定时器。
## 线程组和定时器
线程组和定时器控制并发量和持续时间。
由于 JMeter 创建线程是不间断的,所以需要定时器。这里使用 Precise Throughput Timer 可以比较好地控制。
按照要求,测试结束时,应发送了 360000 条数据,实际测试可能会多几百条,误差还是相对较少的。
### 线程组
1. 线程属性的`线程数`填 500`Ramp-Up时间`填 10表示 **10 秒内创建 500 个线程**。我一开始直接填 300 秒5 分钟)创建 15000 个线程,结果发送一段时间后,就会出现部分数据发送失败,暂时不知道原因。请根据自己的需要调整。
2. 循环次数勾选 `永远`
3. 勾选下面的`调度器`选项,`持续时间(秒)`填 `7200`,表示 2 个小时
### 定时器
1. 目标吞吐量15000
2. 吞吐量周期300
3. 测试持续时间7200
4. 其它保持不变即可
## 计数器
由于 **dev_name** 中需要一个递增的整数,所以我们设置了计数器,最小值我设置为 1递增为 1引用名称为 `num`
这样JMS Publisher 中的内容就可以以 `${num}` 的形式使用该计数器的值。
## BeanShell 取样器
BeanShell 取样器可以使用 Java 的写法生成数据,然后放到“变量”中,供其它取样器使用。**dev_code** 的值是从 100 个字符串中随机选择BeanShell 取样器要做的就是从 100 和字符串中随机选择一个,放到变量 `dev_code` 中。脚本如下所示:
```java
import java.util.Random;
String[] devCodes = {
"A1p8wu9iBt", "A9VzXBaFIJ", "ASKb08oVnr", "Ae2ifNTN9b", "AgpzQ8aNbt",
"Bh5CBlP4ot", "Bo7RE8Sl8Y", "BrxCJ85ETL", "BL3HF89URd", "Bs1Ij2LAHj",
"CzLJmZrfkM", "C4rmU81HCC", "CyH5il1W39", "Cn8D2aiVV8", "CX8nbIsB50",
"D4oGv91ePj", "DGxYsqTcXK", "DUyFsC5Drx", "DR6MpJJaDj", "DuH37e1jZ8",
"EYvQ6sJvhU", "E8FgaOGEc9", "Ey4Wfjj1gs", "EKC1oKFvmb", "Ec2vHlrBb4",
"FWN6vGoqnQ", "F8BbYS9l0I", "FzWxDecBOe", "FnjId6wkyw", "FJXFE9fcVg",
"GbhQiY6RIf", "GBHdz2QifF", "Gxy9Nr7SE6", "GyUtw6nbte", "GogX2WX36O",
"HxagCSigXb", "HWMhH7jWar", "H4sGFmP1Oi", "HIlL8LgwpQ", "HxB1KIPmU9",
"I57qZxE3FU", "I6ghZSfeQS", "IE0o7RF4jD", "IahpQHwBeq", "IaIAIEPHeA",
"JBfTrmIMAM", "JuZPRFKLqv", "J514XwwJRh", "JIXav0i4sF", "JhOW0JqoTX",
"KcWpYmJ5O6", "KDIpmm8IM8", "KIM10uv0HC", "KNtsRI9nWS", "KiuaJ6axgB",
"LxV7kYcam8", "LPxgMsC9v0", "LHT2biCDUg", "LKTGKDRh7q", "LY7XgPcpHi",
"MFV3F7iZTW", "MUEBypwmK9", "MRKFcfPHQt", "MVHMA2icrK", "MGivy5wulf",
"NzuMjdPtns", "N3bGBHlVnn", "NQc9WVJcO2", "N9sV5JrjYw", "NrdFpm8SLc",
"OncgB1XRyt", "OkvCZNPBft", "O2xfZ2UNTy", "OHYm0xpbsN", "ORNSHzP1TG",
"PSvqG70T2e", "PvZL2OpA1T", "PpqjV93fl8", "PAPtqDahqS", "Py6pWjF7hi",
"QyrG0AYK0T", "QOVP9hKuIN", "QNT02cVBU2", "QjyWUmVCpl", "QF5vNIMKxM",
"RrZZAxOSJJ", "RCfXSwKY1i", "R0XGiHreU4", "RmC7iQvIuU", "RdtzQ7T9cK",
"SM9dzy31hS", "SI9SykQ8Ex", "SCx73KMyOT", "SKXwIrPJdr", "SlVDhvrb4d",
"T4qXJdmRD9", "TKiDzobds3", "T8TRTHiQ42", "TKvTq2p7Dg", "TPYxtA1wz4"
};
Random random = new Random();
vars.put("devCode", devCodes[random.nextInt(devCodes.length)]);
```
这样JMS Publisher 中的内容就可以以 `${devCode}` 的形式使用随机选取的字符串。
## JMS Publisher
- Initial Context Factoryorg.apache.activemq.jndi.ActiveMQInitialContextFactory
- Provider URL填写 Active MQ 的 URLtcp://localhost:61616
- Use Authorization勾选 Use Authorization 并填写 用户 和 密码
- Connection FactoryConnectionFactory
- Destination
- 如果是 Topic则为 `dynamicTopics/${TopicName}`,如 `dynamicTopics/topic.dev.info`
- 如果是 Queue则为 `dynamicQueues/${QueueName}`,如 `dynamicQueues/topic.dev.info`
- 消息内容
```json
{
"dev_code": "${devCode}",
"dev_name": "DEV_NAME${num}",
"time": "${__time(yyyy-MM-dd HH:mm:ss.SSS,)}"
}
```
## 监听器
监听器可以对数据发送的数据进行统计,可以在该线程组下添加需要的监听器。