while 循环引发“血案”

2018-12-11  本文已影响83人  Steven_cao

不积跬步,无以至千里

前些天线上消息转发平台CPU 居高不下,CPU超负荷报警不断,客户方电话不断,并要求给出导致问题的原因。

同事的方式

同事呢主要的怀疑点在ActiveMQ的消费能力上,同事折腾了好几天,对ActiveMQ的消费能力进行参数优化,这其中包括以下几个方面:

当然这只是采取解决方案的一种,同事对解决问题还有一种暴力手段:

这种解决方案,我很不赞同,也不提倡。

进行调整后,项目重新发布部署,观察CPU的使用率,指标显示恢复正常;
这个问看似完美解决,可运行几天后运维团队又发来Ticket,CPU超负荷报警,ActiveMQ堆积了大量消息未处理,查看ActiveMQ日志,日志显示目前还在消费几个小时前的消息(这下可打脸了,前面给客户说我们定位到问题的根源,已经对问题进行了修复)。

我的方式

接手这个问题后,按如下方式最终定位到代码问题,通过对代码逻辑的补充完善,最终解决了这个问题,其实问题的定位并不难,关键问题是现在的有些程序员对完成分配的任务,可以很快的完成(前提是不出现什么问题),但一遇到问题,却不知入何下手,查找问题的根源;也许我这样说有失公允,其他程序员若有异议,请不要对号入座。

1、 首先进入到新能源转发平台,在ActiveMQ消息大量堆积的情况下,使用top指令
2、通过jstack指令 保存线程栈信息,并在其中查找导致CPU飙升的线程,并定位程序代码
3、通过对代码的通读,发现while循环中,有一分支,在上报数据出现异常时,业务处理返回idx = -1,再执行idx++ = 0 ,这样程序将会在while循环中一直执行下去,造成死循环。

总结:针对这种while循环,一定要小心再小心,同时也提醒我们在考虑问题时,不能只考虑正常情况,也要对异常情况进行考虑,对于这种输入一般情况下是正常数据,而偶尔会有异常数据的问题,也要进行考虑;开发这个分支的同学,未进行异常考量,说明其在思考问题上,考虑不周全,逻辑思维不严谨。而开发完程后,一个问题的出现,又不知如何定位代码问题,想要在几万行代码中,查询问题根源,犹如大海捞针;所以,能完成开发工作任务是你的本质,在遇到问题时能快速定位,才是你的能力。

上一篇 下一篇

猜你喜欢

热点阅读