新功能上线4天后,突然出现
此类问题包含:请求等待时间过长
初步解决方案
1、使用现有资源,将服务提供方分为两组,分别是:
处理大量业务(种类尽量少一些,方便排查问题)[主要分组]
处理少量业务[次要分组]
这样分组是因为:次要分组中需要使用最新项目中的方法,主要分组中不需要。这样可以保证不会对线上服务产生任何影响。
2、对主要分组进行回滚(怀疑有两个影响点)
新增的服务方法
调整了项目的JDK版本
观察现象
一、运行24小时
次要分组,没有出现问题
主要分组,重现问题
—发现多个大量消耗内存的线程
—每个线程中都是一个外部网络请求
—这些网络请求,统一是在会产生一个业务请求链的方法上(会根据配置增加串行请求的节点数量)
二、运行48小时
主要分组,出现问题
—CPU、内存没有问题
—大量等待、抛弃的请求
得出结论
一、现象一结论
1、不是项目的问题
原项目已正常运行12天,并未出现问题。这次突然出现问题,不应该是原项目的问题。 新项目在只提供服务的12小时也没有出现问题
2、业务本身的逻辑对项目产生较大的压力
业务需要有一个外部网络的串行请求(每配置一个外部服务商,会在请求链上产生一个请求节点) 只有整个请求链完成,才会释放对应的异步线程
3、队列数设定较多
此次现象中,每一个队列会产生15M左右的空间占用 设定的内存无法满足满负荷的队列
二、现象二结论
无法及时处理任务,导致任务积压
每一个队列处理太慢,导致减少后的队列无法为所有的服务提供位置 分配的队列数被消耗完,其他任务等待时间过长,被抛弃
解决方案
一、现象一的解决方法
二、现象二的解决办法
增加处理每个队列的线程池数量
根据每秒钟的请求,计算最差情况下会产生的任务等待
根据每一个任务的内存消耗,计算当下配置服务器什么情况下回宕机
根据每一个线程占用的内存,调整线程池的数量