JavaCPU使用率高

情节描述:

前两天收到很到短信报警(Web服务器的负载都很高,大概上升10倍的样子,达到10~15)。报警的前一天程序上有Update。

分析问题:

经过排查(uptime,top,iostat等等),每台Server的CPU都很高。运行top表现如下

top

Troubleshooting High CPU Java_第1张图片

每台Server的CPU高都呈现在Java上,由考虑到平日正常,前天有更新,所以锁定问题:最新更新的文件有问题。通过top可以查找出java的进程号(PID)。当然方法很多。

其次,确定与其相关的线程列表:

ps -mp PID -o THREAD,tid,time


线程列表图如下:

Troubleshooting High CPU Java_第2张图片

Troubleshooting High CPU Java_第3张图片

可以注意到:其中线程号为32143的线程已运行10个小时左右,占用CPU使用率60%左右。

确定了线程,可以查找出那些Java的程序启用的线程。可以通过Jstack查找出那些程序启用此线程。

先将线程ID,转化为16进制格式:

printf "%x\n" TID

113712353.png

通过Jstack,确定程序:

jstack PID|grep TID -A n

##这是后来补的图片,所以PID,TID可能上下有点不一致。

Troubleshooting High CPU Java_第4张图片

通过图片:发现是CarInfoUtil这个类文件在做虐啊,呵呵。运维的工作大概结束了,把查找的结果给予开发即可。通过开发的探究,发现这个类有个死循环,会判断一个结果集是否存在,如果不存在,会一直判断,循环。

个人结论:

造成CPU使用率高的原因有很多,这只是一个原因,或者说是探究的一种方法,望给予你启迪吧。