当我的 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.M22 和 jdk1.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%的主要内容,如果未能解决你的问题,请参考以下文章