最近有个应用,在生产环境会出现100%的情况,时间没有规律,查看Tomcat日志、应用日志没有查到有效的信息,没有定位产生的原因,最终通过linux的top命令、jstack定位到问题,下面介绍下解决的方法。
1、使用top查看CPU使用较高的进程信息
[img]http://dl2.iteye.com/upload/attachment/0130/2748/f3a507b1-7e51-30ba-b8fe-0f448f11551f.png[/img]
2. 查看相关进程信息
top -H -p 1167
说明:1167为进程ID
此时,可以看到进程1167下面的相关线程信息。占用资源较多的线程会排在前几个
[img]http://dl2.iteye.com/upload/attachment/0130/2750/ccf2d832-e14c-3013-83cc-9417faa43c6c.png[/img]
3. 线程消耗信息后,我们jstack来查看一下某个线程的堆栈信息
使用方法:
jstack [进程] | grep -A 20 [线程的16进制]
-A 20表示查找到所在行的后20行
例如我们要线程号为1243的线程堆栈信息,先将1243转成16进制 4db,执行下面的命令
jstack 1167|grep -A 20 4db
执行完毕,我们会看到如图所示的堆栈信息,此时我们就能结合相关线程提示的信息来定位cpu100%的原因
[img]http://dl2.iteye.com/upload/attachment/0130/2752/70d16cc8-46f5-3b0b-b7fb-3ab546369631.png[/img]
1、使用top查看CPU使用较高的进程信息
[img]http://dl2.iteye.com/upload/attachment/0130/2748/f3a507b1-7e51-30ba-b8fe-0f448f11551f.png[/img]
2. 查看相关进程信息
top -H -p 1167
说明:1167为进程ID
此时,可以看到进程1167下面的相关线程信息。占用资源较多的线程会排在前几个
[img]http://dl2.iteye.com/upload/attachment/0130/2750/ccf2d832-e14c-3013-83cc-9417faa43c6c.png[/img]
3. 线程消耗信息后,我们jstack来查看一下某个线程的堆栈信息
使用方法:
jstack [进程] | grep -A 20 [线程的16进制]
-A 20表示查找到所在行的后20行
例如我们要线程号为1243的线程堆栈信息,先将1243转成16进制 4db,执行下面的命令
jstack 1167|grep -A 20 4db
执行完毕,我们会看到如图所示的堆栈信息,此时我们就能结合相关线程提示的信息来定位cpu100%的原因
[img]http://dl2.iteye.com/upload/attachment/0130/2752/70d16cc8-46f5-3b0b-b7fb-3ab546369631.png[/img]