可能原因:(1) dubbo中有httpClient调用。
由于http工具默认仅支持 5 个并发,且有线程池队列,当请求量超过 5 个的时候,多余的请求会在队列中堆积。前一批http请求结束之后其他的请求才会继续执行,越到后面线程等待时间会越长。所以对应实际业务场景中dubbo线程等待的时间也会越长,当这个队列到一定数量之后,就会引起dubbo默认200个线程池被占满的情况,从而引起整个应用服务的报错。
(2) 业务代码中,有异步调用,但异步调用又使用了线程池,异步调用后又需要等待返回结果,导致dubbo调用的时间变长,很容易把dubbo线程池用光,间接导致dubbo线程占满。
(3) dubbo接口中,处理大对象,导致频繁FGC, 请求不断,但STW时间过长,也会导致dubbo线程池占满。
总结:使用dubbo框架,请求的执行时间一定要短,特别是高并发下,很容易达到dubbo默认的线程池大小(默认200)。即便调高默认值, 但也很容易导致线程太多,CPU忙碌步过来,
又间接导致执行时间变长的问题。
参考:
https://blog.csdn.net/wsmalltiger/article/details/124236055