跳转到内容

性能压测

很多用户比较关心 smart-mqtt 的性能表现,为了得出一个相对准确的结论。我们通过自研的压测工具分别对 smart-mqtt 和同类产品进行压测。

一台装有 Docker 的 Linux 服务器、Windows 或者 Macbook。

支持主流的 amd64 和 arm64 架构。

场景设计

  • MQTT Client 订阅者数量:2000
  • Topic 数量:128
  • 消息 payload 大小:128 字节
消息质量smart-mqttemqxbifromq
QoS0790W/s--
QoS1320W/s--
QoS2190W/s--

场景设计

  • MQTT Client 发布者数量:2000
  • Topic 数量:128
  • 消息 payload 大小:128 字节
消息质量smart-mqttemqxbifromq
QoS097W/s--
QoS163W/s--
QoS252W/s--

场景设计

  • Topic 订阅数:2 个
  • 消息 payload 大小:128 字节
连接量smart-mqttemqxbifromq
10万---
30万---
50万---
80万---
100万---

在 smart-mqtt 的仓库根目录下,我们提供了用于性能测试的 docker-compose.yml 文件。

在这个文件中包含了多款 MQTT Broker,对应的 docker 服务名皆为:mqtt-broker。当需要对某个 broker 进行测试时,只需移除其注释,将另外的同名服务注释掉便可(即同时刻只能存在一个服务名为 mqtt-broker 的 docker 容器)。

目前已支持的有:

  • smart-mqtt
  • emqx
  • BifroMQ

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

参数说明

参数名参数描述
hostMQTT Broker 地址,已针对压测对象配置完成,无需调整
portMQTT Broker 服务的端口号,默认: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

参数说明

参数名参数描述
hostMQTT Broker 地址,已针对压测对象配置完成,无需调整
portMQTT Broker 服务的端口号,默认:1883
connect压测客户端数量,默认:1000
payload压测消息的 payload 字节数,默认:128
topic压测发布的 Topic 数量,默认:128
count每个客户端每次发送的消息数量,默认:1
qos消息质量等级,默认:0
  1. 启动 Broker 和压测客户端
Terminal window
docker-compose up -d
  1. 查看压测结果
Terminal window
# 查看 smart-mqtt-bench 容器的日志
docker-compose logs -f smart-mqtt-bench
  1. 停止压测
Terminal window
docker-compose down

smart-mqtt-bench 是专门为 smart-mqtt 设计的压测工具,具有以下特点:

  • 轻量级:基于 Java 开发,无外部依赖
  • 高性能:采用异步 IO 模型,单机可模拟数万连接
  • 易用性:命令行参数配置,支持多种压测场景
  • 可扩展:开源代码,可根据需求定制
Terminal window
# 压测订阅性能
java -cp smart-mqtt-bench.jar \
-Dhost=localhost \
-Dport=1883 \
-Dconnect=1000 \
-Dtopic=128 \
-Dpublisher=10 \
-Dpayload=128 \
org.smartboot.bench.mqtt.Subscribe
# 压测发布性能
java -cp smart-mqtt-bench.jar \
-Dhost=localhost \
-Dport=1883 \
-Dconnect=1000 \
-Dtopic=128 \
-Dcount=10 \
-Dpayload=128 \
-Dqos=1 \
org.smartboot.bench.mqtt.Publish
# 压测连接性能
java -cp smart-mqtt-bench.jar \
-Dhost=localhost \
-Dport=1883 \
-Dconnect=100000 \
org.smartboot.bench.mqtt.Connect

如果需要更复杂的压测场景,可以直接使用 smart-mqtt-bench 的 Java API:

public class CustomBenchmark {
public static void main(String[] args) {
// 创建压测配置
BenchOptions options = new BenchOptions();
options.setHost("localhost");
options.setPort(1883);
options.setConnectCount(1000);
options.setTopicCount(128);
options.setPayloadSize(128);
options.setQos(1);
// 创建并启动压测
SubscribeBenchmark benchmark = new SubscribeBenchmark(options);
benchmark.start();
}
}