Tomcat - maxThreads vs maxConnections

use*_*026 66 java tomcat

在Tomcat server.xml中,maxThreads与maxConnections是什么

我知道maxConnections是打开服务器的连接数量

maxThreads是请求处理线程的最大数量

但是两个配置参数如何协同工作,显然你不会将maxConnections设置为1000,将maxThreads设置为10

两个配置参数之间有什么关系?

<Connector 
    port="8443" 
    protocol="org.apache.coyote.http11.Http11Protocol"
    maxThreads="250" 
    SSLEnabled="true" 
    scheme="https" secure="true"
    clientAuth="false" 
    sslProtocol="TLS" 
    connectiontimeout="20000"
/>
Run Code Online (Sandbox Code Playgroud)

Tim*_*per 95

Tomcat可以在两种模式下工作:

  • BIO - 阻塞I/O(每个连接一个线程)
  • NIO -非阻塞I/O(比线程更多的连接)

Tomcat 7 默认BIO,虽然共识似乎是"不要使用Bio,因为Nio在各方面都更好".您可以使用文件中的protocol参数进行设置server.xml.

  • BIO将是HTTP/1.1org.apache.coyote.http11.Http11Protocol
  • NIO会的 org.apache.coyote.http11.Http11NioProtocol

如果您正在使用BIO,那么我相信它们应该或多或少相同.

如果您正在使用NIO,那么实际上"maxConnections = 1000"和"maxThreads = 10"甚至可能是合理的.默认值为maxConnections = 10,000和maxThreads = 200.使用NIO,每个线程可以提供任意数量的连接,来回切换但保留连接,因此您不需要进行所有通常的握手,这对于HTTPS来说尤其耗时,但即使是HTTP问题也是如此.您可以调整"keepAlive"参数以保持连接的时间更长,这样可以加速所有操作.

  • 如果“maxThreads=200”,并且服务器同时收到 201 个请求,会发生什么? (7认同)
  • 当请求超过可用线程时,将创建最多 maxThreads 的新线程。如果有更多请求到达,Tomcat 会接受它们,直到达到 maxConnections。连接排队直到有线程空闲。如果达到 maxConnections,操作系统会将其他连接排队。操作系统队列大小由acceptCount控制。如果操作系统队列已满,请求可能会被拒绝或超时。 (3认同)

Swa*_*nil 7

Tomcat文档开始,对于阻塞I / O(BIO),默认值为,除非使用了Executor(线程池)maxConnectionsmaxThreads否则将使用Executor的'maxThreads'值。对于非阻塞IO,它似乎并不依赖。maxThreads

  • 我不是拒绝投票的人,但我认为您尚未回答问题。您仅解释了默认值是什么,而没有向质询者讲授概念,而是有关概念的问题。 (5认同)
  • 得到它了。我认为这个问题是在询问它们之间的关系,而不是它们的实际含义。 (2认同)
  • 这个答案也很有用,因为它澄清了即使使用 BIO,maxConnections 也可以大于 maxThreads(我认为这是 Tomcat 7 中的新功能) (2认同)