4.9 KiB
4.9 KiB
使用 JMeter 做简单的压测
Date: 2022/05/12 09:10
ZhouXY
需求
- 模拟:模拟生产者往 ActiveMQ 中发消息
- 并发:每 5 分钟发 15000 条数据
- 持续时长:持续 2 个小时
- 消息格式:消息内容为 JSON 数据,包括
dev_code
(设备号)、time
(当前时间)、dev_name (设备名称)- dev_code 从 100 个字符串中随机选择
- time 为当前时间的字符串,格式为
yyyy-MM-dd HH:mm:ss.SSS
- dev_name 为
DEV_NAME
加上递增的整数
步骤
- 打开 JMeter,有一个默认为空的测试计划 Test Plan,修改其名称,如:ActiveMQ 压测 Demo
- 在测试计划中创建一个线程组
- 在线程组中创建事务控制器
- 在事务控制器中一次创建 计数器、BeanShell 取样器、JMS Publisher
- 在 JMS Publisher 中创建一个
Precise Throughput Timer
,即准确的吞吐量定时器。
线程组和定时器
线程组和定时器控制并发量和持续时间。
由于 JMeter 创建线程是不间断的,所以需要定时器。这里使用 Precise Throughput Timer 可以比较好地控制。
按照要求,测试结束时,应发送了 360000 条数据,实际测试可能会多几百条,误差还是相对较少的。
线程组
- 线程属性的
线程数
填 500,Ramp-Up时间(秒)
填 10,表示 10 秒内创建 500 个线程。我一开始直接填 300 秒(5 分钟)创建 15000 个线程,结果发送一段时间后,就会出现部分数据发送失败,暂时不知道原因。请根据自己的需要调整。 - 循环次数勾选
永远
- 勾选下面的
调度器
选项,持续时间(秒)
填7200
,表示 2 个小时
定时器
- 目标吞吐量:15000
- 吞吐量周期:300
- 测试持续时间:7200
- 其它保持不变即可
计数器
由于 dev_name 中需要一个递增的整数,所以我们设置了计数器,最小值我设置为 1,递增为 1,引用名称为 num
。
这样,JMS Publisher 中的内容就可以以 ${num}
的形式使用该计数器的值。
BeanShell 取样器
BeanShell 取样器可以使用 Java 的写法生成数据,然后放到“变量”中,供其它取样器使用。dev_code 的值是从 100 个字符串中随机选择,BeanShell 取样器要做的就是从 100 和字符串中随机选择一个,放到变量 dev_code
中。脚本如下所示:
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 Factory:org.apache.activemq.jndi.ActiveMQInitialContextFactory
- Provider URL:填写 Active MQ 的 URL,如:tcp://localhost:61616
- Use Authorization:勾选 Use Authorization 并填写 用户 和 密码
- Connection Factory:ConnectionFactory
- Destination
- 如果是 Topic,则为
dynamicTopics/${TopicName}
,如dynamicTopics/topic.dev.info
- 如果是 Queue,则为
dynamicQueues/${QueueName}
,如dynamicQueues/topic.dev.info
- 如果是 Topic,则为
- 消息内容
{ "dev_code": "${devCode}", "dev_name": "DEV_NAME${num}", "time": "${__time(yyyy-MM-dd HH:mm:ss.SSS,)}" }
监听器
监听器可以对数据发送的数据进行统计,可以在该线程组下添加需要的监听器。