【问题标题】:What is the life cycle of a tomcat connector thread?tomcat连接器线程的生命周期是多少?
【发布时间】:2020-12-04 17:37:07
【问题描述】:

我想知道 tomcat 连接器线程如何使用 CPU 资源和服务请求。

在我的应用程序中,我设置了 maxThreads=300、maxKeepAliveRequests=25、minSpareThreads=25。

我的理解是(NIO 线程)

  1. 当一个连接器线程忙碌时,这意味着它正在处理一个连接,例如创建连接、接受请求、通过同一连接为其他即时请求保持连接活动以及关闭连接。如果连接收到“maxKeepAliveRequests”数量的请求,也可以关闭连接。
  2. 当连接器线程空闲时,表示它正在等待连接并且什么都不做。这些线程在超过 minSpareThreads 时被杀死?
  3. 当连接器线程在等待诸如 IO 之类的东西或等待某个应用程序线程给出响应时,它可以接受新的连接。

现在,我查看这些 JMX mbean 值并发现:currentThreadCount.It 等于 282。

这个值是多少??从线程池中,我看到许多 http-nio 线程正在运行。但这与繁忙线程的数量相差甚远。请参见下图。我期望(currentThreadCount ~ Busy Threads + minSpareThreads),但它离maxThreads很远,几乎接近于maxThreads

【问题讨论】:

  • 如何配置“maxKeepAliveThreads”?我在 apache 文档中找不到它 (tomcat.apache.org/tomcat-9.0-doc/config/http.html)
  • 很久以前,Java 的线程池中存在一个错误,其中线程实际上是在队列中。每个线程将从队列的头部取出,并在完成时在尾部替换。这意味着即使负载非常轻,所有线程都在持续使用,因为每个线程在队列中被赋予相同的优先级。这是 15 年前的事,所以它可能已经修复,但我记得当时人们对此非常直言不讳。
  • 我注意到 Thomas 链接到 HTTP 连接器上的页面(我删除了我的其他评论,但是伙计,我真的很讨厌这个名字)。您是在独立模式下运行,还是在使用 AJP 连接器?还有什么?这可能会有所作为。
  • @ThomasKläger 它的 maxKeepAliveRequests。拼写错误

标签: java multithreading tomcat tomcat8


【解决方案1】:

似乎在默认连接器线程池上,您无法为线程定义空闲超时。

对于默认连接器线程池,我的意思是这样的配置(精简到特定部分):

<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="300" minSpareThreads="25" />
  </Service>
</Server>

您可以做什么:您可以创建一个(共享或特定于连接器的)执行程序,允许配置“maxIdleTime”:

<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
              maxThreads="300" minSpareThreads="25" maxIdleTime="60000" />

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
               executor="tomcatThreadPool" />
  </Service>
</Server>

如果您定义了多个连接器,它们可以共享同一个执行器,也可以为连接器创建不同的执行器。

【讨论】: