EMQX消息携带base64图片导致内存溢出

首先,我的EMQX目前是3.0.1版本(考虑过升级,但我是平台方的,设备方不太愿意升级,好像升级之后协议之类的要做兼容等大动干戈),基本上消息都是涉及人脸的,图片做了base64处理,在做了集群之后,发现不时出现OOM问题。

其实我是3台节点集群的,但是有一个节点已经因为OOM问题不可用了,然后这是在观测剩下两台的时候,发现内存暴增截的图。

内存暴增至最高的时候,已经达到120G了,我观察平台日志此时正在下发消息,消息仍然是携带base64图片的,当时大概有2个topic,每个topic有800条消息正在下发,并且这个下发操作每天大概会有30次左右。

请问,这些数据会被保存到内存中,造成OOM吗,下面是我的emqx连接配置(java):
private MqttAsyncClient createNewClient(String clientId) throws MqttException {
MqttAsyncClient client = new MqttAsyncClient(broker, clientId, null); //null不需要持久化
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);
options.setAutomaticReconnect(true);
options.setConnectionTimeout(5);
options.setKeepAliveInterval(100);
options.setMaxInflight(1000);
options.setUserName(Config.get(“websocket.emqx.userName”));
options.setPassword(Config.get(“websocket.emqx.password”).toCharArray());
client.connect(options).waitForCompletion();
return client;
}

升级 emqx 不需要改设备的。现在 emqx5.8.5 也支持 mqtt3.1.1 的协议。

图片里面不是 11.46G 么,怎么到了 120G 的。

应该是的。 可以试试搞个定时任务,一小时手动做一下 gc:
./bin/emqx eval “lists:foreach(fun(Pid) → erlang:garbage_collect(Pid) end, processes())”


这个是没有几分钟就升到了50G,120G的时候我已经把它重启了,当时不知道怎么释放内存。

此外我还有一个疑问,因为我一开始有两个怀疑的点,第一个就是图片传输量大的问题,第二个怀疑点是:我有个connection,不知道什么原因(可能是我代码问题,但是我换了很多环境压测都没复现出来)一直在创建/销毁,大概3秒一次,不知道这个久了会不会造成OOM

非常感谢及时回复,执行这个命令做手动gc的话应该不会造成消息丢失之类的问题吧

不会。 新版本里面默认是每 15 分钟做一次全局 GC 的。

这样应该不会OOM

谢谢你这么晚还帮忙解答,我心里有底啦!:saluting_face::saluting_face::saluting_face:

你好你好,我这两天又出现emqx内存溢出的问题了,我像你说的那样搞了定时任务每小时gc一下,但是三五天就会有一台节点内存溢出,现在是只能通过升级版本去解决吗,如果我把gc的时间控制在15或者30分钟,第一会不会有好点,第二会不会影响业务 :smiling_face_with_tear:

你看内存上涨到一定量,比如多了 5G,你就执行一下那个命令,如果内存掉下去了。就是有效的,可以把 gc 搞成 15 分钟一次,
如果没有任何变化 ,就只能升级了。

好的,感谢回复 :ok_hand: