一、测试目的
测试 EMQ X 企业版 4.3.4 单节点并发连接 10 万、以每秒 5 万 QoS 1、payload 200B 的消息发布速率持久化至 MySQL 所需 EMQ X 资源及响应时间等性能指标。
二、测试架构
三、测试环境、机器配置及测试工具
测试环境:腾讯云南京区VPC
XMeter企业版v3.0
EMQX、MySQL、测试机配置:
服务 数量 版本 操作系统 CPU 内存 云主机型号 EMQX 1 企业版v4.3.4 Centos7.8 64核 128G C5.16xlarge128 MySQL 1 社区版8.0.26 Centos7.8 16核 64G C5.4xlarge32 XMeter管理机 2 3.0 Centos7.3 8核 16G C3.2xlarge16 XM压力机 5~8 / Centos7.3 8核 16G C3.2xlarge16
四、测试场景
如测试架构图中所示,XMeter 压力机模拟 10 万 MQTT 客户端向 EMQ X 发起连 接,新增连接速率为每秒 2000,客户端心跳间隔(keep alive)300 秒。所有 连接成功后每个客户端每 2 秒发送一条 QoS 为 1、payload 为 200B 的消息,所 有消息通过规则引擎存储至 MySQL。
测试执行 1 个小时。
规则引擎配置如下:
MySQL资源设置
规则设置
启用异步、批量插入
MySQL调优配置
修改MySQL配置文件/etc/my.conf:
[mysqld] # 默认为128M,修改为64G的70% # Start at 70% of total RAM for dedicated server. innodb_buffer_pool_size = 44000M #缓冲池实例个数 innodb_buffer_pool_instances = 8 max_heap_table_size = 4096M tmp_table_size = 4096M
五、测试结果
具体测试结果及EMQX资源使用截图如下:
EMQX Doshborad统计:
EMQX规则引擎统计:
EMQX Dashborad消息数统计:
从数据库查询插入的数据条数:
测试结束从数据库相应表里查询到的总数和EMQX Dashborad上统计的消息数、规则上的命中数以及成功数都是一致的。
EMQX节点资源使用:
XMeter测试报告截图:
六、测试总结
如以上结果所示,EMQ X 64C128G 配置下可以支持 10 万连接、每秒 5 万 QoS 1、payload 200B 的消息写入 MySQL,所有消息都实时写入数据库。消息 吞吐期间,EMQ X 所在机器 CPU user 使用范围 45% ~ 68%,CPU user 平均 使用 57%,CPU idle 范围 20%~50%,平均 36%。内存使用稳定。
附录1:操作系统调优
可参考 https://docs.emqx.io/enterprise/latest/cn/tutorial/tune.html, 亦可直接 sh 附录 3 中的调优脚本 sys_tune.sh。
附录2:测试工具使用、下载地址
XMeter 简介 (https://www.xmeter.net/):XMeter 是基于开源测试工具 JMeter 扩展的性能测试平台。针对物联网具有的接入规模大、弹性扩展要求、 多种接入协议、混合场景等特点,XMeter 对 JMeter 进行了改造,实现了百万 级别并发测试支持,并对测试数据进行实时处理并图形化展示。
XMeter官网和试用地址:https://www.xmeter.net/
XMeter MQTT 插件下载:https://github.com/xmeter-net/mqtt-jmeter
JMeter 下载地址:https://jmeter.apache.org
附录3:系统调优脚本
#!/bin/sh ## Linux Kernel Tuning sysctl -w fs.file-max=2097152 sysctl -w fs.nr_open=2097152 echo 2097152 > /proc/sys/fs/nr_open echo 2097152 > /proc/sys/fs/file-max ## The limit on opened file handles for current session ulimit -n 1048576 ## Add the ‘fs.file-max’ to /etc/sysctl.conf, make the changes permanent ## /etc/security/limits.conf ## ## ## * soft nofile 1048576 ## * hard nofile 1048576 cat <<- 'EOF' >> /etc/security/limits.conf * soft nofile 1048576 * hard nofile 1048576 EOF ## Network Tuning ## Increase number of incoming connections backlog sysctl -w net.core.somaxconn=32768 sysctl -w net.ipv4.tcp_max_syn_backlog=16384 sysctl -w net.core.netdev_max_backlog=16384 ## Local Port Range: sysctl -w net.ipv4.ip_local_port_range=1000 65535 ## Read/Write Buffer for TCP connections: sysctl -w net.core.rmem_default=262144 sysctl -w net.core.wmem_default=262144 sysctl -w net.core.rmem_max=16777216 sysctl -w net.core.wmem_max=16777216 sysctl -w net.core.optmem_max=16777216 sysctl -w net.ipv4.tcp_rmem=1024 4096 16777216 sysctl -w net.ipv4.tcp_wmem=1024 4096 16777216 ## Timeout for FIN-WAIT-2 sockets: sysctl -w net.ipv4.tcp_fin_timeout=15 cat <<- 'EOF' >> /etc/sysctl.conf net.core.somaxconn=32768 net.ipv4.tcp_max_syn_backlog=16384 net.core.netdev_max_backlog=16384 net.ipv4.ip_local_port_range=1000 65535 net.core.rmem_default=262144 net.core.wmem_default=262144 net.core.rmem_max=16777216 net.core.wmem_max=16777216 net.core.optmem_max=16777216 net.ipv4.tcp_rmem=1024 4096 16777216 net.ipv4.tcp_wmem=1024 4096 16777216 net.ipv4.tcp_max_tw_buckets=1048576 net.ipv4.tcp_fin_timeout=15 EOF