记一次tomcat部署java web项目开启热加载reloadable导致服务器CPU100%爆满的问题

服务器安装的tomcat比较多,配置的项目更多,(tomcat6/7/8加起来差不多十个,平均每只猫带六七个项目),服务器配置好像是2核8G的,很长一段时间,服务器cpu基本都保持在100%,尽管服务器配置的项目很多,但访问量并不高,cpu爆满肯定是原因的。后来参考网上资料,找出tomcat进程PID,使用jstack生成stack文本,使用ProcessExplorer找出高cpu线程TID,TID转成16进制并搜索目标如下(参考链接):

"ContainerBackgroundProcessor[StandardEngine[Catalina]]" #66 daemon prio=5 os_prio=0 tid=0x0000000055c8d800 nid=0x255a4 runnable [0x000000005e87e000]
   java.lang.Thread.State: RUNNABLE
	at java.io.WinNTFileSystem.getBooleanAttributes(Native Method)
	at java.io.File.exists(Unknown Source)
	at org.apache.catalina.webresources.FileResource.exists(FileResource.java:81)
	at org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:282)
	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:730)
	at org.apache.catalina.loader.WebappLoader.modified(WebappLoader.java:341)
	at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:285)
	at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5679)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(Redefined)
	at java.lang.Thread.run(Redefined)

   Locked ownable synchronizers:
	- None

说实话这个没看懂(webresources啥的,可能跟项目部署有点关系),但看出来是tomcat自身的代码,并不是部署的某个项目代码出现死循环之类的。通过观察服务器各个tomcat进程cpu占用情况,基本都是忽高忽低,由于tomcat太多,导致cpu一直都是满负荷,问题的关键就是,为何tomcat的进程cpu占用会忽高忽低,昨天白天分析了一段时间,无果,索性不看了,到了晚上再说(本以为这次还是解决不掉这个问题)。

到了晚上,基本快十一点了(公司就我一人),晚上操作服务器比较放得开,也是无意中,拿了另外两个服务器做测试,把服务器上配置的reloadable热加载关闭后,重启tomcat,发现cpu下去了,而且基本没什么波动,原来是热加载的锅。还是自己部署项目不够严谨,只是为了图省事,热加载永远都是开启状态,tomcat部署的项目太多,严重加重服务器运行负荷。


    

主要就是 reloadable="false"。

为了以防万一我把自动部署也关了,哈哈!!!

建议生产环境一定要关闭热加载,个别项目开发阶段方便测试,可以酌情开启。

文笔堪忧,读者见谅。

期间还发现一个严重的问题,JDK自带的很多工具,我竟然都不知道,更别谈用了,比如jvisualvm.exe、jstack.exe等等。

你可能感兴趣的:(java,tomcat,热加载,tomcat,cpu,web)