亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述使用locust测试MQTT协议相关的知识,希望能为你提供帮助。
一、安装locust
1.首先你本机需要安装python,因为locust是基于python环境,本次python的版本是3.9.2
文章图片
2.使用pip3 命令安装locust,提示了Successfully 就代表安装成功
pip3 install locust
文章图片
# 查看版本
locust --version
文章图片
二、编写python代码
1.本次压测是使用本机安装的apache-activemq-5.15.9当作MQTT服务器
from locust import User, TaskSet, events, task, between
import paho.mqtt.client as mqtt
import time
import random
COUNTClient = 0
#broker_address="broker.mqttdashboard.com"
broker_address="127.0.0.1"#服务器ip地址,实际压测要根据mqtt的实际ip进行修改
REQUEST_TYPE = \'MQTT\'
PUBLISH_TIMEOUT = 10000 #超时时间def fire_locust_success(**kwargs):
events.request_success.fire(**kwargs)def increment():
global COUNTClient
COUNTClient = COUNTClient+1def time_delta(t1, t2):
return int((t2 - t1)*1000)class Message(object):
def __init__(self, type, qos, topic, payload, start_time, timeout, name):
self.type = type,
self.qos = qos,
self.topic = topic
self.payload = payload
self.start_time = start_time
self.timeout = timeout
self.name = nameclass PublishTask(TaskSet):
def on_start(self):
self.client.connect(host=broker_address, port=1883, keepalive=60)
self.client.disconnect()@task(1)
def task_pub(self):
self.client.reconnect()
self.client.loop_start()
self.start_time = time.time()
topic = "jmeter相关技术交流"#主题名称,可根据需要进行修改
payload = "Device - " + str(self.client._client_id)#定义设备名称,可以按需更改
count = random.randint(0,9)
print(\'----执行随机数---{}\'.format(count))if count % 2 == 0:payload =\'{"ctrl":{"mac":"60A423FFFE5E0589","endpoint":1,"OnOff":1, "ack":"You are Done"}}\'
else:
payload =\'{"ctrl":{"mac":"60A423FFFE5E0589","endpoint":1,"OnOff":0, "ack":"You are Done"}}\'
MQTTMessageInfo = self.client.publish(topic,payload,qos=0, retain=False)
pub_mid = MQTTMessageInfo.mid
print("Mid = " + str(pub_mid))#用来在pycharm输出模拟的设备数
self.client.pubmessage[pub_mid] = Message(
REQUEST_TYPE, 0, topic, payload, self.start_time, PUBLISH_TIMEOUT, str(self.client._client_id)
)
MQTTMessageInfo.wait_for_publish()
self.client.disconnect()
self.client.loop_stop()
time.sleep(5)wait_time = between(0.5, 10)class MQTTLocust(User):
tasks = {PublishTask}def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)increment()
client_name = "Device - " + str(COUNTClient)
self.client = mqtt.Client(client_name)
self.client.on_connect = self.on_connect
self.client.on_disconnect = self.on_disconnect
self.client.on_publish = self.on_publish
self.client.pubmessage= {}def on_connect(client, userdata, flags, rc, props=None):
fire_locust_success(
request_type=REQUEST_TYPE,
name=\'connect\',
response_time=0,
response_length=0
)def on_disconnect(client, userdata,rc,props=None):
print("Disconnected result code "+str(rc))def on_publish(self, client, userdata, mid):
end_time = time.time()
message = client.pubmessage.pop(mid, None)
total_time =time_delta(message.start_time, end_time)
fire_locust_success(
request_type=REQUEST_TYPE,
name=str(self.client._client_id),
response_time=total_time,
response_length=len(message.payload)
)
三、启动locust
1.在你的python脚本目录执行如下命令:
locust -f program_backups.py --host=127.0.0.1
2.命令解释 program_backups.py是你编写的python脚本文件名称,host是对应你的mqtt服务器ip,本次是在pycharm的命令行执行该命令,
文章图片
3.你也可以直接在cmd下执行
文章图片
4.命令行提示 Starting Locust,代表执行成功
文章图片
四、执行压测
1.在浏览器输入http://localhost:8089/ ,进入locust压测页面 Number of users代表要压测的用户数,Spawn rate 代表每秒加载的用户数,Host是你的mqtt服务器ip 点击Start swarming开始压测
文章图片
2.Statistics显示每个用户的请求数、响应时间等指标,Charts通过图表展示每秒请求数(RPS),响应时间,用户数 Failures显示报错数,Download Data压测报告
文章图片
3.Locust界面不支持压测场景的设置,所以需要自己进行手动更改,比如压测完20用户,需要模拟100用户,就需要点击New test进入用户设置界面,修改完成,点击start swarming即可
文章图片
文章图片
4.最后贴一张实际工作过程中的压测结果,将并发数递度增至10、20、30时,当并发达20时,网关长时间无响应,再进一步增至30,网关完全无响应,得出网关的性能瓶颈在设备数为300、并发20达到拐点(本次是对网关进行压测)。
文章图片
? ?如果文章对你有帮助,欢迎关注本人公众号,公众号与本平台文章同步,方便大家查阅,本人会持续推出与测试有关的文章,与大家分享测试技术,每一篇原创文章都是用心编写,杜绝抄袭复制
QQ技术交流群:加群请输入验证信息 51cto
??????????????
文章图片
微信二维码关注公众号:
????????????
文章图片
关注之后,回复资源下载,即可获取本人共享的各种资源下载地:
【使用locust测试MQTT协议】
文章图片
推荐阅读
- Redis高可用篇(Cluster集群能支持的数据量有多大())
- 系统监控平台部署第二节--zabbix安装时序数据库和数据迁移
- HarmonyOS Sample 之 Bluetooth 传统蓝牙的使用
- 搭建FastDFS分布式集群通过Nginx+Lua+GraphicsMagick实现动态压缩图片
- Windows Server 2016部署MDT服务器----测试映像部署
- 测试开发之前端篇-CSS层叠式样式表
- 9.13-9.19上周精彩回顾
- Java技术指南「并发编程专题」Fork/Join框架基本使用和原理探究(原理及源码篇)
- 基于微信小程序的疫苗预约系统 疫苗小程序毕业设计课题选题 毕设项目作品 毕业设计论文