问题描述
前几天线上服务器某个Tomcat进程突然间歇性CPU占用率100%,这个并不是突然性的,而是有规律的,Top了一下基本每隔30s飙升一次,坐等5s左右回落。虽然这酱紫,由于是多核CPU,外加其实并没有多少真实用户在访问,也并不影响什么。
解决思路
由于是间隔性的飙升,首先检查了一下Tomcat服务下是否存在高频计算的定时任务,然并卵,连个定时任务都没有。
这就奇了怪了,推测是不是某个服务有定时统计的请求,由于项目中使用了Dubbo,但是也并没有嵌入统计配置,此路不通。
既然这样不妨分析一下到底是Tomcat进程中的那个线程导致CPU飙升的。首先使用Top命令找到CPU飙升的进程PID,然后执行以下命令,查找导致问题的线程。
#8564为进程号PID
top -H -p 8564
等待一段时间,找出CPU飙升的线程ID,然后转十六进制
#172为线程ID
printf %x 2212
然后执行以下命令,定位CPU飙升的线程堆栈信息
jstack 8564|grep -A 10 8a4
格式:jstack [进程] | grep -A 10 [线程的16进制]
,-A 10表示查找到所在行的后10行。
来回定位就这俩,一个是Tomcat自身相关的,一个是监控的应该不是这个问题。分析了半天,也没个结果,临近下班了,再等几分钟重启试试,看明天是否还有这个问题。
第二天,上线Top监控了一下,半天也没反应,难道好了?又等了半天,还是没动静,果然好了,这件事说明一个问题,如果实在找不到原因所在,就重启吧!!!