SpringBoot项目高并发问题
在SpringBoot项目中通常我们没有处理并发问题,但是使用项目本身还是支持一定的并发量,因为在SpringBoot中内嵌Tomcat容器,而Tomcat在spring-configuration-metadata.json文件中设置了关于并发的默认配置:{"name": "server.tomcat.max-connections","description": "“服务器在任何给定时间接受和
在SpringBoot
项目中通常我们没有处理并发问题,但是使用项目本身还是支持一定的并发量,因为在SpringBoot
中内嵌Tomcat
容器,而Tomcat
在spring-configuration-metadata.json
文件中设置了关于并发的默认配置:
{
"name": "server.tomcat.max-connections",
"description": "“服务器在任何给定时间接受和处理的最大连接数。",
"defaultValue": 8192
},
{
"name": "server.tomcat.accept-count",
"description": "当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。",
"defaultValue": 100
},
{
"name": "server.tomcat.max-http-form-post-size",
"description": "http使用Post请求时候的表达最大容量。",
"defaultValue": "2MB"
},
{
"name": "server.tomcat.max-keep-alive-requests",
"description": "在连接关闭之前可以管道化的最大HTTP请求数。",
"defaultValue": 100
},
{
"name": "server.tomcat.threads.max",
"description": "工作线程的最大数量。",
"defaultValue": 200
},
{
"name": "server.tomcat.threads.min-spare",
"description": "工作线程的最小数量。",
"defaultValue": 10
},
{
"name": "server.servlet.session.timeout",
"description": "会话超时。如果未指定持续时间后缀,将使用秒。",
"defaultValue": "30m" // 这里m表示分钟,s表示秒
},
在默认配置下:
在默认情况下当连接数超过8192
时,就会出现拒绝连接。
最小线程数量为10
,最大线程数量为200
,等待队列长度设置为acceptCount=100
,当可分配的线程数全部用完之后,后续的请求将进入等待队列等待,等待队列满后则拒绝处理。
而这些默认配置可以在配置文件中进行修改,比如:
## 服务器最大连接数,默认8192
server.tomcat.max-connections=10000
## 等待队列长度,默认100。
server.tomcat.accept-count=1000
## 最大工作线程数,默认200。(4核8g内存,线程数经验值800。)
server.tomcat.threads.max=800
## 最小工作空闲线程数,默认10。(适当增大一些,以便应对突然增长的访问量)
server.tomcat.threads.min-spare=100
可以用Jmeter
测试工具来测试下配置前后的并发量的性能,比如我这里先使用默认配置:
Jmeter
怎么使用可以查看博客:Jmeter教程(一) - 入门
配置服务器,然后重启后,在运行以下Jmeter
压力测试工具:
其中:
Label:取样器名称(或者是事务名)。
#Samples:取样器运行次数(提交了多少笔业务)。
Average:请求(事务)的平均响应时间,单位为毫秒。
Min:请求的最小响应时间,单位为毫秒。
Max:请求的最大响应时间,单位为毫秒。
Std.Dev:响应时间的标准方差。
Error%:事务错误率。
在第二次中,提交次数为第一次的3
倍:
- 平均响应时间小于
3
倍,大约为2
倍,也就是说直观上来说加快了效率; - 请求的最小响应时间变得更小了,请求的最大响应时间这里却增大了,所以可能设置的配置值不合理。
- 总的来说就是确实在略微变大服务器的并发配置的时候,效率上有一些提升。
我们知道在Http1.1
之后就默认支持TCP
长连接,已达到连接复用,提高资源复用率和请求效率。而我们通常在请求的时候适用的请求头部字段为Connection:keep-alive
。如果说用户在一次请求后,并没有其余的操作了,而使用长连接来保持这个请求,很明显这里就会导致资源的浪费问题。
那么,我们可以在后台设置其超时时长,可以从两个方面设置:
session
超时,我们知道默认的session
超时为30
分钟,所以我们可以设置一个较短的时间来达到断开连接的目的;可以在用户登录成功后,就设置一个Session
的超时时长,比如:session.setMaxInactiveInterval(6 * 60); // 默认单位为秒,这里为6分钟。
keep-alive
超时,每个连接可以设置其超时时长,可以参考博客:springboot 长连接 keepalive 记录
更多推荐
所有评论(0)