当前位置:  开发笔记 > 运维 > 正文

什么会导致Tomcat(v8)具有周期性规律性的CPU峰值

如何解决《什么会导致Tomcat(v8)具有周期性规律性的CPU峰值》经验,为你挑选了1个好方法。

在Windows 2012 RT(x64)TEST服务器上,我们正在运行Tomcat 8安装,并且CPU使用率在达到峰值使用率的常规性方面令人不安.

安装我们的应用程序后,但任何人访问它之前,会发生这种情况.我已经访问了几个页面并测试了一些功能,但没有任何可以创建我所知道的这种行为.

服务器上有2个虚拟处理器,每隔约20秒,CPU使用率将在一个处理Tomcat的处理器上达到100%,持续10秒(给予或接受).见下文:

周期性峰值图

模式的规律性向我表明在Tomcat 8的安装或设置中有些不正确.

我已经安装了YourKit Java Profiler(通过SO推荐),我希望能够解释导致这些峰值的原因,但是还没有看到线程启动的原因 - 至少部分是因为我的新意到YourKit.我确实将它附加到Tomcat启动文件,它似乎跟踪行为.

catalina日志在加标事件期间是静默的(就像我的应用程序日志一样)但是当我停止Tomcat时,有一些关于ThreadLocals的消息开始但无法删除然后:"...线程将随着时间的推移而更新尽量避免可能的内存泄漏."

我让服务器在周末运行,模式一直持续到今天,所以我不认为我的症状会消失.无论启动什么,现在只需每20秒启动一次这些线程(和/或YourKit)消耗系统上所有可用的RAM .

什么是可能的方法来隔离这种异常的Tomcat活动,并希望停止或纠正它?

YourKit中有许多图表和标签,因此我不愿列出可能有用的所有内容.感谢您帮助我缩小了YourKit(或其他工具)可以为我提供的问题.

来自catalina日志的关于启动的信息:

Apache Tomcat/8.0.23
Architecture: amd64
Java Home: C:\Program Files\Java\jre1.8.0_65
CATALINA_BASE: C:\Program Files\Apache Software Foundation\Tomcat 8.0

2015-12-08更新

在Gergely的请求下,该应用程序是DSpace的本地安装.它是一个带有Postgres SQL数据库后端的Java应用程序.我们从这里定制一个开源版本:http://www.dspace.org/introducing.我不确定还有什么可以提供帮助,我认为堆栈跟踪更多地揭示了什么是(并且没有)运行 - 见下文.

通过启用YourKit中的Stack Telemetry,可以通过将光标拖过一段Profiler历史记录来获得"CPU Estimation".对我来说,看起来所有CPU正在做的就是空转.Java文件是否在Tomcat例程下面如图?他们没有像DSpace那样打击我(尽管我不是专家)也不会看起来在CPU达到峰值时正在完成任何工作.

值得注意的是:在静默期间堆栈跟踪是相同的 - 唯一的区别是CPU时间(ms)是数百而不是数千毫秒.为了比下面的更直接的比较,hump在Thread.run()中表示~8,000ms,而静默期消耗~125ms的cpu时间(尽管覆盖大约相同的时间量).

最后,当请求应用程序的页面时,后续的代码分支出现在调用树中.如果它发生在尖峰期间,则可能只需要400毫秒的CPU时间来加载整页.出现的代码分支是ApplicationFilterChain.java,作为整个单独的分支以及PooledExecutor $ Worker.run() - 在层次结构中的java.lang.Thread.run()下面.

当试图解释堆栈跟踪时:EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run()负责吗?

处理器峰值没有已知的相关活动

CPU分析

2015-12-08更新#2

YourKit预先配置为隐藏某些java类名称模式,这些模式模糊了java.lang.Thread上的向下钻取.清除过滤器启用以下屏幕截图,显示峰值事件期间的绝大多数处理时间是通过调用以下3种方法:

java.io.WinNTFileSystem.canonicalize0

java.io.WinNTFileSystem.getBooleanAttributes(inFile.exists())

StardardRoot.java

我很抱歉还不了解Tomcat或DSpace以了解谁正在启动这些任务.(如果重要的是第一行正上方的那条线java.lang.Thread.run()然后)

更好的堆栈跟踪



1> veeTrain..:

感谢那些查看并回复此调查的人.正如各个人推测的那样,问题与我们的设置和Tomcat的使用有关 - 这不是Tomcat本身的问题(最有可能).

这是尝试在安装DSpace应用程序和Tomcat时没有完全知识的情况下回答这个问题,但我认为我知道这很危险并且可能对后续用户有帮助.

安装应用程序时DSpace,Tomcat的配置目录中有一些安装属性,用于确定是否允许在不重新启动Tomcat的情况下立即反映编码文件的更改.我们以前的这些设置在目录[tomcat]/conf/Catalina/localhost/中,三个文件中的每一个都包含一个小的,无关紧要的XML文件,例如(例如oai.xml):



您可以通过以下链接找到有关这些属性的文档:https: //wiki.duraspace.org/display/DSDOC5x/Installing+DSpace

在该文档中是关于reloadablecachingAllowed属性的建议.搜索" 生产中的Tomcat上下文设置 ".这是摘录(强调我的):

这些设置有,当你第一次开始使用DSpace的非常有用的,因为他们让你调整了DSpace的XMLUI(XSLT文件或CSS)或JSPUI(JSP)的,看看你的更改都会被Tomcat自动重载(而无需重新启动Tomcat) .然而,值得注意的是,Apache Tomcat文档建议生产基地保留默认值的地方(可重载="假" cachingAllowed ="真"),为使Tomcat能够自动重新加载可能会导致"显著运行时开销"的所有变化.

是否保留这些Tomcat设置完全取决于您.我们建议从它们开始,以便您可以更轻松地自定义您的站点,而无需重新启动Tomcat.较小的DSpace站点可能不会在生产中保留这些设置时发现任何性能问题. 较大的DSpace站点可能希望确保更加简化Tomcat性能.

当我将这些布尔标志切换到reloadable="false"并且cachingAllowed="true" 尖峰CPU体验立即停止时.我不知道有关"较大网站"的警告是否适用于我们,或者"精简表现"是否可以指我观察到的负面活动.

我认为我们的装置可能存在其他问题,允许这种特殊的表现形式; 一个不祥的线索是我们的生产服务器似乎在reloadable="true"配置中使用这些标志.Java,Tomcat,Windows DSpace都在同时获得新版本,因此很难确定为什么类似的Tomcat 设置会产生如此不同的结果.

我至少满足于现在有新的行为,并且系统已经平静下来.如果我了解更多,我会发布更多内容,但下一步会关注其他问题.

更新

FWIW,属性是直接控制Tomcat的设置,它们在不同版本之间进行了更改.例如,cachingAllowed在版本8中删除了,这意味着它可以从Context元素中删除.相比:

https://tomcat.apache.org/tomcat-8.0-doc/config/context.html#Attributes https://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Attributes

为了更好地衡量,这里是reloadableTomcat 8文档中的帮助文本:

如果您希望Catalina监视/ WEB-INF/classes /和/ WEB-INF/lib中的类以进行更改,则设置为true;如果检测到更改,则自动重新加载Web应用程序.此功能在应用程序开发期间非常有用,但它需要大量的运行时开销,不建议在部署的生产应用程序上使用.这就是为什么此属性的默认设置为false.但是,您可以使用Manager Web应用程序按需触发已部署应用程序的重新加载.

因此,似乎最终的答案是Windows 2012-R2上的Tomcat 8带有标志reloadable ='true'轮询WEB-INF/lib和WEB-INF /类的更改.要仔细阅读的文件夹和文件的数量很可能是导致这些激烈的尖峰CPU事件的原因.现在我将依赖reloadable ='false',它肯定会消除我们的症状.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有