在SpringBoot2.7.10版本中内置Tomcat版本是9.0.73,SpringBoot内置Tomcat的默认设置如下:

  • Tomcat的连接等待队列长度,默认是100
  • Tomcat的最大连接数,默认是8192
  • Tomcat的最小工作线程数,默认是10
  • Tomcat的最大线程数,默认是200
  • Tomcat的连接超时时间,默认是20s

Spring mvc controller并发执行 springmvc最大并发多少_服务器


2架构图

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_02

当连接数大于maxConnections+acceptCount + 1时,新来的请求不会收到服务器拒绝连接响应,而是不会和新的请求进行3次握手建立连接,一段时间后(客户端的超时时间或者Tomcat的20s后)会出现请求连接超时。

3TCP的3次握手4次挥手

Spring mvc controller并发执行 springmvc最大并发多少_服务器_03

4时序图

Spring mvc controller并发执行 springmvc最大并发多少_服务器_04

5核心参数

AcceptCount

全连接队列容量,等同于backlog参数,与Linux中的系统参数somaxconn取较小值,Windows中没有系统参数。

NioEndpoint.java
MaxConnections

Acccptor.java

MinSpareThread/MaxThread

AbstractEndpoint.java

重点重点重点

Tomcat扩展了线程池增强了功能。

  • JDK线程池流程:minThreads --> queue --> maxThreads --> Exception
  • Tomcat增强后: minThreads --> maxThreads --> queue --> Exception
MaxKeepAliveRequests

长连接,在发送了maxKeepAliveRequests个请求后就会被服务器端主动断开连接。

在连接关闭之前可以进行流水线处理的最大HTTP请求数量。当设置为0或1时,禁用keep-alive和流水线处理。当设置为-1时,允许无限数量的流水线处理或keep-alive请求。

较大的 MaxKeepAliveRequests 值可能会导致服务器上的连接资源被长时间占用。根据您的具体需求,您可以根据服务器的负载和资源配置来调整 MaxKeepAliveRequests 的值,以平衡并发连接和服务器资源的利用率。

ConnectionTimeout

连接的生存周期,当已经建立的连接,在connectionTimeout时间内,如果没有请求到来,服务端程序将会主动关闭该连接。

  • 在Tomcat 9中,ConnectionTimeout的默认值是20000毫秒,也就是20秒。
  • 如果该时间过长,服务器将要等待很长时间才会收到客户端的请求结果,从而导致服务效率低下。如果该时间过短,则可能会出现客户端在请求过程中网络慢等问题,而被服务器取消连接的情况。
  • 由于某个交换机或者路由器出现了问题,导致某些post大文件的请求堆积在交换机或者路由器上,tomcat的工作线程一直拿不到完整的文件数据。

NioEndpoint.Poller#run()

KeepAliveTimeout

等待另一个 HTTP 请求的时间,然后关闭连接。当未设置时,将使用 connectionTimeout。当设置为 -1 时,将没有超时。

Http11InputBuffer.parseRequestLine

6内部线程

Acceptor

Acceptor:接收器,作用是接受scoket网络请求,并调用setSocketOptions()封装成为NioSocketWrapper,并注册到Poller的events中。注意查看run方法org.apache.tomcat.util.net.Acceptor#run

Poller

Poller:轮询器,轮询是否有事件达到,有请求事件到达后,以NIO的处理方式,查询Selector取出所有请求,遍历每个请求的需求,分配给Executor线程池执行。查看org.apache.tomcat.util.net.NioEndpoint.Poller#run()

TomcatThreadPoolExecutor

真正执行连接读写操作的线程池,在JDK线程池的基础上进行了扩展优化。

AbstractEndpoint.java

TomcatThreadPoolExecutor.java

JDK线程池架构图

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_05

Tomcat线程架构

Spring mvc controller并发执行 springmvc最大并发多少_spring boot_06

7测试

如下配置举例

使用ss -nlt查看全连接队列容量。

静默状态

Spring mvc controller并发执行 springmvc最大并发多少_服务器_07

6个并发连接

结果同上

9个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_spring boot_08

10个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_spring boot_09

11个并发连接

结果同上

使用ss -nt查看连接状态。

静默状态

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_10

6个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_后端_11

9个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_12

补充个netstat

Spring mvc controller并发执行 springmvc最大并发多少_spring boot_13

10个并发连接

结果同上,队列中多加了个

11个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_14

超出连接后,会有个连接一直停留在SYN_RECV状态,不会完成3次握手了。

超出连接后客户端一直就停留在SYN-SENT状态,服务端不会再发送SYN+ACK,直到客户端超时(20s内核控制)断开。

客户端请求超时(需要等待一定时间(20s))。

这里如果客户端设置了超时时间,要和服务端3次握手超时时间对比小的为准。

12个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_15

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!




在SpringBoot2.7.10版本中内置Tomcat版本是9.0.73,SpringBoot内置Tomcat的默认设置如下:

  • Tomcat的连接等待队列长度,默认是100
  • Tomcat的最大连接数,默认是8192
  • Tomcat的最小工作线程数,默认是10
  • Tomcat的最大线程数,默认是200
  • Tomcat的连接超时时间,默认是20s

Spring mvc controller并发执行 springmvc最大并发多少_服务器

相关配置及默认值如下

2架构图

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_02

当连接数大于maxConnections+acceptCount + 1时,新来的请求不会收到服务器拒绝连接响应,而是不会和新的请求进行3次握手建立连接,一段时间后(客户端的超时时间或者Tomcat的20s后)会出现请求连接超时。

3TCP的3次握手4次挥手

Spring mvc controller并发执行 springmvc最大并发多少_服务器_03

4时序图

Spring mvc controller并发执行 springmvc最大并发多少_服务器_04

5核心参数

AcceptCount

全连接队列容量,等同于backlog参数,与Linux中的系统参数somaxconn取较小值,Windows中没有系统参数。

NioEndpoint.java
MaxConnections

Acccptor.java

MinSpareThread/MaxThread

AbstractEndpoint.java

重点重点重点

Tomcat扩展了线程池增强了功能。

  • JDK线程池流程:minThreads --> queue --> maxThreads --> Exception
  • Tomcat增强后: minThreads --> maxThreads --> queue --> Exception
MaxKeepAliveRequests

长连接,在发送了maxKeepAliveRequests个请求后就会被服务器端主动断开连接。

在连接关闭之前可以进行流水线处理的最大HTTP请求数量。当设置为0或1时,禁用keep-alive和流水线处理。当设置为-1时,允许无限数量的流水线处理或keep-alive请求。

较大的 MaxKeepAliveRequests 值可能会导致服务器上的连接资源被长时间占用。根据您的具体需求,您可以根据服务器的负载和资源配置来调整 MaxKeepAliveRequests 的值,以平衡并发连接和服务器资源的利用率。

ConnectionTimeout

连接的生存周期,当已经建立的连接,在connectionTimeout时间内,如果没有请求到来,服务端程序将会主动关闭该连接。

  • 在Tomcat 9中,ConnectionTimeout的默认值是20000毫秒,也就是20秒。
  • 如果该时间过长,服务器将要等待很长时间才会收到客户端的请求结果,从而导致服务效率低下。如果该时间过短,则可能会出现客户端在请求过程中网络慢等问题,而被服务器取消连接的情况。
  • 由于某个交换机或者路由器出现了问题,导致某些post大文件的请求堆积在交换机或者路由器上,tomcat的工作线程一直拿不到完整的文件数据。

NioEndpoint.Poller#run()

KeepAliveTimeout

等待另一个 HTTP 请求的时间,然后关闭连接。当未设置时,将使用 connectionTimeout。当设置为 -1 时,将没有超时。

Http11InputBuffer.parseRequestLine

6内部线程

Acceptor

Acceptor:接收器,作用是接受scoket网络请求,并调用setSocketOptions()封装成为NioSocketWrapper,并注册到Poller的events中。注意查看run方法org.apache.tomcat.util.net.Acceptor#run

Poller

Poller:轮询器,轮询是否有事件达到,有请求事件到达后,以NIO的处理方式,查询Selector取出所有请求,遍历每个请求的需求,分配给Executor线程池执行。查看org.apache.tomcat.util.net.NioEndpoint.Poller#run()

TomcatThreadPoolExecutor

真正执行连接读写操作的线程池,在JDK线程池的基础上进行了扩展优化。

AbstractEndpoint.java

TomcatThreadPoolExecutor.java

JDK线程池架构图

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_05

Tomcat线程架构

Spring mvc controller并发执行 springmvc最大并发多少_spring boot_06

7测试

如下配置举例

使用ss -nlt查看全连接队列容量。

静默状态

Spring mvc controller并发执行 springmvc最大并发多少_服务器_07

6个并发连接

结果同上

9个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_spring boot_08

10个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_spring boot_09

11个并发连接

结果同上

使用ss -nt查看连接状态。

静默状态

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_10

6个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_后端_11

9个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_12

补充个netstat

Spring mvc controller并发执行 springmvc最大并发多少_spring boot_13

10个并发连接

结果同上,队列中多加了个

11个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_14

超出连接后,会有个连接一直停留在SYN_RECV状态,不会完成3次握手了。

超出连接后客户端一直就停留在SYN-SENT状态,服务端不会再发送SYN+ACK,直到客户端超时(20s内核控制)断开。

客户端请求超时(需要等待一定时间(20s))。

这里如果客户端设置了超时时间,要和服务端3次握手超时时间对比小的为准。

12个并发连接

Spring mvc controller并发执行 springmvc最大并发多少_Endpoint_15