发现问题过程
首先打开项目服务器,此服务器部署了很多项目,看他在没有压力情况下,资源使用率
命令:top
load average:负载也不高
1个进程在运行
zombie:0,没有僵尸进程
2个CPU:user和sys 都不高
mem:还剩2个G,充足
再看进程CPU使用情况:都比较底
但是在观察一段时间返现进程突然升高,然后又降低了
这是怎么回事?
为了进一步查看CPU使用率
命令:mpstat -P ALL 1 观察一段时间
如图,进一步验证了CPU隔断时间就会升高,那是那个进程或线程导致升高呢
命令:pidstat -ut 1,观察一段时间
如图:48秒和59秒分别出现,看到都是进程:10764中的线程:10814,导致CPU升高,所以,定位线程后,下面就需要定位为什么这个线程导致CPU升高
命令:printf "%xn" 10814(TID)十进制转成16进制
命令:jstack 10764 | grep 2a3e -A 30,如果没有出现多试几次此命令
[adminm@test_tomcat1 ~]$ jstack 10764 | grep 2a3e -A 30
"ContainerBackgroundProcessor[StandardEngine[Catalina]]" #30 daemon prio=5 os_prio=0 tid=0x00007fea0c0c1800 nid=0x2a3e runnable [0x00007fe9ed9d1000]
java.lang.Thread.State: RUNNABLE
at java.io.UnixFileSystem.canonicalize0(Native Method)
at java.io.UnixFileSystem.canonicalize(UnixFileSystem.java:172)
at java.io.File.getCanonicalPath(File.java:618)
at org.apache.catalina.webresources.AbstractFileResourceSet.file(AbstractFileResourceSet.java:90)
at org.apache.catalina.webresources.DirResourceSet.getResource(DirResourceSet.java:101)
at org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:281)
at org.apache.catalina.webresources.Cache.getResource(Cache.java:62)
at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:216)
at org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(StandardRoot.java:225)
at org.apache.catalina.loader.WebappClassLoaderbase.modified(WebappClassLoaderbase.java:705)
at org.apache.catalina.loader.WebappLoader.modified(WebappLoader.java:342)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:286)
at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5612)
at org.apache.catalina.core.Containerbase$ContainerBackgroundProcessor.processChildren(Containerbase.java:1392)
at org.apache.catalina.core.Containerbase$ContainerBackgroundProcessor.processChildren(Containerbase.java:1396)
at org.apache.catalina.core.Containerbase$ContainerBackgroundProcessor.processChildren(Containerbase.java:1396)
at org.apache.catalina.core.Containerbase$ContainerBackgroundProcessor.run(Containerbase.java:1364)
at java.lang.Thread.run(Thread.java:748)
[adminm@test_tomcat1 ~]$ jstack 10764 | grep 2a3e -A 30
"ContainerBackgroundProcessor[StandardEngine[Catalina]]" #30 daemon prio=5 os_prio=0 tid=0x00007fea0c0c1800 nid=0x2a3e runnable [0x00007fe9ed9d1000]
java.lang.Thread.State: RUNNABLE
at java.util.zip.ZipFile.getEntry(Native Method)
at java.util.zip.ZipFile.getEntry(ZipFile.java:316)
- locked <0x00000000fb61e1c0> (a java.util.jar.JarFile)
at java.util.jar.JarFile.getEntry(JarFile.java:240)
at java.util.jar.JarFile.getJarEntry(JarFile.java:223)
at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.getArchiveEntry(AbstractSingleArchiveResourceSet.java:97)
at org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(AbstractArchiveResourceSet.java:257)
at org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:281)
at org.apache.catalina.webresources.Cache.getResource(Cache.java:62)
at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:216)
at org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(StandardRoot.java:225)
at org.apache.catalina.loader.WebappClassLoaderbase.modified(WebappClassLoaderbase.java:705)
at org.apache.catalina.loader.WebappLoader.modified(WebappLoader.java:342)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:286)
at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5612)
at org.apache.catalina.core.Containerbase$ContainerBackgroundProcessor.processChildren(Containerbase.java:1392)
at org.apache.catalina.core.Containerbase$ContainerBackgroundProcessor.processChildren(Containerbase.java:1396)
at org.apache.catalina.core.Containerbase$ContainerBackgroundProcessor.processChildren(Containerbase.java:1396)
at org.apache.catalina.core.Containerbase$ContainerBackgroundProcessor.run(Containerbase.java:1364)
at java.lang.Thread.run(Thread.java:748)
此时找开发协助定位问题
解决方案
命令:ps aux|grep 10764
发现是中台后台项目,是使用了Tomcat启动的,进入Tomcat配置文件
命令:vi /datadisk/tomcat/tomcat-obdpadmin-8082/conf/server.xml
-----------------------------
resourceName="UserDatabase"/>
unpackWARs="true" autoDeploy="true"> prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
--------------------------------------------
修改后保存:wq!
命令:kill -9 10764
/datadisk/tomcat/tomcat-obdpadmin-8082/bin/startup.sh
tail -f /datadisk/tomcat/tomcat-obdpadmin-8082/logs/catalina.out
项目正常起来后
再次使用命令:pidstat -ut 1,观察一段时间
如图,没有再次升高,解决问题
为什么这么改呢?
reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。在开发阶段将reloadable属性设为true,有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议在Web应用的发版时reloadable设为false。



