一次 线上 线程数飙高 导致cpu飙高的解决思路,rocketmq

周末放假在家一直接收,系统告警的消息,联系运维重启了一下应用,到了周一早上又在告警。

1.联系运维 导出线程dump

2.发现大量的mq线程堆积

发现NettyClientWorkThread 有两千多在等待,就在想这个线程到底是干嘛用的,

3.跟踪源码发现 r

发现了线程dump 中输出代码的位置,这时候 就想,这个是什么东西调用的

继续跟踪源码发现 ,在mq startp 方法启动的过程中会启动

//Start request-response channel
this.mQClientAPIImpl.start();
//Start various schedule tasks
this.startScheduledTask();
//Start pull service
this.pullMessageService.start();
//Start rebalance service
this.rebalanceService.start();

不管是发消息 还是监听消息   应用程序 必须建立客户连接,第一个start 就是在建立客户端连接

这时候 就继续跟踪

发现

MQClientAPIImpl 类中remotingClient.start();

点击remotingClient里面去 发现 只是一个接口

 这是我们查看一下它的实现类发现

一路跟踪 终于发现 线程日志的命名在这里

就想为啥线程销毁呢,就猜想是不是mqclient没有关闭的原因

查看源码发现 rocektmq有提供 shutdown这个方法

就在想 难道有人写了连接mq 的代码没有关闭

就去找关于我们应用中所有mq的操作 

发现有人在作为生产者发送消息的时候,没有使用单例模式,没new一次他的对象,都会生成一个mqclient 连接,用完之后并没有关闭,造成大量的mqclient连接没有关闭,线程持续堆积造成系统 线程数持续飙高,更改成单例模式或者调用完shutdown 就解决了该问题,上完版本之后线程一直维持在平稳状态,没有线程飙高的现象发生

猜你喜欢

转载自blog.csdn.net/jiewenike/article/details/81543414