记一次线上dubbo服务超时和线程池满问题排查

线上某dubbo服务A调用dubbo服务B的接口X方法,调用端A日志中出现了很多超时的情况,提供端B该接口X超时时间设置为60s;

查看提供端B的日志,报了很多线程池满的异常:

Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-10.1.5.69:20914, Pool Size: 700 (active: 700, core: 700, max: 700, largest: 700), Task: 69117 (completed: 68417), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://10.1.5.69:20914!
        at com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport.rejectedExecution(AbortPolicyWithReport.java:53) ~[dubbo-2.5.4.2.jar:2.5.4.2]
        at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821) [na:1.7.0_79]
        at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372) [na:1.7.0_79]

服务B部署了4个节点,仅1个节点有线程池满情况;

服务B的dubbo配置如下,线程池固定700个线程:

<dubbo:protocol name="dubbo" port="xxx" dispatcher="all" threadpool="fixed" threads="700" />

 

通过ps aux | grep 服务B的jmx端口号,查到进程pid;

通过jstack pid > jstatck.log dump出jstack日志文件;

vi打开该文件,搜索BLOCKED关键字:

"DubboServerHandler-10.1.5.69:20914-thread-134" daemon prio=10 tid=0x00007f32fc033000 nid=0x4e36 waiting for monitor entry [0x00007f32e8f31000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:112)
        - waiting to lock <0x0000000780066ae0> (a org.apache.tomcat.jdbc.pool.DataSource)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126)
        at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)

发现是很多的线程是阻塞在获取数据库连接;

工程使用了阿里开源的druid数据库连接池,获取连接超时时间设置的30s;

X方法并没有查询数据库,而是服务B中的其它方法查询了数据库;

那么线程池满原因大概清楚了:当其它服务调用服务B中查询数据库的方法,因方法获取连接超时,线程处理速度慢所以逐渐堆积,最终导致线程池满。

 

服务B使用了阿里云的RDS数据库,4个节点仅一个节点连接超时。而之前连接都是正常的。

 

跟运维同学反馈沟通,工程中配置的数据库连接用的ip,通过VPN做了路由转发的。

昨天下午该节点虚拟机维护,关闭并重启过;检查发现路由规则配置,没有设置开机启动;

配置规则,并添加到开机启动。

 

问题解决:)

------------------------------------------------------------------------------------------------------------------------------

参考:

dubbo Thread pool is EXHAUSTED-故障排除 https://blog.csdn.net/lsm135/article/details/77712130

Dubbo线程池耗尽异常原理分析RejectedExecutionException:Thread pool is EXHAUSTED https://www.aliyun.com/jiaocheng/791713.html

dubbo线程池溢出解决 https://blog.csdn.net/shaoyingchendsg/article/details/77551159

posted @   cdfive  阅读(8569)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示