因此,过去两周我们一直面临着一个问题。我们有一个在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进行了配置,但仍然没有成功!
谢谢。
答案 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线程池挂起,因此导致高负载平均值。