【发布时间】:2015-12-07 16:49:53
【问题描述】:
在 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 中打开堆栈遥测,“CPU 估计”可通过在一段时间的分析器历史记录中拖动光标来实现。对我来说,看起来所有 CPU 都在空转。 Tomcat 例程 下图所示的 Java 文件是什么?它们并没有因为与 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(),然后是<All threads>)
【问题讨论】:
-
在 CPU 使用率较高时进行一些线程转储。
-
这不太可能是 Tomcat 出了问题。您能告诉我们有关您在服务器上部署的应用程序的任何信息吗?
-
您是否正在运行任何正在更改/重新索引 DSpace 项目的 cron 作业?那些会击中 Solr,然后会导致额外的活动。
-
@schweerelos,谢谢你的想法——我已经考虑过并寻找过这个想法。有计划的任务,但我不相信它们正在运行。这种断断续续的模式如此反复地扩展自身,并且具有这样的规律性,这在重新索引启动时不会发生。资源使用外观完全不同且“不规则”——不是周期性的。还有一些日志是在真正的索引发生时生成的,在这些峰值期间我没有看到。
-
@GergelyBacso,我的帖子中的更新是否提供了有关 Tomcat 或我的应用程序是否导致这些峰值的任何见解?谢谢
标签: performance tomcat dspace windows2012 yourkit