性能压测
很多用户比较关心 smart-mqtt 的性能表现,为了得出一个相对准确的结论。我们通过自研的压测工具分别对 smart-mqtt 和同类产品进行压测。
# 一、环境准备
一台装有 Docker 的 Linux服务器、Windows 或者 Macbook。
支持主流的 amd64 和 arm64 架构。
# 二、压测结果
# 场景一:消息订阅
场景设计:
- MQTT Client订阅者数量:2000
- Topic数量:128
- 消息payload大小:128字节
消息质量 | smart-mqtt | emqx | bifromq |
---|---|---|---|
QoS0 | 790W/s | - | - |
QoS1 | 320W/s | - | - |
QoS2 | 190W/s | - | - |
# 场景二:消息发布
场景设计:
- MQTT Client发布者数量:2000
- Topic数量:128
- 消息payload大小:128字节
消息质量 | smart-mqtt | emqx | bifromq |
---|---|---|---|
QoS0 | 97W/s | - | - |
QoS1 | 63W/s | - | - |
QoS2 | 52W/s | - | - |
# 场景三:海量连接
场景设计:
- Topic订阅数:2个
- 消息payload大小:128字节
连接量 | smart-mqtt | emqx | bifromq |
---|---|---|---|
10万 | - | - | - |
30万 | - | - | - |
50万 | - | - | - |
80万 | - | - | - |
100万 | - | - | - |
# 三、压测过程
在 smart-mqtt 的仓库根目录下,我们提供了用于性能测试的 docker-compose.yml (opens new window) 文件。
在这个文件中包含了多款 MQTT Broker,对应的 docker 服务名皆为:mqtt-broker。
当需要对某个 broker 进行测试时,只需移除其注释,将另外的同名服务注释掉便可(即同时刻只能存在一个服务名为 mqtt-broker
的docker容器)。
目前以支持的有:
- smart-mqtt
- emqx
- BifroMQ
# 2.1 压测场景
docker-compose.yml
中的 smart-mqtt-bench 是用于压测的客户端服务,需要针对不同的压测场景配置压测参数。
消息订阅
services: smart-mqtt-bench: #省略其他配置... command: java -cp smart-mqtt-bench.jar -Dhost=mqtt-broker -Dconnect=2000 -Dqos=2 -Dpublisher=10 -Dcount=1 -Dpayload=128 org.smartboot.bench.mqtt.Subscribe
1
2
3
4smart-mqtt-bench.command
参数说明:参数名 参数描述 host MQTT Broker地址,已针对压测对象配置完成,无需调整。 port MQTT Broekr服务的端口号,默认:1883,不推荐调整。 connect 压测客户端数量,默认:1000,可按需调整。 payload 压测消息的 payload 字节数,默认:128,可按需调整。 topic 压测订阅的Topic数量,默认:128,可按需调整。 publisher 负责生产消息的客户端数量,默认:1。 count 每个publisher周期内发送的消息数量,默认:1。 每秒中发送的最多消息数为:
publisher * count * 500
,所以connect
个订阅者产生订阅量理论值为:publisher * count * 500 * connect
。消息发布
services: smart-mqtt-bench: #省略其他配置... command: java -cp smart-mqtt-bench.jar -Dhost=mqtt-broker -Dconnect=2000 -Dqos=0 -Dcount=10 -Dpayload=128 org.smartboot.bench.mqtt.Publish
1
2
3
4smart-mqtt-bench.command
参数说明:参数名 参数描述 host MQTT Broker地址,已针对压测对象配置完成,无需调整。 port MQTT Broekr服务的端口号,默认:1883,不推荐调整。 connect 压测客户端数量,默认:1000,可按需调整。 payload 压测消息的 payload 字节数,默认:1024,可按需调整。 topic 压测订阅的Topic数量,默认:128,可按需调整。 count 每个publisher周期内发送的消息数量,默认:1。 每秒中发送的最多消息数为:
connect * count * 500
。
# 2.2 压测步骤
- 在
docker-compose.yml
文件中设置压测场景参数,移除待压测的broker注释。 - 打开终端切换至
docker-compose.yml
所在目录执行命令:docker compose up -d
- 执行命令观察日志:
docker compose logs -f
。 - 当压测数据稳定后,退出日志观察,执行
docker compose down
销毁压测环境。
# 四、常见问题解答
为什么自研压测工具?
早些时候也调研了一下市面上的MQTT压测工具,emqtt-bench
是个相对不错的选择。 但是由于该工具只提供了 amd64 的 Docker 镜像,而本人的常用开发电脑是 ARM 架构,所以不太适用。况且开发一款压测工具也并非难事,干脆自己写一个 Java 版的 MQTT 压测工具:
smart-mqtt-bench
。压测环境准备阶段需要多久?
smart-mqtt-bench会在启动10秒后开始执行压测。因为emqx容器在启动初期还处于不可用状态,经测试10秒之后可以执行压测。