Skip to content

压测插件

This content is not available in your language yet.

bench-plugin 是一款通用的 MQTT 压测插件,可用于测试任意 MQTT Broker(如 EMQX、Mosquitto、ActiveMQ 等),支持 发布压测订阅压测 两种场景,帮助开发者评估 MQTT broker 的性能表现。

  • 发布压测:模拟大量客户端同时向 MQTT broker 发布消息,测试 broker 的消息接收和处理能力
  • 订阅压测:模拟大量订阅者订阅主题,同时可选启动发布者向这些主题发布消息,测试 broker 的消息分发能力
  • 实时输出 TPS(每秒事务数)统计数据
  • 支持灵活的压测参数配置

bench-plugin 支持三种压测模式,适用于不同的测试需求:

场景一:进程内压测(自测模式)

Section titled “场景一:进程内压测(自测模式)”
graph LR
    subgraph smart-mqtt 进程
        A[压测插件] -->|发布/订阅| B[Broker]
    end
    
    style A fill:#e1f5fe
    style B fill:#e8f5e8

说明:smart-mqtt broker 和插件处于同一个进程中,即自己压测自己。

  • 优点:架构简单,部署方便
  • 缺点:存在资源竞争,会对测试结果造成波动,无法测出极限能力
  • 适用场景:快速验证功能、简单的性能摸底

场景二:单节点压测(横向对比)

Section titled “场景二:单节点压测(横向对比)”
graph LR
    subgraph 压测机
        A[smart-mqtt<br/>压测插件]
    end
    
    subgraph 被测机
        B[Broker<br/>EMQX/Mosquitto/smart-mqtt]
    end
    
    A -->|MQTT| B
    
    style A fill:#e1f5fe
    style B fill:#fff3e0

说明:分开部署,smart-mqtt 启动压测插件对其他节点的 broker 进行压测。这些 broker 可以是 smart-mqtt,也可以是其他类型的 broker(如 EMQX、Mosquitto、ActiveMQ 等)。

  • 优点:数据更准确,无资源竞争干扰
  • 适用场景:各 broker 产品的横向性能对比、单节点性能评估
graph TB
    subgraph 压测机
        A[smart-mqtt<br/>压测插件]
    end
    
    subgraph Broker集群
        B[Load Balancer] --> C[Broker 节点1]
        B --> D[Broker 节点2]
        B --> E[Broker 节点N]
    end
    
    A -->|MQTT| B
    
    style A fill:#e1f5fe
    style B fill:#fff3e0
    style C fill:#e8f5e8
    style D fill:#e8f5e8
    style E fill:#e8f5e8

说明:分开部署,被压测对象是一套完整的 Broker 集群,通常包含负载均衡器和多个 Broker 节点。

  • 优点:真实模拟生产环境,评估集群整体吞吐能力
  • 适用场景:集群性能评估、容量规划
场景部署方式准确性适用场景
进程内压测同一进程⭐⭐功能验证、快速摸底
单节点压测分开部署⭐⭐⭐⭐横向对比、单节点评估
集群压测分开部署⭐⭐⭐⭐⭐生产环境评估、容量规划
  • BenchPlugin:插件入口,负责初始化压测任务和调度
  • PluginConfig:压测插件配置,包含公共参数和场景特定参数
  • PublishConfig:发布压测配置
  • SubscribeConfig:订阅压测配置

plugin.yaml 中配置压测插件,支持以下参数:

参数类型默认值说明
scenarioStringpublish压测场景:publish=发布压测,subscribe=订阅压测
hostString127.0.0.1MQTT 服务器地址
portint1883MQTT 服务器端口
topicCountint128主题数量
qosint0QoS 等级:0=AtMostOnce,1=AtLeastOnce,2=ExactlyOnce
payloadSizeint1024消息负载大小(字节)
参数类型默认值说明
connectionsint1000发布者数量(并发连接数)
publishCountint1每次发布的消息数量
periodint1发布间隔(毫秒)
参数类型默认值说明
connectionsint1000订阅者数量(并发连接数)
publisherCountint1发布者数量,设为 0 表示不启动发布者
publishCountint1每次发布的消息数量
publishPeriodint1发布间隔(毫秒)

通过 smart-mqtt 后台管理控制台的插件管理功能,可以方便地进行压测场景的设置和启停。

  1. 登录管理控制台:访问 smart-mqtt 管理控制台(默认端口 18083),登录后台管理系统

  2. 进入插件管理:在左侧导航栏选择「插件管理」菜单,找到「压测插件」

  3. 配置压测参数

    • 点击插件的「配置」按钮
    • 根据压测需求设置参数(场景、连接数、payload 大小、QoS 等)
    • 保存配置
  4. 启动压测

    • 点击插件的「启动」按钮开始压测
    • 插件会自动加载配置并开始执行压测任务
  5. 查看压测数据

    • 在插件详情页或控制台日志中观察压测数据
    • 包括:total(消息总数)、TPS(每秒事务数)
  6. 停止压测

    • 点击插件的「停止」按钮结束压测
    • 插件会优雅关闭所有连接

以下是通过本压测插件对 smart-mqtt 进行压测的性能数据,供参考。

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

支持主流的 amd64 和 arm64 架构。

场景设计

  • MQTT Client 订阅者数量:2000
  • MQTT Client 发布者数量:10(每个连接每秒发布 100 条消息)
  • Topic 数量:128
  • 消息 payload 大小:128 字节
消息质量smart-mqtt某三方Broker
QoS01000W/s800W/s
QoS1540W/s400W/s
QoS2320W/s200W/s

场景设计

  • MQTT Client 发布者数量:2000(每个连接每秒发布 10000 条消息)
  • Topic 数量:128
  • 消息 payload 大小:128 字节
消息质量smart-mqtt某三方Broker
QoS0230W/s230W/s
QoS1100W/s100W/s
QoS263W/s63W/s

使用压测插件可以对第三方 MQTT Broker 进行横向对比测试。项目提供了 Docker Compose 配置文件,方便快速搭建测试环境。

graph LR
    subgraph 压测容器
        A[smart-mqtt<br/>压测插件]
    end
    
    subgraph 被测容器
        B[EMQX/Mosquitto/<br/>smart-mqtt]
    end
    
    A -->|MQTT:1883| B
    
    style A fill:#e1f5fe
    style B fill:#fff3e0

在项目根目录的 docker-compose.yml 中预置了测试环境:

networks:
mqtt-network:
driver: bridge
services:
# 压测端:运行 smart-mqtt 压测插件
smart-mqtt:
container_name: smart-mqtt
image: smartboot/smart-mqtt:latest
environment:
ENTERPRISE_ENABLE: true # 启用企业版特性
BROKER_MAXINFLIGHT: 256
ports:
- 18083:18083 # 管理控制台
- 1883:1883 # MQTT 端口
# 被测端:待测试的 MQTT Broker
mqtt-broker:
container_name: mqtt-broker
image: smartboot/smart-mqtt:latest
environment:
ENTERPRISE_ENABLE: false
BROKER_MAXINFLIGHT: 256

如需测试其他 Broker(如 EMQX),修改 mqtt-broker 服务配置:

mqtt-broker:
container_name: emqx
hostname: mqtt-broker
image: emqx/emqx:5.0.24
networks:
mqtt-network: null
restart: always
security_opt:
- no-new-privileges:true
user: root:root
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "1"
  1. 启动测试环境
Terminal window
docker-compose up -d
  1. 配置压测插件

    • 访问 smart-mqtt 管理控制台:http://localhost:18083
    • 进入「插件管理」→「压测插件」→「配置」
    • 设置 hostmqtt-broker(被测容器名称)
    • 设置 port1883(被测容器 MQTT 端口)
  2. 启动压测

    • 点击「启动」按钮开始压测
    • 在控制台日志中查看实时 TPS 数据
  3. 查看结果

Terminal window
# 查看 smart-mqtt 容器日志
docker-compose logs -f smart-mqtt
  1. 停止测试
Terminal window
docker-compose down
  • 压测插件会在服务启动后延迟 5 秒开始执行,以便 broker 完全初始化
  • 压测过程中可以随时停止 smart-mqtt 服务,插件会优雅关闭所有连接
  • 建议在压测前确保服务器资源充足,避免因资源耗尽影响测试结果
  • 订阅压测场景下,publisherCount 设为 0 时只会创建订阅者连接,不会发送消息,适用于测试订阅性能
  • 高并发压测时注意调整系统文件描述符限制(ulimit)