1.看报错是自定义线程池拒绝策略默认抛出的错误。线程池队列和最大线程都已饱和。
2.找到线上机器,使用ps -ef |grep "服务运行所在的名称",找到对应的进程id号
3.top -H -p 进程号,观察对应进程的线程和内存使用情况
4.sudo -u (进程归属的用户) jstack 进程号, 将进程下所有的线程信息dump下来分析
5.猜测是执行代码地方,响应超时,以及线程池设置的超时时间不为0的正数时候,可能由于网络原因,或者慢sql,导致线程在调用future.get()方法时候阻塞,线程被挂起,从而一直消耗资源。 后面将阿里云上面的慢sql给导出,分析对应代码逻辑处理做对照。
6.排查中,因为这种情况很奇怪。。可能原因三条
1)测试的库跟生产的库可能不一样 有可能测试的库后来加索引了 生产的没加之类的
2)库索引之类的 是不是有慢sql或者这几个sql之间导致了死锁之类的
3) 性能是一方面 另一方面。。。 还有一个是缓存被击穿了,多次请求 都没访问到缓存 直接全去到数据库,导致所有线程都在执行任务的时候,等待数据返回,然而一直未拿到返回的结果,然后线程就一直被挂起了。
7.缓存穿透解决: