简介
本文介绍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 次握手超时时间对比,以时间短的为准。
请先
!