线程池使用不规范导致的生产问题

Posted by 张伟真 on 2024-10-30
Estimated Reading Time 1 Minutes
Words 381 In Total
Viewed Times

线程池使用不规范导致的生产问题

一 现象

线上环境卡顿,k8s探针接口无响应,导致服务假死

二 紧急处理方案

在nacos上把有问题的节点紧急下线,切走流量,保留k8s有问题节点,通过jstack pid 导出jvm线程池现状

三 问题分析

图片
图片
系统实现线程池有400个core线程数,任务队列 new ArrayBlockingQueue(2000);
处于waiting状态的线程数刚好400个,代表核心线程的400个线程全部满了卡住了
而代码中新的事件一直在发布然后调用线程
图片
数据量大的情况会出现如下图情况
图片

四 代码修改及规范

父子任务,存在等待关系的任务不应该用同一个线程池,规范每个服务的线程池的实现及使用

五 为什么线程池卡死带导致线上请求也卡死

线程池的卡死本质是因为新增业务编码规则需要计算,现上有新增的操作,也会卡死,导致tomcat负责处理请求的线程慢慢卡住并且占满,
所以k8s探针请求没有空余的线程去处理,但是k8s认为你的服务有问题需要重启,因为还没达到探针失败的次数阀值,所以从nacos上下线
是最快的解决方式,而且暂时保留了现场,在重启前将对应日志下下来分析原因


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !