【问题标题】:Tomcat seems to not be able to deallocate threadsTomcat 似乎无法释放线程
【发布时间】:2018-01-25 07:52:05
【问题描述】:

在我的 tomcat 上,我在连接器上设置了 maxThreads=300。 在请求高峰期间,我可以看到分配了大约 180 个线程来处理请求,这很好。然而,2 小时后,即使请求被丢弃,这 180 个线程仍然在 VM 内。

有没有办法控制tomcat/JVM清理未使用线程的时间?

编辑 这是我的连接器配置(同时我将 maxThreads 更新为 300):

<Connector port="8080" protocol="HTTP/1.1" maxThreads="300"
           connectionTimeout="20000"
           redirectPort="8443" />

【问题讨论】:

  • 请向我们展示您的完整连接器配置
  • 搞定了,其实很基础
  • 你试过设置maxIdleTime看Kayaman的建议
  • @Phate,这个问题有点老了,但只是想知道你现在是否可以提供输入。即使我们面临同样的问题,负载减少后tomcat线程也没有下降。他们处于空闲状态并等待任务。您是否使用 Executor 或任何其他方式解决了此问题?虽然在我们较低的环境中,它工作正常,当我们在较低的环境中进行负载测试时,线程在 3-5 分钟内下降到初始数量。重现 scnerios 变得越来越困难。

标签: java tomcat java-8


【解决方案1】:

Connector元素除了maxThreads之外没有太多与请求线程相关的配置,但是如果你配置了Executor你可以显式设置maxIdleTime并验证线程是否真的不能是否关闭。

【讨论】:

  • 这是我的第一个想法。但默认 maxIdleTime 是 1 分钟。 tomcat.apache.org/tomcat-8.0-doc/config/executor.html
  • @dit 这是Executor 的默认值,虽然可以合理地期望Connector 共享相同的默认值(尽管它们仅共享maxThreads 属性),但让我们您明确设置maxIdleTime进行验证。
  • 使用执行程序而不是默认值是最佳实践吗?这种方法有什么缺点吗?
  • @Phate 执行器可以在连接器之间共享,这是主要的区别。这是您可以访问更具体的属性的唯一方法(似乎)。为什么将maxThreads 更新为300?一开始你担心线程没有被关闭,但现在你增加了最大限制?你知道你在做什么吗?
  • 我需要关闭线程,但也能够在高峰时间处理大量请求......大约 4 小时后,线程数开始下降,看起来很慢.
【解决方案2】:

您可以在连接器上设置连接池超时,check it out

我们通常建议 10 分钟左右的值,所以设置 connection_pool_timeout 为 600(秒)。如果你使用这个属性, 请同时设置属性keepAliveTimeout(如果已设置 显式)或您的 AJP 连接器元素中的 connectionTimeout Tomcat server.xml 配置文件为类似值。警告: keepAliveTimeout 和 connectionTimeout 必须以毫秒为单位。 所以如果你设置 JK connection_pool_timeout 为 600,你应该设置 Tomcat keepAliveTimeout 或 connectionTimeout 为 600000。

【讨论】:

  • 这是指从网络服务器到 Tomcat 的连接,而不是 Tomcat 用来处理请求的线程。
猜你喜欢
  • 2016-02-11
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多