blog/简单JMeter压测.md

110 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 使用 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,)}"
}
```
## 监听器
监听器可以对数据发送的数据进行统计,可以在该线程组下添加需要的监听器。