JavaCPU使用率高
情节描述:
前两天收到很到短信报警(Web服务器的负载都很高,大概上升10倍的样子,达到10~15)。报警的前一天程序上有Update。
分析问题:
经过排查(uptime,top,iostat等等),每台Server的CPU都很高。运行top表现如下
top
每台Server的CPU高都呈现在Java上,由考虑到平日正常,前天有更新,所以锁定问题:最新更新的文件有问题。通过top可以查找出java的进程号(PID)。当然方法很多。
其次,确定与其相关的线程列表:
ps -mp PID -o THREAD,tid,time
线程列表图如下:
可以注意到:其中线程号为32143的线程已运行10个小时左右,占用CPU使用率60%左右。
确定了线程,可以查找出那些Java的程序启用的线程。可以通过Jstack查找出那些程序启用此线程。
先将线程ID,转化为16进制格式:
printf "%x\n" TID
通过Jstack,确定程序:
jstack PID|grep TID -A n
##这是后来补的图片,所以PID,TID可能上下有点不一致。
通过图片:发现是CarInfoUtil这个类文件在做虐啊,呵呵。运维的工作大概结束了,把查找的结果给予开发即可。通过开发的探究,发现这个类有个死循环,会判断一个结果集是否存在,如果不存在,会一直判断,循环。
个人结论:
造成CPU使用率高的原因有很多,这只是一个原因,或者说是探究的一种方法,望给予你启迪吧。