美文网首页
mqtt服务线程资源泄露问题分析

mqtt服务线程资源泄露问题分析

作者: zcliu | 来源:发表于2024-11-27 11:15 被阅读0次

1. 背景

我们的mqtt服务线上一实例出现OOM,通过日志发现,OOM具体原因是因为没有足够空间创建新线程。

image.png

通过监控发现,该实例线程数一直缓慢增长,并没有回收。

image.png

2. 分析线程文件

jstack命令生成线程dump文件,通过分析,发现MQTT客户端创建了大量线程,并且没有释放。

image.png

3. 源码分析

服务使用的mqtt客户端如下

<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.2.1</version>
</dependency>

使用方式如下:


image.png

主要问题出在对mqtt client连接处理的代码上。原有代码的连接过程大致如下:
新建一个MqttClient对象 --> 设置callback监听断连、收到消息和发送消息成功的回调逻辑 --> 调用connect()方法连接emqx broker --> 订阅topic。
在收到断连的回调消息后,会发起重连操作,把上述流程重走一遍

image.png

排查线上日志发现有不少断连,


image.png

问题在于每一次重连后,老的MqttClient对象没有close()掉。

一个client又会引用着4种线程,
1、ConnectBG:负责连接操作的
2、CommsReceiver:用于消息接收
3、CommsSender:用于消息发送
4、CommsCallback:执行回调通知

image.png

因此随着重连次数增加, 线程数也缓慢叠加。

4. 解决方案

断连后,旧的Mqttclient调用close()方法,关闭资源

5. 效果

发生重连前:


image.png

借用tcpkill,模拟关闭tcp连接。


image.png

日志显示已经发生了重连


image.png

重连前后的MQTT线程,旧的线程已经成功回收。


image.png

发布后线上环境的效果


image.png

参考:
Linux 使用tcpkill杀掉tcp连接

相关文章

  • Java线程泄露问题分析

    现象开发反馈登陆不了服务器了,默认开发是work账号登陆,root账号还没受影响。 分析1.网上分析了下,大都说是...

  • 记一次线程池资源泄露问题分析

    1 现象 项目组有一个应用由多台机器组成一个集群向外提供服务,但是集群上线后大约两个星期发生了master机器宕机...

  • java服务常用排查命令

    1. 定位java线程问题 可用于定位线程热点、block、性能分析等 通过top命令查看进程占用资源 top -...

  • 线程相关面试题

    线程 多线程会带来什么问题 使用多线程会出现内存泄露,上下文切换,死锁问题等 线程的生命周期 线程被创建,进入初始...

  • java-threadpool

    线程池的好处 利用线程池管理多线程可以控制最大并发的问题,同时可以只能加服务器资源的利用率 线程池的简单使用 1,...

  • Mysql并发参数

    从实现上来说,MySQL Server 是多线程结构,包括后台线程和客户服务线程。多线程可以有效利用服务器资源,提...

  • 14.mysql并发参数调整

    从实现上来说,MySQL Server 是多线程结构,包括后台线程和客户服务线程。多线程可以有效利用服务器资源,提...

  • MQTT 持久会话与 Clean Session 详解

    MQTT 持久会话 不稳定的网络及有限的硬件资源是物联网应用需要面对的两大难题,MQTT 客户端与服务器的连接可能...

  • MQTT

    MQTT 服务器代理比较:https://github.com/mqtt/mqtt.github.io/wiki/...

  • 一周总结

    这周开发im mqtt聊天,项目基于野火的Mqtt服务端开发,后台开发小伙为了方便,生拉硬拽的使用mqtt服务端代...

网友评论

      本文标题:mqtt服务线程资源泄露问题分析

      本文链接:https://www.haomeiwen.com/subject/cmffsjtx.html