SpringBoot 最大连接数及最大并发数
Spring Boot 是一个基于 Spring 框架的快速开发框架,它本身并不直接管理数据库连接或网络连接的最大连接数和最大并发数。这些参数通常由底层的基础设施和组件来控制,例如:
-
数据库连接池 :Spring Boot 通常使用 HikariCP、Tomcat JDBC、HikariCP 或 Apache DBCP 等连接池来管理数据库连接。每个连接池都有自己的配置参数来设置最大连接数(例如
maxPoolSize
)、最小空闲连接数等。 -
Web服务器 :如果你使用的是内嵌的 Tomcat、Jetty 或 Undertow 作为你的 Web 服务器,它们各自有不同的配置参数来控制最大并发连接数。例如,Tomcat 的
maxConnections
和acceptCount
参数可以用来设置。 -
网络连接:对于网络连接,最大并发数可能受到服务器硬件、操作系统网络栈配置、网络带宽和服务器的网络参数(如 TCP 连接数)的限制。
-
Spring WebFlux:如果你使用的是 Spring WebFlux(响应式编程模型),它是基于 Netty、Undertow 或其他响应式引擎构建的,这些引擎也有自己的配置参数来控制并发数。
TOMCAT 最大连接数及最大并发数
每个Spring Boot版本和内置容器不同,结果也不同,这里以Spring Boot 2.7.10版本 + 内置Tomcat容器举例。
概序
在SpringBoot2.7.10版本中内置Tomcat版本是9.0.73,SpringBoot内置Tomcat的默认设置如下:
-
Tomcat的连接等待队列长度,默认是100
-
Tomcat的最大连接数,默认是8192
-
Tomcat的最小工作线程数,默认是10
-
Tomcat的最大线程数,默认是200
-
Tomcat的连接超时时间,默认是20s
XML
server:
tomcat:
# 当所有可能的请求处理线程都在使用中时,传入连接请求的最大队列长度
accept-count: 100
# 服务器在任何给定时间接受和处理的最大连接数。一旦达到限制,操作系统仍然可以接受基于"acceptCount"属性的连接。
max-connections: 8192
threads:
# 工作线程的最小数量,初始化时创建的线程数
min-spare: 10
# 工作线程的最大数量 io密集型建议10倍的cpu数,cpu密集型建议cpu数+1,绝大部分应用都是io密集型
max: 200
# 连接器在接受连接后等待显示请求 URI 行的时间。
connection-timeout: 20000
# 在关闭连接之前等待另一个 HTTP 请求的时间。如果未设置,则使用 connectionTimeout。设置为 -1 时不会超时。
keep-alive-timeout: 20000
# 在连接关闭之前可以进行流水线处理的最大HTTP请求数量。当设置为0或1时,禁用keep-alive和流水线处理。当设置为-1时,允许无限数量的流水线处理或keep-alive请求。
max-keep-alive-requests: 100
架构图
当连接数大于maxConnections+acceptCount + 1
时,新来的请求不会收到服务器拒绝连接响应,而是不会和新的请求进行3次握手建立连接,一段时间后(客户端的超时时间或者Tomcat的20s后)会出现请求连接超时。
TCP的3次握手4次挥手
时序图
Undertow最大连接数和最大并发数
Spring Boot 使用 Undertow 作为内嵌的 Web 服务器时,其最大连接数和最大并发数主要受以下几个配置参数的影响:
-
io-threads:这个参数代表 IO 线程数,负责处理非阻塞操作和多个连接。默认设置是每个 CPU 核心一个 IO 线程,但可以根据应用程序的并发连接数适当增加。如果设置过大,可能会导致打开文件数过多而启动项目报错 。
-
worker-threads:这个参数代表工作线程数,用于处理阻塞操作。默认情况下,其值是 io-threads 乘以 8。如果应用程序有大量的同步阻塞操作,可以适当增加这个值。例如,有建议将 worker-threads 设置为 256,以支持单节点的 256 个并发任务 。
-
buffer-size 和 buffers-per-region:这些参数影响缓冲区的大小和数量,进而影响 Undertow 的性能。buffer-size 是每个缓冲区的大小,而 buffers-per-region 是每个区分配的 buffer 数量。buffer 的总大小是 buffer-size 乘以 buffers-per-region 。
-
direct-buffers:设置为 true 可以启用直接内存(堆外内存)来存储缓冲区,这有助于减少垃圾回收的开销 。
-
max-connections:这个参数可以设置服务器可以打开的最大连接数 。
-
max-http-post-size:允许的最大 HTTP POST 内容大小 。
-
no-request-timeout:连接在不处理请求的情况下闲置的时间 。
请注意,这些配置的最佳值取决于具体的应用程序和负载情况。在调整配置之前,最好对应用程序的性能进行基准测试,并在每次更改后重新测试以验证更改的效果 。此外,还可以通过实现 WebServerFactoryCustomizer<UndertowServletWebServerFactory>
接口来编程式地配置 Undertow 12。启用 HTTP/2 也可以提高网络传输效率 。
在实际操作中,可能需要根据服务器的最大文件句柄数量和应用程序承担的体量来设置 worker-threads 的值,避免设置过大导致应用启动失败 。默认情况下,如果不显式设置 worker-threads,Undertow 会根据 io-threads 的值来初始化,通常是 io-threads 的 8 倍,但具体数量也要看服务器的最大支持文件句柄数量 。