blog/简单JMeter压测.md

4.9 KiB
Raw Blame History

使用 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_nameDEV_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. 线程属性的线程数填 500Ramp-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 中。脚本如下所示:

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
  • 消息内容
    {
      "dev_code": "${devCode}",
      "dev_name": "DEV_NAME${num}",
      "time": "${__time(yyyy-MM-dd HH:mm:ss.SSS,)}"
    }
    

监听器

监听器可以对数据发送的数据进行统计,可以在该线程组下添加需要的监听器。