发现一个bug,如果mqtt不停的被人重连,内存会一直上涨,就算对方把客户端停止,内存也不会释放

emqx 版本5.0.17
部署环境 linux,4节点集群

发现EMQX被客户端不停的重连,内存一直猛涨,直到对方停掉客户端连接后,内存也没法释放,请问是什么原因?
这是后台报日志信息

我看出现好多msg: puback_packetId_not_found,也不知道是否是由于这个原因导致?但目前日志也一直输出Mnesia overload,目前内存没办法下降,请问如何排查是哪个客户端导致或者有什么办法可以释放内存呢?

在线等待回复。。

从 observe_cli 看,是 Process 大概占用了 7G 的内存导致的过高。排查下

  1. 客户端连接数量
  2. 客户端重连后需要订阅的主题的是什么(主题格式和个数)?
  3. 在 observer_cli 里,输入mq回车 以消息对 Process 排序,观察是否有消息堆积
  4. 排查是否存在大量的 HTTP API 访问请求,如果是是怎么访问的

1、连接数不多,只有1473个连接


2、客户端重连后订阅的主题也不存在了,因为目前一直重连的客户端已停掉了,但内存一直没有降下来;
3、通过 observer_cli 里,输入mq回车,没看出有消息堆积;

4、第4点如何查看呢?

感觉有进程卡住了。
怎么 1473 个客户端,居然有 52171 个进程…
你用 observer cli 输入 M 回车看看
你在 emqx 还开了什么功能 ?想看看会一直 mnesia log overload


目前不知道为啥为卡住,可以从哪里看到不?
目前日志这两天没有再输出,所以看不到这两天有输出Mnesia is overloaded,但内存就一直不下降

你在 dashboard 上关开一下保留消息,试试。
看起来是保留消息有点资源没释放。

已试过关闭保留消息后再启用,发现还是没法释放资源,还有其它办法不?

在刚才执行 observer cli 的 shell 里面执行一下这个函数 。

  lists:foldl(
        fun(Pid, Acc) ->
            case erlang:process_info(Pid, current_function) of
                {current_function,{qlc, wait_for_request,3}} ->
                    catch erlang:exit(Pid, kill),
                    Acc + 1;
                _ -> Acc
            end end, 0, erlang:processes()).

你好,我在observer cli 里没法输入shell 的函数,请问按哪个健可以输入这个函数呢?


你好,是这样吗?

这是,这说明已经回收掉了断线重连的那 50710 个进程。
再打开 observer cli 界面,我看看


4个节点里有一个节点释放了。我都不知操作了啥那个节点释放了的,但还有3个节点还没释放

image
这个进程数看起来是正常了。
其它3 个节点是什么情况?
进程数是多少,截个图看看。所有节点都要执行上面这个函数的。

4个节点执行上面的函数全部释放了,感谢,对于这一块。不知可否在后面的版本做到自动释放呢?

retainer 这块从 5.0 到 5.3 经过一轮重构,上面这个问题还是没有找到真正的原因。
只是临时做到释放。已经安排人调查原因了。

如何临时释放?

可以细看一下上面的过程,里面我给了一个函数,可以临时释放。
但是一定要细看过程,确定你的情况是和他的一样的才有效。

@5779170 遇到类似的问题,求帮助。方便加个微信聊吗?微信号:wangkuiwu0652