xiaobaoqiu Blog

Think More, Code Less

Dubbo Thread Pool Exhausted

今天出现一次dubbo的Thread pool exhausted导致服务不可用。根本原因是Mysql的慢查询。

1
Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name...

RejectedExecutionException表示线程池已经达到最大值,并且没有空闲连,拒绝执行了一些任务。 Thread pool exhausted通常是min和max不一样大时,表示当前已创建的连接用完,进行了一次扩充,创建了新线程,但不影响运行。

原因可能是连接池不够用,可以在provider的配置文件中设置threads参数:

1
<dubbo:provider port="20920" timeout="20000" threads="200"/>

如果线程池已经有200,还不够,通常是业务处理占用线程时间过长, 需优化业务,可通过jstack查看进程的状态,分析当前大多数线程都在干什么,从而分析出哪个地方是瓶颈, 比如,如果大部分线程都在处理SQL,可能是数据库连接不够,或数据源配置错误,或SQL没走索引等。

参考: http://alibaba.github.io/dubbo-doc-static/FAQ-focusedCommentId=9633823.htm#FAQ-9.%E5%87%BA%E7%8E%B0java.util.concurrent.RejectedExecutionException%E6%88%96%E8%80%85Threadpoolexhausted%E6%80%8E%E4%B9%88%E5%8A%9E%EF%BC%9F