Tomcat - maxThreads vs. maxConnections

117
在Tomcat的server.xml文件中,什么是maxThreadsmaxConnections
我理解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"
/>

更详细的介绍了acceptcountmaxconnectionsmaxthreadsminsparethreads,请参见此处:https://developpaper.com/tomcats-acceptcount-and-maxconnections/(存档在此处:https://archive.ph/sGGuL)。 - StackzOfZtuff
2个回答

155

Tomcat有两种工作模式:

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

Tomcat 7 默认使用 BIO,尽管共识似乎是"不要使用 BIO,因为在所有方面 NIO 都更好"。(而且 BIO 已经完全从8.5.0及更高版本中删除。)您可以使用 server.xml 文件中的 protocol 参数 来设置它。

  • BIO 将会是 HTTP/1.1 或者 org.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"参数以延长连接保持时间,这应该可以加快速度。


1
默认协议似乎是“HTTP/1.1”,它使用自动切换机制(https://tomcat.apache.org/tomcat-7.0-doc/config/http.html)。“...选择阻塞的基于Java的连接器或基于APR/native的连接器。如果PATH(Windows)或LD_LIBRARY_PATH(在大多数Unix系统上)环境变量包含Tomcat本地库,则将使用APR/native连接器。如果找不到本地库,则将使用阻塞的基于Java的连接器。” - alpa
6
如果 maxThreads=200,服务器收到 201 个同时请求会发生什么? - payne
3
当请求超过可用线程时,将创建新线程,直到达到最大线程数。如果有更多的请求到达,Tomcat会接受这些请求,直到达到最大连接数。连接会排队等待直到有一个线程空闲。如果达到了最大连接数,操作系统会将额外的连接排队。操作系统队列的大小由acceptCount控制。如果操作系统队列已满,请求可能会被拒绝或超时。 - talabes

17

来自Tomcat文档,对于阻塞I/O(BIO),maxConnections的默认值是maxThreads的值,除非使用了Executor(线程池),那么将使用Executor中的'maxThreads'值。对于非阻塞IO,似乎不依赖于maxThreads


8
我不是那个给你点踩的人,但我认为你没有回答问题。你只是解释了默认值,而没有教授提问者相关的概念,而问题正是关于这些概念的。 - Tim Cooper
2
明白了。我理解这个问题是在问它们之间的关系,而不是它们实际的含义。 - Swapnil
2
这个答案也很有用,因为它澄清了即使使用BIO,maxConnections也可以大于maxThreads(我认为这是Tomcat 7中的新功能)。 - Ivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接