15

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

 4 years ago
source link: http://www.cnblogs.com/teach/p/12660541.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

一、现象描述

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

二、排查过程

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

1、排查后台服务

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

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

2、排查服务器

1、找出耗CPU的进程

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

top -u user1

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

eEfyI3z.png!web

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

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

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

jps

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

AnaMzqY.png!web

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

ps -ef |grep tomcat

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

fqAf2az.png!web

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

2、找出耗CPU的线程

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

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

top -Hp 47787

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

Z7biIfA.png!web

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

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

printf "%x\n" 47875

VnqeQfZ.png!web

从上图可以看出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

找到下面的信息,

36b6VvV.png!web

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

三、总结

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK