项目在上线之后,运行24小时之后CPU突然增高,导致不得不重启机器。
二、分析及定位问题项目在上线前是经过压力测试,刚开始定位是QPS过大,通过增加机器。但结果并不是特别理想,始终会有几台机器增高。
项目环境测试机1c2g
1、测试通过jmeter对该机器接口进行压力测试,qps为90,cpu增高到40%持续没多久下降到10%,一直持续稳定。并未产生CPU过高的情况,该机器配置比正式环境要低4倍,第一步得出的结论应该不在接口上
2、更换项目中比较早期版本的插件及线程池重新上线项目之后,运行1天之后,依然有2台机器的CPU持续增高,并且越往后增加越大
3、开始针对线上高CPU服务器排查查看pid下的占用高的tidtop-Hppid查看栈输出到|grep-A2000tid的16进制查看堆jmappidjmap-heappidjmap-histo:livepid开始安装火陷图插件第一种text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9第三种application/json
以上三个线程可以设置每个为30,永久。
我们再通过打印堆信息可以发现ConcurrentLinkedQueue队列开始突破限制突然增高,又突然减少,这时候可以把第一个jmeter请求先暂停。然后再持续观察堆信息
[xx@xxx~]$jmap-histo:live10114|:4809115416$Node768:36864[xx@xxx~]$jmap-histo:live10114|:5530132720$Node768:36864[xx@xxx8~]$jmap-histo:live10114|:5530132720$Node767:36864[xx@xxx~]$jmap-histo:live10114|:6994167856$Node768:36864[xx@xxx~]$jmap-histo:live10114|:7262174288$Node768:36864[xx@xxx~]$jmap-histo:live10114|:9829235896$Node777:36864
明显可以发现ConcurrentLinkedQueue在增高。到此针对SpringBoot在2.2.6版本中cpu持续增高情况已经可以完全的复现,复现过程可能会存在不成功,可以多试几次。
四、解决方案1、目前发现在多核CPU的情况下增长比较缓慢,但是到一定的长度之后也会加速加大CPU的消耗,所以高配置可能是一个解决方案
2、降级方案,目前通过对比。SpringFramework在5.1.x版本无太大影响。
3、等待更新目前master再次修复一版,预计4.27发布,官方也将MimeTypeUtils列为5.3.x版本重构之一
#修复方案从ConcurrentLinkedQueue队列切换到了ConcurrentLinkedDeque队列五、补充
验证ConcurrentLinkedQueue队列,出现false情况
;;publicclassMain{privatestaticConcurrentLinkedQueueIntegerqueue=newConcurrentLinkedQueue();publicstaticvoidmain(String[]args){for(inti=0;i1000;i++){Threadthread1=newQueueThread((i));();}try{(5000);}catch(InterruptedExceptione){();}("");}staticclassQueueThreadextsThread{privateintvalue=0;privateStringname;publicQueueThread(Stringname){=name;(value);}@Overridepublicvoidrun(){for(inti=1;i1000;i++){try{booleanflag=(value);("remove:"+value+""+flag);(value);value++;}catch(Exceptione){(e);}}}}}备注:如果是2.2.1-2.2.5版本是会造成频繁的拿锁与解锁,本篇是以2.2.6版本为分析
本文由原创发布
转载,请参考转载声明,注明出处:
安全客-有思想的安全新媒体