【字节二面】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不满足,需要开辟新的工作线程来帮助我们炒菜。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jsonpath和json数据(序列化eval()、反序列化loads())及断言处理(断言封装)

jsonpath:对json串进行搜索 安装jsonpath 安装:pip install jsonpath 导入: from jsonpath import jsonpath jsonpath能通过简单的方式就能提取给定JSON中的字段。 jsonpath官方地址:https://goessner.net/articles/JsonPath/ 在…

Python-VBA编程500例-022(入门级)

最长AB子串(Longest AB Alternating Substring)(或称为最长XY出现次数相同的子字符串)这个问题看似是一个比较抽象的编程问题,但在实际应用场景中,它可以用来解决一系列涉及平衡性和重复模式的实际问题。常见应用场景有: 1、DNA或RNA序列分析…

Obsidian插件:增加目录栏 flating toc

一、插件介绍 增加目录栏 插件市场搜索 flating toc安装即可 二、使用 写文档时候可以看到左边默认出现目录 可以自己配置一些相关设置 最后也可以安装一下插件样式设置插件,自己按照自己喜好调整

怎么搭建一个蛋糕店微信小程序_打造你的专属蛋糕店微信小程序

甜蜜满溢,一键尽享——打造你的专属蛋糕店微信小程序 在这个快节奏的时代,我们总是在寻找一种简单、快捷的方式来满足自己的味蕾。想象一下,当你忙碌了一天,疲惫不堪,突然想吃上一口美味的蛋糕,却又不想费…

使用GPU加速FLUENT计算

1.软件配置 一台具有Nvidia显卡的电脑 确保电脑正确安装有显卡驱动 可通过cmd窗口输入“nvidia-smi”命令,若看到下述窗口则说明显卡驱动安装正确。 安装最佳适配的CUDA版本,也可安装低版本CUDA驱动。 同样可通过cmd窗口输入“nvidia-smi”命令&#x…

关于移动视频-无线图传产品中的录像-云端录像-录像计划等说明

关于4G执法记录仪-智能安全帽-布控球-4GDVR等4G/5G图传产品中的录像机制 录像通常可保存在如下三个地方, 1)前端设备,例如执法仪内部的TF卡、DVR里面的SD卡或者硬盘;需要通过USB接上位机/采集站导出,或者手工上传到平…

速成软件书:真的是神器吗?

那些声称几天能让你精通软件的书籍通常是几乎不可信的。学习任何一项技能都需要时间、耐心和实践,不能依靠几天的学习就能达到精通的水平。这样的书籍往往宣传夸大,吹嘘简单快速的学习方法,实际效果可能不令人满意。 要想真正掌握一项技能&am…

几款主流好用的markdown编辑器介绍

当然,以下是关于几款主流好用的 Markdown 编辑器介绍的博客分享: 几款主流好用的 Markdown 编辑器介绍 在写作、笔记、博客等文档编辑过程中,Markdown 已经成为了许多人的首选格式。为了更高效地编写 Markdown 文档,选择一款适合…

【功能实现】新年贺卡(蓝桥)

题目分析: 想要实现一个随机抽取功能 功能拆解:题目给了数组,我们采用生成随机数的方式,随机数作为数组的索引值访问数组的值。 并返回获取到的值,将获取到的值插入到页面中。 document.addEventListener(DOMConten…

TouchGFX之画布

一、画布渲染器 画布控件渲染器(Canvas Widget Renderer,以下简称CWR)是强大的多功能TouchGFX插件,在使用相对较小的存储空间的同时保持高性能,可提供平滑、抗锯齿效果良好的几何图形绘制。TouchGFX使用CWR可绘制复杂…

Redis命令-String命令

4.3 Redis命令-String命令 String类型,也就是字符串类型,是Redis中最简单的存储类型。 其value是字符串,不过根据字符串的格式不同,又可以分为3类: string:普通字符串int:整数类型&#xff0…

【正点原子FreeRTOS学习笔记】————(14)事件标志组

这里写目录标题 一、事件标志组简介(了解)二、事件标志组相关API函数介绍(熟悉)三、事件标志组实验(掌握) 一、事件标志组简介(了解) 事件标志位:用一个位,来…

香港高才通计划abc类的申请材料各不同,附官方续签攻略!

香港高才通计划abc类的申请材料各不同,附官方续签攻略! 作为香港“史上最快获批签证”,高才通计划受到内地精英的热烈欢迎,香港高才通于2022年12月28日开放申请,截至2023年12月31日,香港高才通计划已接获62…

如何应对Android面试官->Android中的类加载机制,手写热修复框架(上)

前言 本章主要介绍 Android 中的类加载机制和 Java 中的类加载机制有什么不同? ClassLoader Android 中的顶层抽象基类也是 java.lang.ClassLoader;可以进入 Android SDK 中提供的 ClassLoader 看一下 可以看到,这个 ClassLoader 是一个抽象…

短视频矩阵系统新的ui迭代上线

短视频矩阵系统是一个复杂的系统,需要保证其稳定性以确保用户的使用体验。以下是一些关键的方法和步骤来确保开发的系统稳定性: 1. **设计合理的架构**:架构的合理性对于系统的稳定性至关重要。系统应设计为可扩展的,并具有良好的…

【JavaWeb】Day17.前端工程化——Vue项目开发流程

Vue项目开发流程 上个文章展示了建立新的Vue项目并打开网页,今天展示项目是如何形成的,即项目的开发流程。 用VScode打开新建的项目 ,render函数创建了虚拟DOM元素,在app.vue中定义。 Vue的组件文件以 .vue结尾,每个组…

TLSR8258 MTU、DLE(PDU)

本文基于泰凌微TLSR8258 M1S1 demo。 1.DLE:LE Data Packet Length Extension 中文全称:低功耗蓝牙数据包长度扩展。 这是一个在2014年12月2日正式发布的bluetooth for BLE添加的新特性,以支持在LL Data PDU更长的数据,最大支持…

echarts 3D示例 echart, echarts-gl

echarts官网有很多的炫酷的3D模型 来尝试实现下&#xff0c;使用原本的柱状图或者折线图代码创建echarts示例,使用cdn的方式引入echarts <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewp…

共享WiFi贴码真能赚钱还只是骗局?

最近WiFi贴码的风真的很大&#xff0c;想做的人很多&#xff0c;那么自然怕被骗的人也比比皆是。WiFi贴码真的如大家所说很赚钱&#xff1f;本期就来解答一下WiFi贴码到底能不能挣钱以及它分析是不是骗局的套路。 什么是WiFi贴码&#xff1f; 这边我们从共享wifi的鼻祖微火那了…

PADS导出元器件的值,并且自动摆放在相对的位置上显示

PADS导出元器件的值&#xff0c;并且自动摆放在相对的位置上显示 1. pads 显示出器件信息 点击右键鼠标&#xff0c;点击选择元器件&#xff0c;鼠标框选全部器件 在器件上右击&#xff0c;点击特性 PS&#xff1a;操作的时候&#xff0c;需要保证 器件有相关值的参数存在…