当我的 Web 应用程序空闲时,独立的 tomcat 9 每 10 秒将 CPU 峰值提高到 50%

Posted

技术标签:

【中文标题】当我的 Web 应用程序空闲时,独立的 tomcat 9 每 10 秒将 CPU 峰值提高到 50%【英文标题】:Standalone tomcat 9 spikes CPU to 50% every 10 seconds while my web application is idle 【发布时间】:2018-02-18 06:49:33 【问题描述】:

我在 Windows Server 2012 R2 上使用 Tomcat 9.0.0.M22jdk1.8.0_131,并且我有一个 Spring Boot 网络部署在其上的应用程序,问题是每 10 秒 commons daemon service runner 将 cpu 峰值增加到 50% 尽管我部署的 Web 应用程序处于空闲状态,然后降至 0% 并且此行为每 10 秒继续发生一次。

在我的应用程序中,我没有任何每 10 秒运行一次的作业,而且当我从 Eclipse 在 Tomcat 上运行我的 Web 应用程序时,我没有注意到相同的行为,所以我猜测这是构建的 Tomcat在线程中。

【问题讨论】:

峰值持续多长时间?这会导致问题吗? 尖峰大约 3 秒,现在它没有引起问题,因为应用程序尚未发布,但我担心请求太多,应用程序不会在尖峰时间内响应,因为它发生了每 10 秒 我想知道为什么这篇文章要关闭投票! 使用 jdk 中的 visualvm,可以在 CPU 上启动“采样器”。峰值之后,您可以读取快照以检查哪个代码最活跃。现在,没有人能回答这样的问题,它需要更多的数据,更多的上下文。目前这是一个“它不起作用”的问题。如果我必须对此投票,我也建议放弃它。 (或者我会发布一个类似“问微软,因为它是根本原因”的答案)。 试试 Java Flight Recorder,docs.oracle.com/javacomponents/jmc-5-4/jfr-runtime-guide/… 这可以提供处理器使用、内存使用、线程调用树等详细信息 【参考方案1】: 在 CPU 负载达到峰值时立即执行一系列线程转储 您可以使用jdk/bin/jvisualvm 连接到您的tomcat 并重复按线程选项卡右上角的线程转储按钮,或者如果您更喜欢命令行(例如通过脚本),您也可以使用jdk/bin/jcmd <pid-of-your-tomcat> Thread.Print >> dumps.txt 每个转储显示当时存在的所有线程,每个线程的堆栈跟踪显示正在执行的内容 这应该会为您提供一些有关创建该负载的提示

【讨论】:

【参考方案2】:

如果没有更多信息,这只是猜测,但这可能是垃圾收集器试图每十秒完成一次工作,但无法驱逐任何项目,因为它们仍然需要。您可以尝试增加 Tomcat (-Xmx) 的内存。

【讨论】:

【参考方案3】:

有这么多信息很难,你能想到几点:

正如@jorg 所指出的,您可以使用线程转储来为您提供 有关任何阻塞线程的见解。 您说它在本地系统上运行良好,这并不一定意味着代码最适合服务器平台。仔细检查配置、maxThreads 等。 通过消除任何过多的垃圾收集来优化服务器 JVM。使用更高的最大堆内存 (-Xmx) 启动 JVM 会降低垃圾回收发生的频率。 现有的监控工具可以利用您的分析 (jVisualVM)。

【讨论】:

【参考方案4】:

我可以通过在 context.xml 中设置 reloadable="false" 来完全阻止这种行为。

【讨论】:

以上是关于当我的 Web 应用程序空闲时,独立的 tomcat 9 每 10 秒将 CPU 峰值提高到 50%的主要内容,如果未能解决你的问题,请参考以下文章

当我的应用程序已经运行时,如何在 Visual Studio Code 中运行独立的 dart 文件?

JMeter测试,提高Tomca性能,链接池

socket.io 在空闲时断开客户端的连接

当不再需要时,JVM 是不是会将空闲内存返还给操作系统?

Tomcat

保持 iPod 空闲并且仍然能够联系服务器