SpringBoot默认最大连接数的实践
目录
- 一、默认连接数概述
- 不同内嵌服务器的默认值
- 二、Tomcat 的详细配置(默认服务器)
- 1. 关键线程参数
- 2. 工作原理
- 3. 计算公式
- 三、其他服务器的配置
- 1. Jetty 配置
- 2. Undertow 配置
- 四、配置优化建议
- 1. 生产环境推荐设置
- 2. 考虑因素
- 五、如何验证当前配置
- 1. 通过Actuator端点
- 2. 通过JMX
- 六、操作系统级限制
- 1. linux系统限制
- 2. Windows系统限制
- 七、性能测试建议
- 八、常见问题解决
- 1. 出现"Connection refused"错误
- 2. 高并发下性能下降
- 3. 内存溢出风险
- 九、总结
Spring Boot 应用的最大连接数取决于多个因素,包括使用的Web服务器类型、配置以及底层操作系统的限制。下面我将详细分析不同场景下的默认值及其配置方式。
一、默认连接数概述
不同内嵌服务器的默认值
服务器类型 | 默认最大连接数 | 相关配置属性 |
---|---|---|
Tomcat (默认) | 8192 | server.tomcat.max-connections |
Jetty | 8192 | server.jetty.max-connections |
Undertow | 1024 | server.undertow.io-threads |
Netty (WebFlux) | 取决于事件循环线程数 | server.netty.* 相关配置 |
二、Tomcat 的详细配置(默认服务器)
1. 关键线程参数
# 默认配置 (在Springwww.devze.com Boot 2.x/3.x中) server.tomcat.threads.max=200 # 最大工作线程数 server.tomcat.threads.min-spare=10 # 最小空闲线程数 server.tomcat.max-connections=8192 # 最大连接队列长度
2. 工作原理
- 连接队列:当所有工作线程都忙碌时,新连接进入队列,最大长度为8192
- 线程池:Tomcat使用线程池处理请求,默认最大200线程
- 拒绝策略:当队列满时(8192+200),新的连接会被拒绝
3. 计算公式
理论最大并发 = max-threads
+ accept-count
(默认 = 200 + 8192 = 8392)
三、其他android服务器的配置
1. Jetty 配置
server.jetty.threads.max=200 server.jetty.threads.min=8 server.jetty.threads.idle-timeout=60000ms server.jetty.max-connections=8192
2. Undertow 配置
server.undertow.threads.io=8 # I/O线程数(默认CPU核心数2) server.undertow.threads.worker=256 # 工作线程数 server.undertow.buffer-size=1024 # 缓冲区大小
四、配置优化建议
1. 生产环境推荐设置
# Tomcat 生产配置示例 server.tomcat.threads.max=800 server.tomcat.threads.min-spare=100 server.tomcat.max-connections=10000 server.tomcat.accept-count=5000 # 连接超时设置 server.tomcat.connection-timeout=5s
2. 考虑因素
- 硬件资源:CPU核心数、内存大小
- 请求特性:长连接/短连接、请求处理时间
- 业务类型:CPU密集型 vs I/O密集型
五、如何验证当前配置
1. 通过Actuator端点
# 首先启用actuator management.endpoints.web.exposure.include=*
访问:http://localhost:8080/actuator/env/server.tomcat.*
2. 通过JMX
启动应用时添加JVM参数:
-Dspring.jmx.enabled=true -DJava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
使用JConsole或VisualVM连接查看
六、操作系统级限制
即使Spring Boot配置允许大量连接,仍需检查:
1. Linux系统限制
# 查看文件描述符限制 ulimit -n # 临时提高限制 ulimit -n 65535 # 永久修改 # /etc/security/limits.conf * soft nhttp://www.devze.comofile 65535 * hard nofile 65535
2. Windows系统限制
Windows的并发连接数限制主要取决于:
- 可用端口范围(通js常约16000个临时端口)
- 注册表中的
MaxUserPort
和TcpTimedwaitDelay
设置
七、性能测试建议
使用压测工具验证实际吞吐量:
# 使用wrk测试 wrk -t12 -c4000 -d30s http://localhost:8080/api # 使用JMeter jmeter -n -t test_plan.jmx -l result.jtl
监控指标:
- 活跃线程数
- 请求排队时间
- 错误率(特别是连接拒绝)
八、常见问题解决
1. 出现"Connection refused"错误
- 检查
max-connections
和accept-count
是否过小 - 检查操作系统文件描述符限制
- 检查线程池是否耗尽(线程数不足或处理阻塞)
2. 高并发下性能下降
- 适当增加
max-threads
- 优化业务逻辑减少处理时间
- 考虑使用异步处理(如WebFlux)
3. 内存溢出风险
每连接大约消耗2-4KB内存,10000连接约需40MB内存:
- 监控JVM内存使用
- 根据实际内存调整连接数上限
九、总结
Spring Boot默认连接处理能力:
- Tomcat/Jetty:最大8392并发(200线程 + 8192队列)
- Undertow:默认约1000并发(更依赖I/O线程配置)
实际生产环境中,应根据:
- 硬件配置
- 业务需求
- 性能测试结果
进行针对性调优,而非简单依赖默认值。记住:更高的连接数意味着更多的资源消耗,需要在吞吐量和资源利用率之间找到平衡点。
到此这篇关于SpringBoot默认最大连接数的实践的文章就介绍到这了,更多相关SpringBoot默认最大连接数内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论