内容简介:tomcat要运行依赖于JDK,tomcat服务器的CPU使用率过高,大多都是因为部署的web程序的问题。在一次线上环境,前台访问页面的速度越来越慢,从浏览器F12中看到发出的请求都是pengding的状态。我这里tomcat部署在linux环境中。下面的排查过程均在linux下进行。
tomcat要运行依赖于JDK,tomcat服务器的CPU使用率过高,大多都是因为部署的web程序的问题。
一、现象描述
在一次线上环境,前台访问页面的速度越来越慢,从浏览器F12中看到发出的请求都是pengding的状态。
二、排查过程
我这里tomcat部署在 linux 环境中。下面的排查过程均在linux下进行。
1、排查后台服务
查看tomcat的后台日志,发现日志正常打印,未发现异常信息;把要执行的 SQL 复制出来,放到 mysql 的客户端执行,发现sql运行正常且查询速度正常。
通过上面的排查发现要访问的功能正常,排除是当前功能造成的原因。
2、排查服务器
1、找出耗CPU的进程
使用top命令查看特定用户(user1)的内存、cpu及各进程的信息,
top -u user1
使用上面的命令,可以看到下面的信息,
从上面可以看到存在一个 java 的进程,由于我这里没有其他的java相关的进程,这里可以判断为tomcat的进程,这里可以看到PID为47787,通过%CPU、%MEM分别表示CPU、内存的使用率,由于我这里问题已经解决,所以看到CPU的使用率已经下来了,异常情况下可以是超过100%的数值。
这样我们就可以找出使用CPU过高的进程。
还可以通过下面的命令来快速找到java进程,
jps
使用jps命令可以快速找到java进程的PID,如下图
这里可以看出PID为47787为tomcat进程。还可以使用下面的命令,
ps -ef |grep tomcat
上面的命令打印出下方的信息,
回到正题,上面使用top命令找到了CPU过高的进程。
2、找出耗CPU的线程
在上一步中找到了耗CPU的进程,下面要找到耗CPU的线程。我们知道一个进程中可以有多个线程,进程是线程的集合。
使用下面的命令找到耗CPU的线程,
top -Hp 47787
上面的“47787”即上一步中找到进程id,意思就是找出该进程下的线程信息。如下图,
从上图中可以看到该进程下的线程信息,由于我这里已经正常了,所以未看到CPU过高的线程,上图中的PID这里代表的是线程ID。假如47875这个线程的%CPU使用过高,
下面把该线程ID,转化为16进制。
printf "%x\n" 47875
从上图可以看出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
找到下面的信息,
从上面可以看到是一些线程信息,那要怎么去排查那,可以通过上图红框中的状态为 RUNNABLE 的线程信息,即为正在运行的线程,从这里可以找到相关的信息,最终解决问题。
三、总结
CPU使用率过高,多数是因为线程无法终止或出现死循环等原因,需具体问题具体分析。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Python获取CPU、内存使用率以及网络使用状态代码
- 使用nice,cpulimit和cgroups限制进程CPU使用率
- Oracle 监控索引的使用率 - 一沙弥
- Android 8.0 以后 CPU 使用率的方案研究
- Linux杀不死的进程之CPU使用率700%
- 微软称 Azure 云服务 Linux 使用率超过了 Windows
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。