MQTT连接数随着时间增长越来越多

我的EMQX服务器在应用重启后初始连接一般会稳定在1050左右,由apache camel spring客户端进行连接与消费,但是随着时间的增长,链接会加到3000左右,这时候服务器内存资源就不太够用了,所以想了解到有没有一种可能在服务端设置某些东西,强制关闭连接,比如消费时间过长、或者链接强制断开。初步推断可能是消费消息变慢导致的连接数递增

1111

Hi, 抱歉回复晚了

可以通过调整 force-shutdown-policy 配置项来强制关闭链接。

但仍然是治标不治本。按照你的描述,客户端应该会在消费完成后自动断连?
但消费过慢导致同时会有更多的客户端连接,导致了资源消耗增加。

可以用 慢订阅统计 功能来调查哪些主题/客户端的消费较慢

好的,谢谢。我来看一下

您好,我在昨天开启了慢订阅统计,将force-shutdown-policy改为了3200,但是在今天emqx连接数仍然达到了3000,并且客户端有queue full的错误,意思是emqx队列满了,emqx的日志级别为warn,没有看到emqx的错误信息,我的日志链接在 queue fullfull

这个 queue full 只是 client 的问题吧
emqx 维护的 client session queue 状态不会发给客户端的

慢订阅统计结果有么,有没有哪些主题的先消息消费比较慢?

看了下另外一个帖子的截图,看起来你的 java client 在用新启动的 client 给 EMQX 回复之前另一个 session 收到的 publish(qos2) 消息的 PUBCOMP 报文?

pubcomp_packetId_not_foundpubcomp_packetId_inuse 这两个报错,看着像是 client 在维护 session 状态的时候,把不同的 session 混淆在一起了。

您好,我在之前设置了force-shutdown-policy改为了3200,后续也一直没有作用,目前emqx连接数仍然为3000,客户端CPU上涨,导致ClientState类增多,这个是链接MQTT服务器的实例,我的猜想是链接没有正确关闭,但是不确定force-shutdown-policy是否生效,如果服务端主动断开了链接,那么我的客户端应该也会断开的。


这是emqx.conf配置文件

还有我开启了慢订阅统计,设置了存留时间为30min,最近一直在观测,没有看到慢链接

emqx服务是5.0.11,自启动以来,日志只有两行warning,2023-11-22T01:31:54.497240+00:00 [warning] info: [{timeout,2013},{in,{gen,do_call,4}},{out,{gen_server,loop,7}}], line: 136, mfa: emqx_sys_mon:handle_info/2, msg: long_schedule, procinfo: [{pid,<0.2141.0>},{memory,13728},{total_heap_size,1599},{heap_size,987},{stack_size,12},{min_heap_size,233},{proc_lib_initial_call,{emqx_os_mon,init,[‘Argument__1’]}},{initial_call,{proc_lib,init_p,5}},{current_stacktrace,[{gen_server,loop,7,[{file,“gen_server.erl”},{line,443}]},{proc_lib,init_p_do_apply,3,[{file,“proc_lib.erl”},{line,226}]}]},{registered_name,emqx_os_mon},{status,waiting},{message_queue_len,0},{group_leader,<0.2051.0>},{priority,normal},{trap_exit,false},{reductions,15331820},{last_calls,false},{catchlevel,1},{trace,0},{suspending,},{sequential_trace_token,},{error_handler,error_handler}]
2023-11-22T01:32:05.534964+00:00 [warning] info: [{timeout,1889},{in,undefined},{out,{proc_lib,exit_p,3}}], line: 136, mfa: emqx_sys_mon:handle_info/2, msg: long_schedule, procinfo: [{pid,<0.12404.8>}]
2023-11-22T01:51:58.498458+00:00 [warning] info: [{timeout,926},{in,{lists,foreach,2}},{out,{erlang,garbage_collect,2}}], line: 136, mfa: emqx_sys_mon:handle_info/2, msg: long_schedule, procinfo: [{pid,<0.2484.0>},{memory,89312},{total_heap_size,11055},{heap_size,10958},{stack_size,35},{min_heap_size,233},{proc_lib_initial_call,{emqx_global_gc,init,[‘Argument__1’]}},{initial_call,{proc_lib,init_p,5}},{current_stacktrace,[{erlang,garbage_collect,2,},{erlang,garbage_collect,1,},{lists,foreach,2,[{file,“lists.erl”},{line,1342}]},{emqx_global_gc,handle_info,2,[{file,“emqx_global_gc.erl”},{line,69}]},{gen_server,try_dispatch,4,[{file,“gen_server.erl”},{line,695}]},{gen_server,handle_msg,6,[{file,“gen_server.erl”},{line,771}]},{proc_lib,wake_up,3,[{file,“proc_lib.erl”},{line,236}]}]},{registered_name,emqx_global_gc},{status,running},{message_queue_len,0},{group_leader,<0.1919.0>},{priority,normal},{trap_exit,false},{reductions,84960932},{last_calls,false},{catchlevel,4},{trace,0},{suspending,},{sequential_trace_token,},{error_handler,error_handler}]

看起来这里的连接数增多应该是客户端的行为。emqx 这边看都是正常的连接。

你那边要确保你的服务或者设备不会恶意的连接才行

应该不是恶意的,我也感觉是客户端的问题,但是排查又拍查不到,就来服务端找找解决方案了,哎

可以从连接信息上(例如 IP 地址,客户端 ID,用户名这些)着手排查一下。
实在不行就开下 INFO 或者 Debug 日志,如果机器资源还剩得多的话。

内网的服务,不会有别的机器链接,客户端ID都是由一个组件自动生成的,我去研究研究,感谢

客户端配置有一个 session-expiry-interval 默认为-1代表永不断开,设置为0代表当网络连接关闭后立即清除会话,用这个可以解决