问题描述
唠叨几句:本次案例解决方案在最后,不感兴趣的朋友,可以直接看最后。
此问题困扰了半年多,当然因为只是接手过来的项目,只负责运维和优化,有自己的另外一个项目在开发,所以中间都是断断续续的分析问题,偶尔手里不太忙的时候,就会分析一下这边情况。一说CPU持续升高,或者服务器挂掉,运维都会提醒是不是有死循环,如果真的是内存升高,在网上随便找两个例子,应该就能解决了。最终还要感谢我以前的同事,我们两个一起分析,讨论,终于将这场战役打赢了。
java的一个仓库项目
使用的框架:springMvc,阿里的MQ(ons),dubbo,zk。,ons-client-1.2.4
问题现象:项目能够正常启动,但是第二天cpu就已经升到20%多,在后面的每一天,都会升级,如图。
---------------------------------------
第一步 查看进程
使用命令,top, ps -ef|grep java 这两个都行
第二步 生成dump文件
使用命令 jmap -dump:format=b,file=Hump0702b.bin 74056
第三步 运行 MemoryAnalyer工具,导入生成bin文件
第四步 分析
分析过内存溢出的朋友,应该对上面的命令不陌生,所以命令含义就不解释了。
还有一个在线的工具,用 jstack 870245 >aa.txt 命令转存出来文件,然后用在线工具 http://fastthread.io/
这个还是不错的,
从怀疑代码写的有问题(因为是接手的项目,所以代码不熟悉),到最后分析是连接没释放。
连接没释放,怀疑是定时任务,但是分析代码之后,并不是此问题。
通过在线工具,和 jstack 870245 指向的都是阿里的MQ没有释放,如我第一张图那样,好多都是那样的内容。
虽然定位连接没释放,仍然怀疑是代码原因,可能没关闭连接。
经过找阿里的MQ例子,和别的项目使用的,都一模一样。
在此期间,将jvm的调优的一些参数都加上了,MQ的消费也加上线程了。
都没有达到cpu不升高的理想。
最后我们两个人在周日的时候,一起蹲在公寓里面,一边上网搜资料,一边分析。
发现阿里的MQ(ons)一个包的源码有可能有问题。
报错指向此处,所以看了看源码,AsyncTraceDispatcher,我当时使用的是1.2.4版本的ons-client包,源码我就不上了。感兴趣的可以看看。
最后我们在网上搜此包的maven,发现如图
发现1.2.4的没有人用,或者说用的人少。我当时看另外一个项目使用MQ非常正常,那个项目用的是1.1.8
所以我下载了1.1.8的包,发现压根就没有AsyncTraceDispatcher这个类,我们还分析了1.2.7.Final的包,这个是有AsyncTraceDispatcher这个类的,但是源码跟1.2.4的不一样,因为水平有限,所以源码看的是似懂非懂。
最终决定用1.1.8的包试一下。经过两天观察,cpu没有继续升高,一直维持平稳的状态。
总结:个人认为,
ons-client-1.2.4的包是有问题, 将包换成 ons-client-1.1.8的包,就解决了cpu升高的问题。当然1.2.7.Final我没有试,但是看图上使用的人非常多,所以应该也能解决我的问题。
最后上两张图,我的cpu快爆的,和已经稳定
个人水平有限,说出来的难免有错误的,最终目标是解决cpu稳定,不当之处,欢迎指出。
再次感谢我的小伙伴。安排