# cloud-platform-mqtt **Repository Path**: chenqian1995/cloud-platform-mqtt ## Basic Information - **Project Name**: cloud-platform-mqtt - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-27 - **Last Updated**: 2026-05-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MQTT TLS 压测客户端 基于 JDK8 + SpringBoot 2.x + Eclipse Paho MQTT 1.2.5 开发的高性能 MQTT TLS 压测客户端,专为 16 核 32G 服务器优化,支持 60,000 个稳定 TLS 长连接。 ## 功能特性 - ✅ MQTT TLS v1.2 单向认证,使用 ssl:// 协议 - ✅ 支持 60,000 个并发长连接,每个客户端唯一 clientId - ✅ 每 10 秒自动上报 500 字节固定报文 - ✅ 分批创建连接(每 1000 个延迟 150ms),避免 TLS 握手风暴 - ✅ MemoryPersistence 内存持久化,最小化内存占用 - ✅ 自动重连、心跳保活、异常捕获 - ✅ 防止 OOM 和线程耗尽 - ✅ Prometheus 监控指标输出 ## 技术规格 | 项目 | 配置 | |------|------| | JDK 版本 | 1.8 | | Spring Boot | 2.7.18 | | Paho MQTT | 1.2.5 | | 目标连接数 | 60,000 | | 消息频率 | 每 10 秒 60,000 条 | | 消息大小 | 500 字节 | | 服务器规格 | 16 核 32GB | | JVM 堆内存 | 24GB | | GC 算法 | G1GC | ## 快速开始 ### 1. 环境准备 ```bash # 安装 JDK 8 sudo apt-get install openjdk-8-jdk # Ubuntu/Debian sudo yum install java-1.8.0-openjdk # CentOS/RHEL # 安装 Maven sudo apt-get install maven # Ubuntu/Debian sudo yum install maven # CentOS/RHEL # 验证安装 java -version mvn -version ``` ### 2. 系统优化 ```bash cd deploy # 运行系统调优脚本(需要 root 权限) sudo ./linux-sys-tuning.sh # 设置用户限制 sudo ./user-limits.sh # 重启服务器或重新登录使配置生效 sudo reboot ``` ### 3. 准备 TLS 证书 ```bash # 创建证书目录 mkdir -p /etc/mqtt-stress/certs # 放置 CA 证书(从 EMQX 服务器获取) cp ca.crt /etc/mqtt-stress/certs/ # 确保证书路径在配置文件中正确设置 ``` ### 4. 构建项目 ```bash cd /path/to/mqtt-tls-stress-client # 编译打包 mvn clean package -DskipTests # 构建产物 target/mqtt-tls-stress-client-1.0.0.jar ``` ### 5. 配置应用 编辑 `src/main/resources/application.yml`: ```yaml mqtt: broker-url: ssl://your-emqx-host:8883 # 修改为实际 Broker 地址 total-connections: 60000 tls: ca-cert-path: /etc/mqtt-stress/certs/ca.crt ``` ### 6. 启动应用 ```bash cd deploy # 赋予执行权限 chmod +x start-script.sh # 启动应用 ./start-script.sh ``` ### 7. 监控状态 ```bash # 查看应用状态 curl http://localhost:8080/api/stress/status # 查看连接统计 curl http://localhost:8080/api/stress/connections # 查看消息统计 curl http://localhost:8080/api/stress/messages # Prometheus 指标 curl http://localhost:8080/actuator/prometheus ``` ## JVM 启动参数详解 ```bash # 内存配置 -Xms24g -Xmx24g # 堆内存 24GB -XX:MetaspaceSize=512m # 元空间初始大小 -XX:MaxMetaspaceSize=512m # 元空间最大大小 # G1GC 配置 -XX:+UseG1GC # 使用 G1 垃圾收集器 -XX:MaxGCPauseMillis=200 # 最大 GC 暂停时间 200ms -XX:G1HeapRegionSize=16m # G1 区域大小 -XX:InitiatingHeapOccupancyPercent=45 # 触发并发 GC 的堆占用百分比 # 性能优化 -XX:+UseStringDeduplication # 字符串去重 -XX:+DisableExplicitGC # 禁用显式 GC -Xss256k # 线程栈大小 256KB(支持更多线程) # TLS 优化 -Dhttps.protocols=TLSv1.2 -Djdk.tls.client.protocols=TLSv1.2 ``` ## EMQX 服务器配置 参考 `deploy/emqx-config.conf` 配置 EMQX 服务器: ```bash # 复制配置到 EMQX sudo cp deploy/emqx-config.conf /etc/emqx/emqx.conf # 重启 EMQX sudo systemctl restart emqx ``` 关键配置项: - `listeners.ssl.8883.max_connections = 100000` - `zone.external.max_conn_rate = 1000` - `broker.vm_memory_high_watermark.absolute = 24GB` ## 监控指标 ### 连接指标 - `mqtt_connections_connected` - 当前连接数 - `mqtt_connections_disconnected` - 断开连接数 - `mqtt_connections_success` - 连接成功计数 - `mqtt_connections_failure` - 连接失败计数 ### 消息指标 - `mqtt_messages_sent` - 已发送消息数 - `mqtt_messages_failure` - 发送失败消息数 ### 系统指标 - `jvm_memory_used` - JVM 内存使用 - `system_cpu_usage` - CPU 使用率 ## 故障排查 ### 连接数不足 检查系统文件句柄限制: ```bash ulimit -n # 应 >= 1048576 cat /proc/sys/fs/file-max # 应 >= 2097152 ``` ### TLS 握手失败 1. 确保证书路径正确 2. 检查证书格式(PEM 或 DER) 3. 验证 TLS 1.2 支持:`openssl s_client -connect host:8883 -tls1_2` ### OOM 错误 1. 增加堆内存:修改 `start-script.sh` 中的 `HEAP_SIZE` 2. 减少连接数:修改 `application.yml` 中的 `total-connections` 3. 检查内存泄漏:分析 GC 日志 `/tmp/gc.log` ### 消息发送延迟 1. 增加发布线程数:修改 `ThreadPoolConfig` 2. 优化网络参数:检查 `linux-sys-tuning.sh` 配置 3. 降低 QoS:设置为 0(`mqtt.qos = 0`) ## 性能基准 在 16 核 32GB 服务器上的预期性能: | 指标 | 目标值 | |------|--------| | 连接建立时间 | ~90 秒(60K 连接) | | 稳定连接数 | 60,000 | | 消息吞吐量 | 6,000 条/秒(500 字节/条) | | 内存占用 | ~20GB | | CPU 使用率 | ~60-80% | | 网络带宽 | ~24 Mbps(上行) | ## 注意事项 1. **主机名验证**:已关闭主机名验证(`verifyHostname = false`),仅用于测试环境 2. **证书安全**:生产环境请使用正式证书并启用主机名验证 3. **网络带宽**:60K 连接每 10 秒发送 500 字节消息,需要约 24 Mbps 上行带宽 4. **文件句柄**:确保系统文件句柄限制 >= 1048576 5. **端口范围**:确保本地端口范围足够(`ip_local_port_range`) ## 目录结构 ``` mqtt-tls-stress-client/ ├── pom.xml # Maven 配置 ├── README.md # 本文档 ├── src/main/java/ │ └── com/mqtt/stress/ │ ├── MqttStressApplication.java # 主启动类 │ ├── config/ │ │ ├── MqttProperties.java # MQTT 配置类 │ │ └── ThreadPoolConfig.java # 线程池配置 │ ├── controller/ │ │ └── StressMetricsController.java # 监控接口 │ ├── service/ │ │ ├── MqttClientService.java # MQTT 客户端服务 │ │ ├── BatchConnectionManager.java # 批量连接管理 │ │ └── ScheduledPublishService.java # 定时发送服务 │ └── util/ │ └── TlsUtils.java # TLS 工具类 ├── src/main/resources/ │ └── application.yml # 应用配置 └── deploy/ ├── start-script.sh # 启动脚本 ├── linux-sys-tuning.sh # Linux 系统调优 ├── user-limits.sh # 用户限制配置 └── emqx-config.conf # EMQX 配置参考 ``` ## 许可证 MIT License