【字节二面】SpringBoot可以同时处理多少请求

目录

  • 一、示例代码
  • 二、那么springboot可以处理多少请求?
  • 三、maxConnections、maxThreads、acceptCount的关系

一、示例代码

@RestController
@Slf4j
public class RequestController {@GetMapping("/test")public String test(HttpServletRequest request) throws Exception{log.info("线程:{}",Thread.currentThread().getName());Thread.sleep(2000);return  "success";}
}

配置连接池配置

server:tomcat:threads:# 最少线程数min-spare: 10# 最多线程数max: 20# 最大连接数max-connections: 20# 最大等待数accept-count: 10

然后通过Jmeter进行压测

设置100个线程
在这里插入图片描述

请求接口

在这里插入图片描述

在这里插入图片描述

我们看到异常率是60%,意思就是100个请求,有60个报错,40个访问成功,这个40是我们设置的内嵌的Tomcat中最大连接数和最大等待数的和等于40;

二、那么springboot可以处理多少请求?

即相当于问max-connectionsaccept-count这两个值的默认值是多少

可以打开spring-configuration-metadata.json文件,里面记录了springboot配置默认值

在这里插入图片描述
文件目录:spring-boot-autoconfigure\2.6.13\spring-boot-autoconfigure-2.6.13.jar!\META-INF

在这里插入图片描述

线程池常用4大参数

{"name": "server.tomcat.threads.min-spare","type": "java.lang.Integer","description": "Minimum amount of worker threads.","sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat$Threads","defaultValue": 10
},
{"name": "server.tomcat.threads.max","type": "java.lang.Integer","description": "Maximum amount of worker threads.","sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat$Threads","defaultValue": 200
},
{"name": "server.tomcat.max-connections","type": "java.lang.Integer","description": "Maximum number of connections that the server accepts and processes at any given time. Once the limit has been reached, the operating system may still accept connections based on the \"acceptCount\" property.","sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat","defaultValue": 8192
},
{"name": "server.tomcat.accept-count","type": "java.lang.Integer","description": "Maximum queue length for incoming connection requests when all possible request processing threads are in use.","sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat","defaultValue": 100
}
  • min-spare :最小线程数
    最小工作空闲线程数,默认10,适当增大一些,以便对应突然增长的访问量

  • max-threads : 最大线程数
    每一次Http请求到达Web服务,tomcat都会创建一个线程来处理该请求,那么最大线程数决定了web服务容器可以同时处理多少个请求。 maxThreads默认值200, 肯定建议增加,但是增加线程是有成本的,更多的线程不仅仅会带来更多的线程上下文切换成本,而且意味着带来更多的内存消耗。JVM默认的情况下在创建新线程时会分配大小为1M的线程栈,所以更多的线程意味着需要更多的内存,线程数的经验值为 1C2G内存为200,线程数经验值为200; 4C8G线程数经验值为800

  • maxConnections:最大连接数
    这个参数是指在同一时间,tomcat能够接受的最大连接数。对于Java的阻塞式BIO,默认值是maxthreads的值;如果在BIO模式使用定制的Executor执行器,默认值将是执行器中maxthreads的值。对于Java 新的NIO模式,maxConnections 默认值是10000。
    对于windows上APR/native IO模式,maxConnections默认值为8192,这是出于性能原因,如果配置的值不是1024的倍数,maxConnections 的实际值将减少到1024的最大倍数。
    如果设置为-1,则禁用maxconnections功能,表示不限制tomcat容器的连接数。
    maxConnections和accept-count的关系为:当连接数达到最大值maxConnections后,系统会继续接收连接,但不会超过acceptCount的值

  • accept-count : 最大等待数
    当所有的请求处理线程都在使用时,所能接收的连接请求的队列最大长度。当队列已满时,任何的连接请求都将被拒绝。 accept-count 默认值100 。详细来说,当调用http请求数达到tomcat的最大线程数时,还有新的http请求到来,这时tomcat会将该请求放在等待队列中,这个acceptCount就是能够接收的最大等待数,默认100。如果等待队列也被放满了,这个时候再来新的请求的请求就会被tomcat拒绝(connection refused)

springboot最多可以处理多少请求呢?就是8192+100 = 8292

三、maxConnections、maxThreads、acceptCount的关系

我们可以把tomact比做一个饭店,流程是取号、入座、叫服务员可以做三个形象的类比

在这里插入图片描述

(1)thread.min-spare 最小线程数
可以类比为厨师的核心个数,同一个时刻只能给一张餐桌炒菜,就像极了JVM中的一条线程
(2) maxThreads 最大线程数
可以类比为厨师的最大个数
(3) maxConnections 最大连接数
可以类比为饭店的餐桌数量,如果所有的桌子都已坐满了,则表示餐厅已满,已经达到服务的数量上限,不能再有顾客进入餐厅了
(4) acceptCount 最大等待数
可以类比餐厅的排号处能够容纳排号的最大数量。排号的数量不是无限制的,餐厅的排号到了一个数量之后,服务往往会说:已经可以客满

整个流程大致如下:

  1. 取号: 如果maxConnentions连接数没有满,就不需要取号,因为还有空余的餐桌,直接被大堂服务员领上餐桌,点菜就餐就可。如果macConnections 连接数满了,但是取号人数没有达到acceptCount 则取号成功。如果取号人数达到acceptCount,则拿号失败,会得到tomcat的 connection refused connect 的回复信息
  2. 上桌:如果有餐桌空出来了,表示maxConnections连接数没有满,排除的人可以进入大堂就餐
  3. 就餐:就餐需要厨师炒菜。厨师的数量比顾客的数量肯定会少一些。一个厨师一个需要给多张餐桌炒菜,如果就餐的人越多,厨师也会忙不过来。这时候就可以增加厨师,一旦增加到maxThreads的值,如果还是不够,只能拖慢每一张餐桌的上菜速度,这种情况就是大家常见的 “上一道菜吃完了,下一道菜还有没上的” 的尴尬场景

前面配置中,最小工作工作线程数(thread.min-spare)是10,最大工作线程数( maxThreads)是20,最大连接数(maxConnections)是30,最大队列数(acceptCount)是10,QPS是100,其中30会进入最大连接数,10会进入最大队列,其他60会等待超时时间,如果超市时间内,有线程吃完饭,则60个线程还是可以进去,最小线程数10不满足,需要开辟新的工作线程来帮助我们炒菜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/573852.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【详细讲解React 快速入门教程】

🔥博主:程序员不想YY啊🔥 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家💫 🤗点赞🎈收藏⭐再看💫养成习惯 🌈希望本文对您有所裨益,如有…

Linux基础命令大全

1、pwd:显示当前路径 cd :切换目录 用法:cd cd ../ 切换到上级目录 cd / 切换到根目录 cd ~ (或只有cd )切换到当前用户主目录(home底下以用户名命名的文件夹) /root目录mkdir 创建目录 mkdir 目录名 -p 递归创建目录…

代码随想录 Day-25

力扣题目 509.斐波那契数 思路 很理所当然的,可以使用递归的方式其次是用动态规划的方式,动态规划的核心就是递推公式。 那么递推和递归一字之差,有什么区别呢?(递推和递归的区别) 1、递归 class Solutio…

OD C卷 - 反射计数

反射计数(200) 给定一个包含0 、1的二维矩阵;一个物体从给定的初始位置出发,在给定的速度下移动,遇到矩阵的边缘则发生镜面反射,无论物体经过0还是1,都不影响其速度;经过t时间单位后…

C++ 之多态虚函数原理及应用

文章目录 多态基本概念和原理虚函数的基本原理和概念虚析构和纯虚析构多重继承中的虚函数小结 多态基本概念和原理 多态的基本概念 **多态是C面向对象三大特性之一** 多态的定义 多态是一种面向对象编程概念,指同一个行为(方法)在不同的对象上…

ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异

引言 随着互联网的快速发展,信息的获取变得比以往任何时候都更加便捷。在数字化时代,人们对于获取准确、及时信息的需求愈发迫切。传统搜索引擎通过关键词匹配的方式为用户提供了大量的信息,然而,这种机械式的检索方式有时候并不…

ubuntu 中安装docker

1 资源地址 进入ubuntu官网下载Ubuntu23.04的版本的镜像 2 安装ubuntu 这里选择再Vmware上安装Ubuntu23.04.6 创建一个虚拟机,下一步下一步 注意虚拟机配置网络桥接,CD/DVD选择本地的镜像地址 开启此虚拟机,下一步下一步等待镜像安装。 3…

书生·浦语大模型实战营之全链路开源体系

书生浦语大模型实战营之全链路开源体系 为了推动大模型在更多行业落地开花,让开发者们更高效的学习大模型的开发与应用,上海人工智能实验室重磅推出书生浦语大模型实战营,为广大开发者搭建大模型学习和实践开发的平台,两周时间带…

【Java程序设计】【C00352】基于Springboot的疫情隔壁酒店管理系统(有论文)

基于Springboot的疫情隔壁酒店管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 🍅文末点击卡片获取源码🍅 开发环境 运行环境:推荐jdk1.8; 开发工具:eclipse以…

C语言例4-28:求两个正整数的最大公约数。

算法分析&#xff1a; 输入两个正整数m和nm%n 的余数 r&#xff0c;然后 mn;nr;当 n0, 则m是最大公约数&#xff0c;算法结束&#xff1b;否则转至执行2&#xff0c;重复上述过程&#xff0c;直到n0为止 代码如下&#xff1a; //求两个正整数的最大公约数。 #include<std…

PointNet++论文复现(三)【抽象层定义、分类模型 代码详解】

目录 抽象层 特征提取 整体代码 分类模型 以 pointnet2_cls_msg.py 为例 整体代码 抽象层 位于 pointnet2_utils.py 定义 特征提取 整体代码 # 特征提取 对应PointNet++ 中的 set abstraction (集合抽象化) # 首先, 通过 sample_and_group 操作形成局部 group # 然后, 对…

JAVA实现大文件的分片上传与下载(SPRINGBOOT+VUE3)

版本&#xff1a;6.5.40 代码&#xff1a;up6-jsp-springboot: Web大文件上传-jsp-springboot示例 - Gitee.com nosql示例 nosql示例不需要进行任何配置&#xff0c;可以直接访问测试。 SQL示例 1.创建数据库 2.配置数据库连接 3.自动下载maven依赖 4.启动项目 启动成功 6.访…