一次 线上 线程数飙高 导致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 就解决了该问题,上完版本之后线程一直维持在平稳状态,没有线程飙高的现象发生