性能优化手册
# 前言
本文档介绍金蝶Apusic分布式消息队列for MQTT(Apusic Distributed Message Queue,简称:ADMQ for MQTT)的性能优化最佳实践,帮助用户充分利用系统性能。
# 适用对象
本文档适用于IT信息化业务负责人、研发经理、软件项目经理、软件架构师、运维工程师。
# 相关文档
了解更多ADMQ for MQTT产品相关的信息,请参阅以下ADMQ for MQTT产品手册文档集:
| 序号 | 手册文档 | 说明 |
|---|---|---|
| 1 | 金蝶Apusic分布式消息队列for MQTT 快速使用手册 | 简单介绍了如何快速上手使用ADMQ for MQTT 。 |
| 2 | 金蝶Apusic分布式消息队列for MQTT 安装手册 | 详细介绍如何在各操作系统上安装ADMQ for MQTT,以及ADMQ for MQTT服务启停等操作。 |
| 3 | 金蝶Apusic分布式消息队列for MQTT 消息引擎用户手册 | 详细介绍 ADMQ for MQTT 消息引擎相关功能的使用、配置、管理及配套工具的使用方法。 |
| 4 | 金蝶Apusic分布式消息队列for MQTT 管控台用户手册 | 详细介绍ADMQ for MQTT管控台相关功能的使用和操作说明。 |
| 5 | 金蝶Apusic分布式消息队列for MQTT 开发手册 | 详细介绍基于各开发语言进行ADMQ for MQTT客户端应用开发的说明。 |
| 6 | 金蝶Apusic分布式消息队列for MQTT 迁移手册 | 详细介绍从MQTT Broker迁移到ADMQ for MQTT的说明。 |
| 7 | 金蝶Apusic分布式消息队列for MQTT 运维手册 | 详细介绍ADMQ for MQTT的监控、运维、安全加固等运维说明。 |
| 8 | 金蝶Apusic分布式消息队列for MQTT 性能优化手册 | 详细介绍ADMQ for MQTT性能调优的说明。 |
# 技术支持
ADMQ for MQTT产品提供全面的技术支持服务,您可以通过以下方式获得技术支持:
- 网址:www.apusic.com
- 电话:400-855-5800
- 邮箱:support@apusic.com
- 金蝶云社区:https://vip.kingdee.com/?productId=73&productLineId=14&lang=zh-CN
您在取得技术支持时,请提供如下信息:
您的姓名
公司信息与联系方式
操作系统及其版本
产品版本号
出现异常及错误的日志、截图等详细信息
# 系统层面优化
# 操作系统优化
# 文件描述符
# 查看当前限制
ulimit -n
# 修改限制(/etc/security/limits.conf)
* soft nofile 2097152
* hard nofile 2097152
1
2
3
4
5
6
2
3
4
5
6
# 内核参数
# /etc/sysctl.conf
# TCP 连接优化
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 网络缓冲区
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
# 端口范围
net.ipv4.ip_local_port_range = 1024 65535
# 内存优化
vm.swappiness = 10
# 应用配置
sysctl -p
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 磁盘优化
| 优化项 | 建议 |
|---|---|
| 文件系统 | 使用 XFS 文件系统 |
| 挂载选项 | noatime,nodiratime |
| 磁盘调度 | 使用 noop 或 deadline |
| SSD 优化 | 启用 TRIM |
# 查看磁盘调度算法
cat /sys/block/sda/queue/scheduler
# 设置为 deadline
echo deadline > /sys/block/sda/queue/scheduler
# 挂载选项(/etc/fstab)
/dev/sda1 /var/lib/admq-mqtt xfs noatime,nodiratime 0 0
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# MQTT 配置优化
# 连接管理
| 参数 | 说明 | 默认值 | 推荐值 |
|---|---|---|---|
| max_connections | 每个监听器最大连接数 | 1024000 | 根据硬件调整 |
| max_conn_rate | 每秒最大连接速率 | 1000 | 根据硬件调整 |
| zone.external.idle_timeout | 空闲连接超时 | 7200s | 根据业务调整 |
| zone.external.keepalive_backoff | Keepalive 检测倍数 | 0.75 | 0.75 |
# etc/admq-mqtt.conf
listeners.tcp.default {
bind = "0.0.0.0:1883"
max_connections = 1024000
}
1
2
3
4
5
2
3
4
5
# 会话配置
| 参数 | 说明 | 默认值 | 推荐值 |
|---|---|---|---|
| session_expiry_interval | 会话过期时间 | 2h | 根据业务调整 |
| max_subscriptions | 单个客户端最大订阅数 | infinity | 1000-10000 |
| max_inflight | 飞行窗口大小 | 32 | 64-256 |
| max_mqueue_len | 消息队列长度 | 1000 | 根据内存调整 |
| mqueue_store_qos0 | 是否存储 QoS 0 消息 | true | false(大并发时) |
# etc/admq-mqtt.conf
zone.external {
session_expiry_interval = 2h
max_subscriptions = 10000
max_inflight = 128
max_mqueue_len = 10000
mqueue_store_qos0 = false
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 报文大小
| 参数 | 说明 | 默认值 | 推荐值 |
|---|---|---|---|
| max_packet_size | 最大报文大小 | 1MB | 根据业务调整 |
| max_clientid_len | 最大 ClientID 长度 | 65535 | 1024 |
| max_topic_levels | 最大主题层级 | 128 | 7-10 |
| max_topic_alias | 最大主题别名数 | 65535 | 65535 |
# etc/admq-mqtt.conf
zone.external {
max_packet_size = 1MB
max_clientid_len = 1024
max_topic_levels = 10
max_topic_alias = 65535
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# JVM 配置
# bin/admq-mqtt
JAVA_OPTS="-server -Xms4g -Xmx4g -Xmn2g"
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:G1HeapRegionSize=16m"
JAVA_OPTS="$JAVA_OPTS -XX:MaxDirectMemorySize=2g"
1
2
3
4
2
3
4
# Erlang VM 优化
# vm.args
+P 2097152 # 最大 Erlang 进程数
+Q 2097152 # 最大 Erlang Port 数
+A 64 # 异步线程池大小
1
2
3
4
2
3
4
# 客户端优化
# QoS 选择
| 场景 | 推荐 QoS |
|---|---|
| 高频 Telemetry 数据,可容忍丢失 | QoS 0 |
| 一般业务消息 | QoS 1 |
| 关键控制命令 | QoS 2 |
# 连接管理
- 使用连接池:避免频繁创建和关闭连接
- 合理设置 Keepalive:避免过短的心跳间隔
- 启用自动重连:防止网络异常导致连接中断
- 控制订阅数量:单个客户端订阅过多主题会影响性能
# 消息大小
- 控制 Payload 大小:避免发送过大消息
- 批量发送:减少网络往返次数
- 避免频繁重连:长连接优于短连接
# 集群优化
# 节点部署策略
| 部署策略 | 说明 | 适用场景 |
|---|---|---|
| 同机房部署 | 所有节点在同一机房 | 低延迟、高吞吐 |
| 跨机房部署 | 节点分布在不同机房 | 高可用、容灾 |
| 异构部署 | 不同配置节点混合 | 成本优化 |
# 负载均衡
- DNS 轮询:通过 DNS 轮询分发客户端连接
- 硬件负载均衡:使用 LVS、F5 等硬件负载均衡器
- 软件负载均衡:使用 Nginx、HAProxy 等软件负载均衡器
# 会话持久化
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 内存会话 | 会话数据存储在内存 | 高性能、低可靠性 |
| 持久化会话 | 会话数据持久化到磁盘 | 高可靠性 |
# 监控与调优
# 性能指标
| 指标 | 健康范围 | 优化建议 |
|---|---|---|
| CPU 使用率 | < 70% | 扩容或优化业务逻辑 |
| 内存使用率 | < 80% | 增加内存或优化配置 |
| 磁盘使用率 | < 80% | 扩容或清理日志 |
| 连接数 | < max_connections | 扩容或优化连接使用 |
| 消息吞吐 | 根据硬件配置 | 优化生产者或扩容 |
| 消息延迟 | < 10ms | 优化网络或消费者 |
| 慢订阅数 | < 100 | 优化消费逻辑 |
# 性能测试
# 使用 emqtt_bench 工具测试
./emqtt_bench conn -h localhost -p 1883 -c 10000 -i 10
# 参数说明
# -h: Broker 地址
# -p: 端口
# -c: 并发连接数
# -i: 连接间隔(毫秒)
# 发布测试
./emqtt_bench pub -h localhost -p 1883 -c 1000 -I 10 -t "sensor/%c/temperature" -s 100
# 订阅测试
./emqtt_bench sub -h localhost -p 1883 -c 1000 -t "sensor/+/temperature"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 瓶颈分析
- CPU 瓶颈:加密解密、消息路由、规则引擎处理
- 内存瓶颈:大量连接、会话数据、消息队列
- 磁盘瓶颈:持久化消息、日志写入
- 网络瓶颈:大量小消息、大 Payload、网络延迟
# 常见问题优化
# 连接数不足优化
- 增加文件描述符限制
- 调整 max_connections 参数
- 扩容集群节点
- 使用负载均衡分发连接
# 消息延迟优化
- 优化网络配置
- 减少 QoS 2 使用
- 优化消费者处理逻辑
- 使用共享订阅均衡负载
# 内存不足优化
- 增加物理内存
- 减少会话过期时间
- 限制消息队列长度
- 关闭 QoS 0 消息存储
# 消息堆积优化
- 增加消费者数量
- 优化消费者处理逻辑
- 使用共享订阅
- 检查 ACL 规则是否阻止消费
# 性能优化检查清单
# 系统层面
- [ ] 文件描述符限制已调整
- [ ] 内核参数已优化
- [ ] 磁盘使用 XFS 文件系统
- [ ] 网络参数已优化
- [ ] 系统资源充足(CPU、内存、磁盘)
# MQTT 配置
- [ ] max_connections 合理设置
- [ ] 会话过期时间合理设置
- [ ] 飞行窗口大小合理设置
- [ ] 消息队列长度合理设置
- [ ] 报文大小限制合理设置
- [ ] Erlang VM 参数已优化
# 客户端优化
- [ ] QoS 选择合适
- [ ] Keepalive 间隔合理
- [ ] 订阅数量合理控制
- [ ] 消息大小合理控制
- [ ] 使用长连接和自动重连
# 集群优化
- [ ] 节点部署策略合适
- [ ] 负载均衡已配置
- [ ] 集群规模满足业务需求
- [ ] 会话持久化策略合适
编辑页面 (opens new window)