EMQX的内存消耗问题

环境信息

  • EMQX 版本:
  • 操作系统及版本:
  • 其他

问题描述

用emqtt-bench做压力测试,测试的是SSL 8883,当把心跳包设置为8秒时,EMQX的内存消耗是心跳包300秒的一倍,这是啥原因呀请问。按道理来说不该增长这么大的呀

配置文件及日志

EMQX 是基于 Erlang 的,它的 SSL 性能确实不高,一般我们部署的方式是前置一个 Proxy/LB 做 TLS 终结,然后在分发给 EMQX 的 1883 端口。

ps: 有详细的测试场景的和数据可以分享,供大家参考的吗?例如机器配置,测试的场景,消息的大小,QoS,并发量等

可以的,服务器主机配置是2核4G,centos7.8系统。内网测试两个节点的EMQX集群。测试场景如下:
测试目标:单节点测试。指定服务器地址进行压测
测试命令:emqtt_bench conn -h 192.168.0.2 -p 8883 -V 3 -c 20000 -i 10 -k 5 -S true
测试目的:并发连接。命令是conn
每秒新增客户端:100
测试协议和端口:TCP SLL,8883
心跳包间隔:8秒
客户端总数:20000

测试结果对比:当心跳包使用默认300秒时,从emqx提供的监控数据看到,当连接的客户端总数达到
20000时,总内存占用不会超过2.5G。多次测试略有差别,但上限始终不会超过2.5G.

当心跳包设置为8秒时,从监控数据看到,当连接客户端数量达到12000时,总内存占用已经达到2G.多次测试都差不多。

经过多次测试分析,最值得分析的应该是EMQX在SSL心跳包处理方面,一个心跳包会使用多少资源处理。由于是心跳包间隔引起的,缩短心跳包间隔,意味着每秒增加EMQX服务器的接收包数量,EMQX每秒验证和解密的数据会增大,这方面引起内存有增长很正常。但是,我觉得奇怪的地方,MQTT心跳包不是只有两个字节吗?内存咋会增长那么大呢

1 个赞

Erlang 的 SSL做得确实不好很占用内存…还是如果有大量 SSL 连接的话,尽量用 TLS 终结的方案好了 :rofl:

感兴趣的话,可以继续试试 保持在 12000 的连接一段时间,看看内存占用会下降多少呢?(按理会 GC 一点出来…但可能不多…)

关于前置 Proxy/LB 做 TLS 终结。这个部署方法我不是很了解,这个LB我应该部署在服务器主机内吗?还是部署在另外的主机?还有我很关心LB对于主机配置的需求,请问有这方面的详细资料让我参考一下吗?

我用12000压测了两个小时,内存下降到1.8–2.0左右波动,

概念可以看看这里:https://www.emqx.io/docs/zh/v4.4/tutorial/deploy.html

要不单独的机器上面部署 HAProxy or Nginx,或者使用云厂商的 SLB 之类的

好的。非常感谢您。云厂商的SLB用不起,价格贵不说,还限制连接数。太过分了。贵可以接受,限制流量和连接数这个就比较难接受了。

客气~ :tada: