所有分类
  • 所有分类
  • 未分类

SpringBoot–最大连接数和最大并发数

简介

本文介绍SpringBoot的最大连接数和最大并发数。

配置

SpringBoot默认使用tomcat处理请求。tomcat可以指定连接数、线程数等配置。

server:
  tomcat:
    # 请求处理线程都在使用中时,新连接请求的最大队列长度。默认:100
    accept-count: 100
    # 处理的最大连接数。若超过此值,仍可接受accept-count指定数量的请求。默认:8192
    max-connections: 8192
    threads:
      # 工作线程的最小数量。默认:10
      min-spare: 10
      # 工作线程的最大数量。默认:200
      max: 200
    # 连接的超时时间。已建立的连接,若此时间内没有请求到来,服务端会关闭该连接。
    connection-timeout: 20000

当连接数大于 max-connections + accept-count + 1时,服务器不会对新连接直接拒绝请求,而是不和新请求进行 3 次握手建立连接,超时后会请求连接超时。

线程池

Tomcat的线程池与JDK的线程池不一样

JDK 线程池:minThreads ==> queue ==> maxThreads ==> Exception
Tomcat 线程池: minThreads ==> maxThreads ==> queue ==> Exception

测试案例

配置

server:
  port: 8080
  tomcat:
    accept-count: 3
    max-connections: 6
    threads:
      min-spare: 2
      max: 3

查看socket连接容量

ss -nlt|grep 8080

Recv-Q:网络接收队列。
Send-Q:网络发送队列。

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

ss -nlt|grep 8080

初始状态

6 个并发连接

结果和静默状态一致:

9 个并发连接

10 个并发连接

11 个并发连接

结果和 10 个并发连接一样:

ss -nt 查看连接状态

ss -nt|grep 8080

Recv-Q:表示客户端有多少个字节发送但还没有被服务端接收
Send-Q:表示有多少个字节未被客户端接收。 

初始状态

6 个并发连接

9 个并发连接

针对 9 个并发连接的场景,补充个 netstat,显示一下网络相关信息:

10 个并发连接

和上面的结果比起来,只是队列中多加了个,由 3 个变成了 4 个。

11 个并发连接

​编辑

前面说过,当连接数大于 max-connections + accept-count + 1时,服务器不会对新连接直接拒绝请求,而是不和新请求进行 3 次握手建立连接,超时后会请求连接超时。

所以我们可以看到,当有 11 个并发连接,即超出最大的 10 个连接后,会有个连接一直停留在 SYN_RECV 状态,不会完成 3 次握手了。

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

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

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录