文章目录
- 前言
- 内嵌服务器
- tomcat
- 测试
- undertow
前言
前几天刷B站看到了一个问题,感觉挺有意思的,“忽略接口本身性能,springboot应用程序能处理多少请求不被拒绝?”,今天便来探一探这个问题
本文主要重点是侧重于springboot应用程序内嵌服务器的并发请求处理能力以及参数,而非接口的QPS
本文测试使用的springboot版本为 2.3.12.RELEASE
内嵌服务器
众所周知,springboot应用程序默认的内嵌服务是tomcat
从pom.xml依赖跟踪后发现, springboot 2.3.12.RELEASE
默认使用内嵌服务器为tomcat 9.0.46
那么,默认情况下我们springboot应用程序能处理多少请求,取决于我们内嵌tomcat服务器配置
tomcat
从springboot官网翻阅,我们程序可配置的tomcat参数有很多,但结合配置的作用说明,我们整理发现如下几个参数与并发请求处理有关
点击查看官网配置
与并发请求处理相关配置
配置属性 | 作用 | 默认值 |
---|---|---|
server.tomcat.accept-count | 当所有可能的请求处理线程都在使用中时,传入连接请求的最大队列长度。(等待队列长度) | 100 |
server.tomcat.threads.max | 工作线程的最大数量。 | 200 |
server.tomcat.threads.min-spare | 工作线程的最小数量。 | 10 |
server.tomcat.max-connections | 服务器在任何给定时间接受和处理的最大连接数。一旦达到限制,操作系统仍然可以接受基于“acceptCount”属性的连接。 | 8192 |
当然我们也可以通过yml文件点过去进行查看其属性以及默认值
那么,这四者的关系是什么呢?
并发处理性能:
server.tomcat.threads.max
、server.tomcat.threads.min-spare
这两个是关于工作线程数的配置,即我们服务器至多可启用多少个线程处理我们的请求,此配置为服务器并发处理能力强弱
可以看到,我在页面请求了23次,都被tomcat服务最小工作线程(10)个处理了,为什么线程没有突破10的界限?因为我的逻辑很简单,线程数能够应对我们请求的频次,只有无法应对请求频次时,服务器的线程数会突破最小线程数设置,不断扩容直至向最大线程数
并发处理接受能力:
可以看作为承纳并发能力的容器能装多少东西
server.tomcat.max-connections
代表着tomcat服务器一定时间内可处理的最大连接数,server.tomcat.accept-count
代表着tomcat 等待队列;这两个配置便是我们今天要探究的程序请求并发接受能力
测试
@RequestMapping("hello")
@RestController
@Log4j2
public class HelloController {
@GetMapping
public String helloWorld() throws InterruptedException {
log.info("当前处理线程:{}", Thread.currentThread().getName());
TimeUnit.SECONDS.sleep(1);
return "helloWorld";
}
}
对应配置属性改为较小的值方便观察测试
server:
port: 8080
tomcat:
threads:
# 最小工作线程 (默认值为10)
min-spare: 5
# 最大工作线程(默认值200)
max: 10
# 最大请求连接数为(默认值8192)
max-connections: 30
# 等待队列长度为(可等待10个请求)(默认值100)
accept-count: 5
server:
port: 8080
tomcat:
threads:
# 最小工作线程 (默认值为10)
min-spare: 5
# 最大工作线程(默认值200)
max: 10
# 最大请求连接数为(默认值8192)
max-connections: 20
# 等待队列长度为(可等待10个请求)(默认值100)
accept-count: 5
经过测试,并发请求数大于 max-connections+ accept-count -1 时,我们的请求会被丢弃,抛出连接异常信息
结论:
如果springboot应用程序使用了tomcat程序,那么其能够支持的请求数为 max-connections+ accept-count -1
,如果不改配置的话则是(8192+100-1),即可以接收8291的数据慢慢处理,并发超过该数则会被拒接,请求也不会被处理了
undertow
todo