Tomcat:当连接数超过线程数时会发生什么?

7
根据此链接,属性server.tomcat.max-connections和server.tomcat.max-threads确定应用程序中的最大连接数和最大线程数。
我有两个问题:
  1. 如果在某一时刻连接数超过线程数会发生什么?未获得线程的连接会发生什么?
  2. 答:如果连接数超过线程数,那么未获得线程的连接将被放置在队列中等待可用的线程。

  3. 如果服务器需要处理的请求数量超过server.tomcat.max-connections怎么办?它会忽略在线程连接数量达到其最大值之后到达的请求吗?
  4. 答:是的,如果服务器需要服务的请求数量超过了server.tomcat.max-connections,则服务器将忽略这些请求并返回错误消息。

1个回答

10
如果在某个时刻连接数超过线程数会发生什么?没有获得线程的连接会发生什么?
它们将等待工作线程可用。
Tomcat使用“接受队列”来保存连接并在接受连接和传递给工作线程之间进行调度。控制此参数的Tomcat配置参数是:
acceptCount:当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。当队列已满时,将拒绝任何请求。默认值为100。
(来源 https://tomcat.apache.org/tomcat-8.0-doc/config/http.html)
如果服务器必须处理的请求数量超过{{server.tomcat.max-connections}},会发生什么?它会忽略在线程连接数达到最大值后到达的请求吗?
根据上述内容,连接将被接受直到队列限制,然后被拒绝。我认为这意味着客户端会收到TCP/IP级别的“连接被拒绝”。
(如果客户端超时并从客户端端关闭TCP/IP连接,那么排队的请求会发生什么不是完全清楚的。)

所以,如果 max-connections > max-threads 并且 (max-connections - max-threads) > acceptCount,那么我们永远不会达到 (max-connections - max-threads) 个挂起请求的数量。我说得对吗? - CrazySynthax
听起来很有道理。 - Stephen C
1
那么为什么我们会希望 maxConnections 大于 (maxThreads + acceptCount) 呢?假设 maxThread=200acceptCount=100,当服务器接收到 301 个同时请求时会发生什么呢?(难道不是每个传入的客户端请求都占用一个连接吗?) - payne
  1. 我不知道为什么“be”(或“we”)会这样做,我不会这么做。
  2. 它们不会立即被接受。一些客户端可能会收到“连接拒绝”或超时的消息。不确定。确切的行为可能取决于操作系统和协议堆栈配置等因素,以及后台清除的速度。
- Stephen C

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