最全的免费PDF处理软件 OCR文字识别,图片转word,pdf转word OCR文字识别,导出带格式word WEB-IM 中文艺术字体 WEBRTC视频会议 ESP32智能小车 多功能PDF,流水码,二维码,条码 阿里通义全家桶 nginx代理转发时路径变化,session丢失处理 oracle 建表语句,id自增,insert时如果有id就用insert的id,没有就自增 nginx配置网站全站转发 Springboot中@ResponseBody返回对象JSON和返回String,json对象嵌套引用解决 Vue自定义组件的样式不生效 VUE自定义控件值改变,父控件跟着变 Vue3 自定义组件,setup 详细写法,组件名称怎么指定,组件属性怎么设置 从 JDK 5 开始到目前最新的 JDK 版本,Java 平台经历了多个重要的升级和功能改进 java http请求multipart/form-data数据,文本和附件 Jpa 使用Example模糊查询,多字段模糊查询 使用Spring Data JPA的查询方法命名规则,查询多条记录的一条记录可以通过以下方式实现 Spring Data JPA中,如果你想根据某个特定值查询单条记录 JPA JpaRepository 模糊查询的几种方式 pdf.js Nginx的 MIME TYPE问题导致的mjs文件加载出错的问题解决 The server responded with a non-JavaScript MIME type of "application/octet-stream". Vue.js中实现拖拽功 在使用JPA的JpaRepository进行模糊查询时,可以使用Like关键字,也可以使用Containing关键字。 three.js 设计一个类似红警的摄像机代码 three.js第三人称控制类代码 要使用FFmpeg将两个视频合成为一个视频 ffmpeg一个文件拆分成多个文件 ffmpeg调用方法,ffmpeg基础命令 java 语音播报 js监听页面所有网络请求 Three.js中文手册 Springboot多数据源配置 国外服务器网站会被百度收录吗?影响百度收录的情况有哪些 Spring Boot中内置Tomcat最大连接数、线程数与等待数 实践调优 jquery附件上传 java开发工具 联系我们 小张介绍 视频会议 文档操作 通义万相 通义千问 deepseek liblib哔哩哔哩旗下大模型 Stable Diffusion 哟派出海
扫码关注公众号了解更多内容 扫码了解更多

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

发布时间: 2023-02-16 预览次数:

一、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=100

对应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内存,线程数经验值2004核8G内存, 线程数经验值800
    (4核8G内存单进程调度线程数800-1000,超过这个并发数之后,将会花费巨大的时间在CPU调度上

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

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

针对4C8G配置,可以参考建议值:

tomcat:
accept-count: 1000
max-connections: 10000
max-threads: 800
min-spare-threads: 100

Spring Boot的默认配置信息,都在 springboot-autoconfigure-版本号.jar 这个包中。
其 中 上 述 Tomcat 的 配 置在/web/ServerProperties.java中。

二、最大并发量-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)。
用户端(浏览器端)也会报错