开发者

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 (默认)8192server.tomcat.max-connections
      Jetty8192server.jetty.max-connections
      Undertow1024server.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个临时端口)
      • 注册表中的MaxUserPortTcpTimedwaitDelay设置

      七、性能测试建议

      使用压测工具验证实际吞吐量:

      # 使用wrk测试
      wrk -t12 -c4000 -d30s http://localhost:8080/api
      
      # 使用JMeter
      jmeter -n -t test_plan.jmx -l result.jtl
      

      监控指标

      • 活跃线程数
      • 请求排队时间
      • 错误率(特别是连接拒绝)

      八、常见问题解决

      1. 出现"Connection refused"错误

      • 检查max-connectionsaccept-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)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜