效能調優
# 前言
本文檔介紹金蝶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)