尽管流量很低,Tomcat上的负载平均值也异常高

问题描述 投票:1回答:2

所以过去两周我们一直面临着一个问题。我们有一个在3个节点上运行的应用程序。环境是:

Framework : Spring Boot on Tomcat
Runtime   : JVM 1.8
OS        : centOS 7

过去几周,所有节点的负载平均值从0开始,并在几小时内逐渐增加到30。尽管事实上我们每秒只能获得大约1-2个请求。此外,Tomcat部署在8GB,4核处理器上,CPU利用率在380-395%之间波动。

我们分析了我们的应用程序并执行了一个线程转储在我们的分析过程中,我们发现当负载平均值> 10时,可运行线程的数量保持在20左右,等待的线程数大约为80。

这些等待线程的堆栈跟踪是:

sun.misc.Unsafe.park(Unsafe.java:-2) native
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
java.util.concurrent.ThreadPoolExecutor.getTask(:-1) 
java.util.concurrent.ThreadPoolExecutor.runWorker(:-1) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(:-1)

还应该指出我们大量使用Springs @Async annotation.We有一个Executor,其线程池为30个线程。

如果我需要提供更多信息,请告诉我。我已经安装和配置了JProfiler但仍然没有成功!

谢谢。

java linux multithreading tomcat concurrency
2个回答
0
投票

我在Debian 8上遇到与Tomcat 8(安装了JasigCAS服务)类似的问题。在启动tomcat 8之后,几个小时之后,随机地,一些内核达到了100%的使用率。但是tomcat正在回应。在官方tomcat 8跟踪器目前的错误报告60578(https://bz.apache.org/bugzilla/show_bug.cgi?id=60578)有类似的问题。

因为解决方案建议从Debian backports存储库安装新的tomcat 8版本(8.5.9)。我使用了这个解决方案,从第一眼看,我发现问题已经解决了。

也许你可以将这个版本安装到你的CentOS 7上,这也解决了你的问题?


0
投票

在这里回答我自己的问题:

实际问题与Tomcat无关。我们的代码被卡在一个while循环上,该循环正在评估为真实并且永远运行。这导致我们的Tomcat线程池挂起,因此导致高负载平均值。

© www.soinside.com 2019 - 2024. All rights reserved.