在 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,“CPU Estimation”可以通过将光标拖过一段时间的分析器历史来实现。对我来说,看起来所有 CPU 都在空转。Java 文件是Tomcat 例程下图所示的吗?它们并没有因为与 DSpace 相关(尽管我不是专家)而让我感到震惊,而且在 CPU 达到峰值时看起来也没有任何工作正在完成。
注意:堆栈跟踪在安静期间是相同的——唯一的区别是 CPU 时间(毫秒)是数百毫秒而不是数千毫秒。为了比下面更直接的比较,驼峰在 Thread.run() 中表示约 8,000 毫秒,而安静期消耗约 125 毫秒的 cpu 时间(尽管涵盖的时间量大致相同)。
最后,当请求应用程序的页面时,调用树中会出现一个后续的代码分支。如果它发生在峰值期间,加载整个页面可能只需要 400 毫秒的 CPU 时间。出现的代码分支是 ApplicationFilterChain.java 作为与 PooledExecutor$Worker.run() 旁边的一个完整的单独分支——两者都位于层次结构中的 java.lang.Thread.run() 之下。
试图解释堆栈跟踪时:EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run()
负责吗?
没有已知的相关活动的处理器峰值
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()
then <All threads>
)