EMQ 3.2.2版本 运行时间长了 会有很多established的tcp连接不释放

EMQ 3.2.2版本 运行时间长了 会有很多established的tcp连接不释放

环境

  • EMQX 版本:EMQ 3.2.2
  • 操作系统版本:CentOS Linux release 7.6.1810 (Core)


3.2.2 版本目前已经停止维护了,目前还在维护的版本是 4.4 和 5.0,建议升级到这些版本上来。印象中这个 Bug 应该是修复过的。

能请教下 这个问题的原因具体是什么呢 目前公司维护的EMQ不敢轻易升级 因为大概有10W+的设备在使用这个EMQ,担心升级后的兼容问题 谢谢

看看你用了什么认证插件,比如 MySQL 认证,是不是访问很慢。

乖乖!有10万个设备,老板竟然 不给额外的钱、额外的时间,来让你做这个 最重要的 后台程序升级+优化!仅仅是害怕升级后不能再用、那不升级服务器被TCP/IP连接大量占用而死掉不能处理消息、也是不能用!
程序员 ,好苦逼 、总是 2难境地 !
你这个,只有下载 3.2.2版本的源码,然后自己尝试修改、编译、部署。

hi 你好 想请教下
EMQ 3.2.2版本 运行时间长了 即使设置了keepalive机制 还是会有很多established的tcp连接不释放
貌似linux操作系统底层的keepalive也是不生效的

1)你下载3.2.2版本的源码,然后修改代码,在tcp/ip socket 建立连接后,创建处理线程前,增加对ip地址的判断,如果这一次连接是个无效连接(即:没有真正的业务数据传递过来),那么:不要开线程。否则开了,你就会关不掉这个ESTABLISH的TCP/IP连接。
2)修改防火墙,增加对这些无效ip地址的过滤。不让它们连接的你的emqx server.
3) 下载linux版的dsniff,然后利用tcpkill杀死那些你认为的idle的tcp/ip连接。
以上方法,仅供参考。
程序员就是苦逼。这些实验会花掉你大量时间。。。。

如果你那些10W+的客户端,可以修改回传emqx server的ip地址,那么你就修改它们到你新搭建的emqx更高版本的server IP。你可以先改10个,运行一段时间,发现效果好,就全部切换 。。。

感谢

我们曾经见过一些 mqtt 连接无法释放并且也踢不掉的问题,大多是因为用了 MySQL 插件, 并且MySQL 被阻塞导致的。

这边没有使用mysql插件 这些未释放的tcp连接处于established的状态 但是没有信息传输 理论上应该是被keepalive关闭的 实施情形确实没有关闭 是不是底层什么机制阻止了这些无效连接的回收?

你这个再描述下你的具体症状,就在这个帖子里写吧@ zhuaijun999

请问一下单机版的4.3版本可以直接改镜像文件和配置挂载和容器信息升级到5.1吗,与集群版的操作有什么区别吗

这个,估计直接在原先单机4.3版上操作,风险比较大,可以
1)先找一台机器,装上4.3版,然后升级到5.1,模拟一下这个升级过程
2)然后,修改一台mqtt设备,把它切到5.1。可以的话,就继续修改其它设备。

K8S部署的docker容器,直接改镜像文件和配置挂载和容器信息可以吗

1)这个我也不熟悉k8s。这个你可以再找一个k8s,然后先装4.3,模拟再升级一下到5.3。
2)也可以在这个新的k8s上,直接敲定一个版本,开设多个clientId,
然后在找一个测试windows机器,写个多线程的模拟程序,往不同topic模拟发送,做压测。然后在k8s上,用netstat -ano|findstr 1883|findstr ESTB命令,来观察tcp 连接,当你停止掉模拟发送程序时,这些tcp连接是否能在短时间内,释放。如此反复测试,直到找到一个稳定的、可用的emqx版本。
这个要懂一定的java和网络命令。
3)当然,你这个3.2版本服务器上的,不释放的tcp连接,也有可能是来自订阅的客户端的连接引起的,这个时候,把他们切断就可以了,或者让客户端程序,连接一段时间后,主动释放连接,然后间隔一段时间,再重新连接,不要一直挂着连接。

好的,谢谢了

EMQ 3.2.2版本 运行时间长了 会有很多established的tcp连接不释放

环境

如何在Windows中终止特定的TCP连接?

Nirsoft 的CurrPorts工具似乎可以做到这一点