Tomcat 6.0.28 由于浸泡测试期间线程阻塞而无响应

Posted

技术标签:

【中文标题】Tomcat 6.0.28 由于浸泡测试期间线程阻塞而无响应【英文标题】:Tomcat 6.0.28 Unresponsive Because of Blocked Threads During Soak Test 【发布时间】:2013-08-05 22:01:49 【问题描述】:

我们对在 Tomcat 6.0.28 和 OpenJDK 运行时环境 (IcedTea6 1.11.11) 上运行的新版 Java EE Web 应用程序进行了多次浸泡测试。问题出现在 Web 层。

一段时间后 - 第一次 50 分钟,第二次 1 小时,第三次 2.5 小时 - 我们的集群 Web 层中的一个随机 Tomcat 停止响应。查看线程转储,我们看到大量线程突然阻塞。

当问题发生时,线程数从 93 增加到 437。437 个线程中有 341 个在 WebappClassLoader 上被阻塞,如下所示:

"TP-Processor400" daemon prio=10 tid=0x00007f1ee432e800 nid=0x44d9 waiting for monitor entry [0x00007f1ec47c5000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java)
        - waiting to lock <0x00000006f561a758> (a org.apache.catalina.loader.WebappClassLoader)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329)

一个线程持有锁:

"TP-Processor53" daemon prio=10 tid=0x00007f1ee406f800 nid=0x7cbf runnable [0x00007f1f4545b000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ClassLoader.findLoadedClass0(Native Method)
        at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:923)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1386)
        - locked <0x00000006f561a758> (a org.apache.catalina.loader.WebappClassLoader)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329)

每隔一分钟的后续线程转储显示锁正在被释放,然后被其他线程获取。 2 分钟后,所有被阻塞的线程都被解除阻塞,服务器再次正常运行。

已在 Tomcat 错误跟踪器上报告了 WebappClassLoader 的死锁问题,其中应用程序使用自己的类加载器(https://issues.apache.org/bugzilla/show_bug.cgi?id=48694 与 https://issues.apache.org/bugzilla/show_bug.cgi?id=48903 重复),我们也是这种情况:我们的应用程序是嵌入式的在使用 org.opencms.ocee.base.CmsReloadingClassLoader 加载类的集群化 OpenCMS 安装中。

当阻塞发生时,我们还看到 GC 活动从 CPU 时间的 10% 增加到 50%,即使当时内存和堆没有增加。

问题是这种阻塞可能是由什么引起的,我们可以做些什么来解决它?

【问题讨论】:

你找到解决办法了吗?在 tomcat 7.0.42 上的几个请求后,我的 webapp 也停止响应 看起来这在 6.0.33 中已解决,但我找不到 7.0.x 的参考。 【参考方案1】:

显然,死锁的原因和修复程序都存在于错误本身的注释中。检查https://bz.apache.org/bugzilla/show_bug.cgi?id=48694的cmets

【讨论】:

以上是关于Tomcat 6.0.28 由于浸泡测试期间线程阻塞而无响应的主要内容,如果未能解决你的问题,请参考以下文章

分布式进阶 四 Ubuntu 14 04下安装Tomcat 6

有没有办法使用 rspec-serverspec 在部署期间测试是不是安装了特定版本的 java 或 tomcat?

RPC远程协议之Thrift非阻塞多线程处理

压力测试在 600 个线程的压力测试期间遇到 HTTP 错误 400

由于在应用程序安装期间超时而无法运行排毒测试

几款高压高阻电阻测试