【字节二面】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.mzph.cn/news/775771.shtml

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

相关文章

mysql_数据_增删改查

DML(数据操作语言) 添加数据 指定字段:INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...); 全部字段:INSERT INTO 表名 VALUES (值1, 值2, ...); 批量添加数据:INSERT INTO 表名 (字段名1, 字段名2…

vscode ai插件“通义灵码”

文章目录 vscode ai插件“通义灵码”为什么安装?官网主要功能 vscode ai插件“通义灵码” 为什么安装? 通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成…

腾讯放大招了!AniPortrait开源上线!音频驱动逼真人像动画合成!人人都是歌手!

文章链接:https://arxiv.org/pdf/2403.17694 github链接:https://github.com/Zejun-Yang/AniPortrait 本文提出了AniPortrait,一个新颖的框架,用于生成由音频和参考肖像驱动的高质量动画。方法分为两个阶段。首先,从音…

linux i2c-tools使用总结

1,安装iic-tools sudo apt install i2c-tools -y 2,查看有几条iic总线 [root@sino-platform:/root]# ls /dev/i2c- i2c-0 i2c-1 i2c-2 i2c-3 3,查看i2c命令 [root@sino-platform:/root]# i2c i2cdetect i2cdump i2cget i2cset 4,iic-help命令 [root@sino-platform…

P1093 [NOIP2007 普及组] 奖学金 Python 列表中的字典元素

[NOIP2007 普及组] 奖学金 题目背景 NOIP2007 普及组 T1 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 5 5 名学生发奖学金。期末,每个学生都有 3 3 3 门课的成绩:语文、数学、英语。先按总分从高到低排…

【vue3学习笔记(二)】(第141-143节)初识setup;ref函数_处理基本类型;ref函数_处理对象类型

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 本篇内容对应课程第141-143节 课程 P141节 《初识setup》笔记 1、setup是所有组合式API“表演的舞台”,组件中所用到的所有数据、方法、监视数据、生命周期钩子等都需要配置在setup中。 2、setup的两种返回值&…

深入解析Oracle数据库ORA-01427错误:单行子查询返回多行的问题与解决办法

深入解析Oracle数据库ORA-01427错误:单行子查询返回多行的问题与解决办法 1、引言2、错误描述3、常见场景与示例4、解决方案5、声明 1、引言 在Oracle数据库日常运维与开发过程中,经常会遇到ORA-01427错误,这是一个很典型的数据库错误提示&am…

maya 导入导出anim脚本

目录 maya导入anim文件 测试ok maya导入anim文件,mel命令 maya导出anim文件 mel脚本 测试ok maya导出anim文件 python脚本 测试ok

Go语言介绍以及如何在Go语言中操作MySQL数据库

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

「Nginx」Nginx配置详解

「Nginx」Nginx配置详解 参考文章1、正向代理和方向代理2、指定域名允许跨域 参考文章 1、Nginx反向代理 2、nginx配置详解 3、Nginx服务器之负载均衡策略(6种) 1、正向代理和方向代理 2、指定域名允许跨域 map $http_origin $allow_cors {default 1;…

uniApp使用XR-Frame创建3D场景(6)播放模型动画

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 这篇我们讲解播放模型动画 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{{sec6}}"><xr-light type"ambient&qu…

【Qt学习】了解Qt文件系统 + 利用QFile类实现记事本功能

文章目录 1. 前言 - 关于Qt文件1.1 QIODevice 介绍1.2 QFile 介绍1.2 打开文件的方式 2. 实例 - 记事本功能2.1 功能实现2.2 getOpenFileName() 与 getSaveFileName() 的区别2.3 效果演示 3. 资源文件 1. 前言 - 关于Qt文件 文件操作 是应⽤程序必不可少的部分&#xff0c;Qt作…

android 消息提醒

1.创建 MyBackgroundService.java 继承 Service public class MyBackgroundService extends Service {Overridepublic void onCreate() {super.onCreate();Log.i("业务服务", "开起业务服务");//调用服务后在页面手机上创建一个通知消息。if (android.os…

日本EPSON 爱普生HUD汽车抬头显示系统芯片

目前HUD产品在新车上的配装率逐年上升&#xff0c;预计在2025年将达到30%。那么在介绍爱普生HUD整合方案之前&#xff0c;让我们先了解一下什么叫HUD。 HUD&#xff08;Head Up Display&#xff09;中文叫抬头显示系统&#xff0c;又被叫做平行显示系统。早被应用在飞机辅助…

vue基础——java程序员版(总集)

前言&#xff1a; ​ 这是一个java程序员的vue学习记录。 ​ vue是前端的主流框架&#xff0c;按照如今的就业形式作为后端开发的java程序员也是要有所了解的&#xff0c;下面是本人的vue学习记录&#xff0c;包括vue2的基本使用以及引入element-ui&#xff0c;使用的开发工具…

Github 2024-03-28 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4Jupyter Notebook项目2TypeScript项目2非开发语言项目2Solidity项目1Go项目1Open Interpreter: 本地代码运行和自然语言界面 创建周…

大型驱动水冷负载电阻、缓冲器、滤波器和快速放电电阻

EAK业界首创双面水冷负载电阻器&#xff0c;独特的设计&#xff0c;用户更方便的串联并联使用&#xff0c;强大的水流带走更多因充放电带来的热量。AlN高可靠性氮化铝基板保证了热膨胀不会影响电阻的工作。 液冷电阻器使用水或离子水作为冷却剂。通过添加乙二醇&#xff0c;可以…

如何高效阅读嵌入式代码

大家好&#xff0c;今天给大家介绍如何高效阅读嵌入式代码&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 高效阅读嵌入式代码需要一些技巧和实践经验。以下是一些建议&#xff…

HarmonyOS入门笔记--页面和自定义组件生命周期

文章目录 页面和自定义组件生命周期页面生命周期组件生命周期生命周期的调用时机 页面和自定义组件生命周期 生命周期流程如下图所示&#xff0c;下图展示的是被Entry装饰的组件&#xff08;首页&#xff09;生命周期。 自定义组件和页面的关系&#xff1a; 自定义组件&…

EdgeGallery开发指南

API接口 简介 EdgeGallery支持第三方业务系统通过北向接口网关调用EdgeGallery的业务接口。调用流程如下图所示&#xff08;融合前端edgegallery-fe包含融合前端界面以及北向接口网关功能&#xff0c;通过浏览器访问时打开的是融合前端的界面&#xff0c;通过IP:Port/urlPref…