Spring Boot中内置Tomcat最大连接数、线程数与等待数 实践调优

这篇具有很好参考价值的文章主要介绍了Spring Boot中内置Tomcat最大连接数、线程数与等待数 实践调优。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 Spring Boot 框架中,我们使用最多的是Tomcat,这是 Spring Boot 默认的容器技术,而且是内嵌式的 Tomcat。Tomcat 是 Apache 基金下的一个轻量级的Servlet 容 器 , 支 持 Servlet 和 JSP 。Tomcat服务器本身具有Web服务器的功能,可以作为独立的Web服务器来使用。

一、Spring Boot应用中Tomcat建议配置

Spring Boot 能支持的最大并发量主要看其对Tomcat的设置,可以在配置文件中对其进行更改。要了解具体参数的默认值,一个简单的方法是在application.properties 配置文件中输入配置项,默认值就会显示出来。

默认配置:
最大工作线程数,默认200。
server.tomcat.max-threads=200
 
最大连接数默认是10000
server.tomcat.max-connections=10000
 
等待队列长度,默认100。
server.tomcat.accept-count=100
 
最小工作空闲线程数,默认10。
server.tomcat.min-spare-threads=10

对应application.yml 配置文件如下所示:

server:
  port: 9000
  tomcat:
    uri-encoding: UTF-8
    max-threads: 800 #最大工作线程数量
    min-spare-threads: 20 #最小工作线程数量
    #max-connections: 10000 #一瞬间最大支持的并发的连接数
    accept-count: 200 #等待队列长度

参数解释

线程数的经验值为:1核2G内存,线程数经验值200;4核8G内存, 线程数经验值800。
(4核8G内存单进程调度线程数800-1000,超过这个并发数之后,将会花费巨大的时间在CPU调度上)

等待队列长度:队列做缓冲池用,但也不能无限长,消耗内存,出入队列也耗CPU。

maxThreads规定的是最大的线程数目,并不是实际running的CPU数量;实际上,maxThreads的大小比CPU核心数量要大得多。这是因为,处理请求的线程真正用于计算的时间可能很少,大多数时间可能在阻塞,如等待数据库返回数据、等待硬盘读写数据等。因此,在某一时刻,只有少数的线程真正的在使用物理CPU,大多数线程都在等待;因此线程数远大于物理核心数才是合理的。也就是说,Tomcat通过使用比CPU核心数量多得多的线程数,可以使CPU忙碌起来,大大提高CPU的利用率。

二、最大并发量-maxThreads和maxConnections参数

比较容易弄混的是maxThreads和maxConnections这两个参数:

maxThreads是指Tomcat线程池最多能起的线程数
maxConnections则是Tomcat一瞬间最多能够处理的并发连接数。
比如 maxThreads=1000,maxConnections=800,
假设某一瞬间的并发是1000,那么最终Tomcat的线程数将会是800,即同时处理800个请求,剩余200进入队列“排队”,如果acceptCount=100 (100个请求进入排队),另外100个请求会被拒掉。

并发量指的是连接数,还是线程数?当然是连接数(maxConnections) 。

200个线程如何处理10000条连接?
Tomcat有两种处理连接的模式

一种是BIO,一个线程只处理一个Socket连接;
另一种就是NIO,一个线程处理多个Socket连接。
由于HTTP请求不会太耗时,而且多个连接一般不会同时来消息,所以一个线程处理多个连接没有太大问题。

Tomcat的最大连接数参数是maxConnections,这个值表示最多可以有多少个Socket 连接到Tomcat上。
BIO模式下默认最大连接数是它的最大线程数(缺省是200),
NIO模式下默认是10000 ,APR模式则是8192。

为什么不开更多线程?
多开线程的代价就是增加上下文切换的时间,浪费CPU时间。另外还有就是线程数增多,每个线程分配到的时间片就变少。多开线程并不等于提高处理效率。
那增加最大连接数(maxConnections)呢?
增加最大连接数,支持的并发量确实可以上去。但是在没有改变硬件条件的情况下,这种并发量的提升必定以牺牲响应时间为代价。

三、maxConnections和acceptCount参数

maxConnections 和acceptCount的关系为:当连接数达到最大值maxConnections后,系统会继续接收连接,进行排队,但不会超过acceptCount的值。
Tomcat最大连接数取决于maxConnections这个值加上acceptCount这个值,在连接数达到了maxConenctions之后,Tomcat仍会保持住连接,但是不处理,等待其它请求处理完毕之后才会处理这个请求。
当队列(acceptCount)已满时,任何的连接请求都将被拒绝。acceptCount的默认值为100。简而言之,当调用HTTP请求数达到Tomcat的最大连接数时,还有新的HTTP请求到来,这时Tomcat会将该请求放在等待队列中,这个acceptCount就是指能够接受的最大等待数,默认100。如果等待队列也被放满了,这个时候再来新的请求就会被Tomcat拒绝(connection refused)。
用户端(浏览器端)也会报错文章来源地址https://www.toymoban.com/news/detail-522275.html

到了这里,关于Spring Boot中内置Tomcat最大连接数、线程数与等待数 实践调优的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 内置 Tomcat 线程数优化配置

    本文解析springboot内置tomcat调优并发线程数的一些参数,并结合源码进行分析。 线程池核心线程数 server.tomcat.min-spare-threads :该参数为tomcat处理业务的核心线程数大小,默认值为10 线程池最大线程数 server.tomcat.max-threads :该参数为tomcat处理业务的最大线程数大小,默认值为2

    2024年02月09日
    浏览(26)
  • TCP报文与三次握手四次断开、TCP最大连接数与文件打开数限制、keepalive、tcpdump、wireshark抓包分析工具

    tcp详解、tcp与udp对比等 TCP:传输控制协议 UDP:用户数据报协议 源端口和目的端口字段:各占 2 字节(16位)。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接

    2024年04月22日
    浏览(33)
  • 深入理解 Spring Boot 内置工具类:ReflectionUtils

    🎉欢迎来到架构设计专栏~深入理解 Spring Boot 内置工具类:ReflectionUtils ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:架构设计 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限

    2024年02月20日
    浏览(34)
  • 【宝藏系列】几款好用的 Spring Boot 内置工具类

    断言是一个逻辑判断,用于检查不应该发生的情况 Assert 在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert 断言工具类,通常用于数据合法性检查 获取对象的基本信息 判断工具 其他工具方法 字符串判断工具 字符串操作工具 路径相关工具方法

    2024年02月14日
    浏览(29)
  • 别再自己瞎写工具类了,Spring Boot 内置工具类应有尽有

    断言是一个逻辑判断,用于检查不应该发生的情况 Assert 在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert 断言工具类,通常用于数据合法性检查 ObjectUtils 1.获取对象的基本信息 2.判断工具 3.其他工具方法 StringUtils 1.字符串判断工具 2.字符串操作

    2023年04月18日
    浏览(34)
  • spring boot--自动化注入组件原理、内嵌tomcat-1

    前言 我们知道开发spring boot项目,在启动类上添加注解@SpringBootApplication ,然后引入要自动注入的组件依赖,然后现application.properties中加上相应配置就可以自动注入这个组件,那么下面看看自动注入组件是如何实现的 一、@SpringBootApplication 注解 1、查看SpringBootApplication 类如下

    2024年02月15日
    浏览(27)
  • Spring Boot打war包部署到Tomcat,访问页面404 !!!

    水善利万物而不争,处众人之所恶,故几于道💦 Spring Boot打war包部署到Tomcat,访问页面404 !!! 解决办法:检查Tomcat版本和Jdk的对应关系,我的Tomcat是6.x,jdk是8版本显然不兼容。所以访问不到。更换9版本后,正常访问 tomcat官网对版本的介绍 注意:部署到外部tomcat的时候,

    2024年02月19日
    浏览(31)
  • Spring Boot 3.x 引入springdoc-openapi (内置Swagger UI、webmvc-api)

    接触的原因 因开发自己的项目时,写接口文档很繁琐,查到后端都在用 swagger 等接口工具来记录接口文档,于是学习了一下,本文记录个人配置过程,有问题欢迎指正交流😁 Swagger: Swagger是一种Rest API的表示方式,它是标准的、语言无关的工具,这种表示方式不仅人可读,

    2024年04月27日
    浏览(22)
  • 【Spring面试】一、SpringBoot启动优化与最大连接数

    调试: 写一个测试接口: 服务配置中的相关参数: 此时,JMeter模拟100QPS: 成功40个,刚好是 (max-connections)+(accept-count) ,而这两个参数的默认值可以在Spring-boot-autoconfigure.jar的配置元数据的json文件 spring-configuration-metadata.json 中找到:(当然也可以直接在application.yaml中按

    2024年02月09日
    浏览(30)
  • 【Spring Boot】Spring Boot 配置 Hikari 数据库连接池

    数据库连接池是一个提高程序与数据库的连接的优化,连接池它主要作用是提高性能、节省资源、控制连接数、连接管理等操作; 程序中的线程池与之同理,都是为了优化、提高性能。

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包