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

时间:2016-10-06 08:32:22

标签: java linux multithreading tomcat concurrency

因此,过去两周我们一直面临着一个问题。我们有一个在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注释。我们有一个带有30个线程的线程池的Executor。

如果我需要提供更多信息,请与我们联系。我已经安装并使用JProfiler进行了配置,但仍然没有成功!

谢谢。

2 个答案:

答案 0 :(得分: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上,这也解决了你的问题吗?

答案 1 :(得分:0)

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

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