记录一次线上线程池爆了的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一次线上线程池爆了的问题相关的知识,希望对你有一定的参考价值。

参考技术A 背景:线上不停的有超时告警和错误告警
现象:查看错误日志有大量的
cause: org.apache.dubbo.remoting.RemotingException: Server side( xx.xx.xxx.xxx,20993 ) thread pool is exhausted, detail msg:Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-xx.xx.xxx.xxx:20993 , Pool Size: 200 (active: 198, core: 200, max: 200, largest: 200), Task: 17529516 (completed: 17529318), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://xx.xx.xxx.xxx:20993 !

排查思路:
1、检查是否流量有激增
排查结果:没有特别大的波动
2、排查调用下游的服务(包括mysql)有没有时延激增
排查结果:没有
3、检查容器的CPU/内存/网络/磁盘各个参数
排查结果:容器的没有
4、排查宿主机的CPU/内存/网络/磁盘各个参数
排查结果:磁盘的IO满了。最后确认是运维在做磁盘集群升级

针对各种原因导致的线程池满了的情况的处理方式
1、流量激增的原因导致的
解决方案:
1、消费者加缓存,不要每次都调用 dubbo 接口; 这种针对实时性要求不高,变化不大的数据
2、修改 dubbo 线程池配置,200 -> 300 ,但不要太大 这个要看自己的服务配置
3、新建 pod 分摊流量

以上是关于记录一次线上线程池爆了的问题的主要内容,如果未能解决你的问题,请参考以下文章

线程池运用不当的一次线上事故

Pythongevent 中协程池和线程池的简单使用

记录一次线上tomcat失去响应问题处理

记一次线上问题排查:C#可选参数的坑

阿里java编码规范记录

Android3.0以后,Asynctask在没开线程池的情况下会怎么排队执行