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" 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过程中会遇到各种烦恼问题,没有人解答容易放弃。小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。