排查tomcat服务器CPU使用率过高

tomcat要运行依赖于JDK,tomcat服务器的CPU使用率过高,大多都是因为部署web程序的问题。

一、现象描述

在一次线上环境,前台访问页面的速度越来越慢,从浏览器F12中看到发出的请求都是pengding的状态。

二、排查过程

我这里tomcat部署在linux环境中。下面的排查过程均在linux下进行。

1、排查后台服务

查看tomcat的后台日志,发现日志正常打印,未发现异常信息;把要执行的SQL复制出来,放到mysql的客户端执行,发现sql运行正常且查询速度正常。

通过上面的排查发现要访问的功能正常,排除是当前功能造成的原因。

2、排查服务器

1、找出耗CPU的进程

使用top命令查看特定用户(user1)的内存、cpu及各进程的信息,

top -u user1

使用上面的命令,可以看到下面的信息,

排查tomcat服务器CPU使用率过高

从上面可以看到存在一个java的进程,由于我这里没有其他的java相关的进程,这里可以判断为tomcat的进程,这里可以看到PID为47787,通过%CPU、%MEM分别表示CPU、内存的使用率,由于我这里问题已经解决,所以看到CPU的使用率已经下来了,异常情况下可以是超过100%的数值。

这样我们就可以找出使用CPU过高的进程。

还可以通过下面的命令来快速找到java进程,

jps

使用jps命令可以快速找到java进程的PID,如下图

排查tomcat服务器CPU使用率过高

这里可以看出PID为47787为tomcat进程。还可以使用下面的命令,

ps -ef |grep tomcat

上面的命令打印出下方的信息,

排查tomcat服务器CPU使用率过高

回到正题,上面使用top命令找到了CPU过高的进程。

2、找出耗CPU的线程

在上一步中找到了耗CPU的进程,下面要找到耗CPU的线程。我们知道一个进程中可以有多个线程,进程是线程的集合。

使用下面的命令找到耗CPU的线程,

top -Hp 47787

上面的“47787”即上一步中找到进程id,意思就是找出该进程下的线程信息。如下图,

排查tomcat服务器CPU使用率过高

从上图中可以看到该进程下的线程信息,由于我这里已经正常了,所以未看到CPU过高的线程,上图中的PID这里代表的是线程ID。假如47875这个线程的%CPU使用过高,

下面把该线程ID,转化为16进制。

printf "%x/n" 47875

排查tomcat服务器CPU使用率过高

从上图可以看出47875的16进制为“bb03”。

上面,通过进程ID,找到了耗CPU的线程ID,并且转化为了16进制。

3、从JVM堆栈中查找线程信息

我们获得了耗时较高的线程ID,下面通过JVM的堆栈信息找到线程信息,那么如何获得JVM的堆栈信息那,使用下面的命令

jstack 47787 > ./jvm.log 

上面的“47787”代表的是上面的进程ID,打印出47787进程的堆栈信息,保存在当前目录的jvm.log文件中。

下面从jvm.log文件中找到上面的线程信息,

grep -rn bb03 ~/jvm.log -A 100

找到下面的信息,

排查tomcat服务器CPU使用率过高

从上面可以看到是一些线程信息,那要怎么去排查那,可以通过上图红框中的状态为 RUNNABLE 的线程信息,即为正在运行的线程,从这里可以找到相关的信息,最终解决问题。

三、总结

CPU使用率过高,多数是因为线程无法终止或出现死循环等原因,需具体问题具体分析。

原文 

http://www.cnblogs.com/teach/p/12660541.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 排查tomcat服务器CPU使用率过高

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址