2

在使用标准组件运行一个简单的 Grails 应用程序时,我在生产中遇到了一个非常奇怪的稳定性问题。

正常运行一段时间后,Tomcat ( jsvc) TCP 连接的数量会CLOSE_WAIT增加,直到 Tomcat 达到其线程上限 ( Maximum number of threads (N) created for connector),之后 Tomcat 就会停止。

通常这表明应用程序包含未正确关闭其 TCP 连接的代码。但是,我在这个应用程序中的 Grails 代码真的很琐碎,并且不会自行启动任何 TCP 连接,所以我想不出我的代码可能导致CLOSE_WAIT问题的任何场景。

此外,堆栈中的所有组件都是我认为没有错误的标准东西。我在捆绑在 Ubuntu 9.1 ( apt-get install tomcat6) 中的标准 Tomcat 6 下运行 Grails 1.2.1。

  • 这是一个已知问题吗?
  • 你会如何解决它?
4

2 回答 2

3

Filip Hanik 的“Tomcat 专家系列:性能调优”(2009 年)是 Tomcat 中性能调优和稳定性改进设置的出色指南。

我发现指南中的以下提示是相关的:

  • 调优选项概述:线程、Keep-Alives、TCP Backlog (acceptCount)、connectionTimeout、套接字缓冲区、连接器:BIO vs. APR vs. NIO(第 24 页)
  • 如何在 BIO/APR/NIO 连接器之间进行选择(第 26-32 页)
  • 调整 maxThreads(第 33-34 页)
  • 调整 maxKeepAliveRequests(第 35-36 页)
  • 调整 acceptCount(第 37-38 页)
  • 调整连接超时(第 39-40 页)
  • 调整 JVM 设置(第 44-50 页)

在此处描述的切换到 NIO 连接器的情况下,增加 maxThreads 并降低 connectionTimeout 可能会解决问题。

于 2010-03-04T14:08:29.033 回答
0

场景中是否包含防火墙?这些往往会在一段时间后放弃空闲的 TCP/IP 连接,从而给出您所看到的行为。

于 2010-03-03T20:19:05.213 回答