遇见一篇个人觉得讲tomcat参数配置讲得很好的文章,转载保留以备后面使用
SpringBoot开发最大的好处是简化配置,内置了Tomcat, 在SpringBoot2.0.x版本中内置Tomcat版本是8.5.x,SpringBoot内置Tomcat的默认设置中,Tomcat的等待队列长度默认是100,Tomcat的最小工作线程数默认分配10,Tomcat的最大线程数是200,最大连接数是10000,至于最大并发量和最大连接数,常常理解成最大并发量就是最大连接数,实际上是有些牵强的,最大连接数并不一定就是最大并发量。
SpringBoot内置Tomcat的包重要配置和类在
内置的tomcat
找到ServerProperties中的public static class Tomcat对象
在public static class Tomcat中有很多配置
默认最大连接数maxConnections = 10000
默认队列长度acceptCount = 100
默认最大工作线程数maxThreads = 200
默认最小工作线程数 minSpareThreads = 10
也就是说配置如下
在这里有个点儿
也就是说当服务器已经达到最大连接数后,操作系统任然可以根据队列长度来接收连接
有时候我们通常会认为在默认配置下,最大并发量就是最大连接数,超过最大连接数10000后会出现tomcat拒绝连接的情况,触发的请求任务超过默认值200(最大线程数)+默认值100(等待队列长度)后,tomcat会拒绝处理请求任务
最大并发量,每个人都它的理解是不一样的
1.如果在乎tomcat运行能够同时处理的任务数量,那最大并发量可能理解成最大工作线程数(max-threads)---不包含队列里的数量(acceptCount)
2.如果在乎tomcat运行能够接纳的最大最多的任务数量,那最大并发量可以理解成最大连接数(max-connections)+队列长度的数量(accept-count) --- 包含队列里的数量(acceptCount)
通常对SpringBoot内置Tomcat调优主要是针对最大连接数(maxConnections = 10000),队列长度(acceptCount = 100),最大工作线程数(maxThreads = 200)和最小工作线程数 (minSpareThreads = 10)按需设置,一般根据服务器的性能(CPU)以及该程序可能面临的业务峰值(IO数据库等操作)进行参考调优。
测试一下SpringBoot内置Tomcat的最小工作线程和最大工作线程以及最大连接数和队列长度
我用的版本是SpringBoot2.0.5
简单编写一个http请求的Controller
处理业务的Service
配置Tomcat的参数
在这里,我把accept-count配置成2 把max-connections配置成12,把max-threads配置成6,min-spare-threads配置成3
新建一个测试线程
这里用到hutool的http请求
启动的main方法
启动SpringBoot Tomcat 然后启动测试的main方法 30次请求访问
控制台日志
可以看到他的工作线程是3个,完全是符合server.tomcat.min-spare-threads=3的配置,而且线程数的使用没有达到最大线程数
假如我们把它的工作线程给临时阻塞着,故意让他达到最大线程数,40s时间
如此的话运行程序 请求30次
可以看到控制台首先进入了6个请求,阻塞着处理任务,那么配置server.tomcat.max-threads = 6是生效的,等40s之后6个任务线程处理完了业务,接下来又是6个任务线程处理,再等40后还处理了2个任务线程,请求的次数30次 实际处理任务数加起来只有14次
请求端日志(有报错)
报错信息如下
关键点在于
30次请求进入tomcat后,16条被拒接,14条请求被处理,处理先是最大线程数max-threads=6,在处理的时候,有6条请求加上正在处理的6条满足最大连接数max-connections=12,在这里,还有2条,是accept-count=2配置的2条,这2条请求任务恰恰是最容易忽略的,如此最终处理了14条请求,也就是说tomcat拒绝请求的条件是大于了最大连接数+队列长度的数量。
这里的测试是在设置很大超时时间下进行的
tomcat参数调优配置(和硬件本身的支撑有很大关系)
默认最小的线程数10就可以,这个参数没有多大必要去配置,默认的已经很好了,建议配置范围10-50之间
处理任务的最大线程数默认200,一般应用都是支持的,如果要优化看应用(写的程序)复不复杂,需不需要依托计算机的算力,也就是会不会大量消耗cpu,如果大量消耗cpu,那么这个max-threads不能设置过大,如果仅仅只是普通的入库查询操作,增删改查,max-threads可以设置大一些,但是也不能过大,过大会导致请求的响应变慢 ,建议设置在200-1200之间,大概是min-space-threads的20倍
最大连接线程数,这个值默认10000已经够大了,有时候真正的业务还没有达到这个值都已经要多服务部署了,因此该参数没有增大的必要,但是可以改小,改到max-thread的20倍左右
至于队列中的默认100这个值,也满足需求了,非要改建议大于min-spare-threads小于max-threads之间的某个倍数值就可以,这个参数不能设置太小。
一般的请求都是有超时机制的,一个http请求,可能几十秒后都还没有得到数据,那就会自动超时,自动超时并不代表被tomcat拒绝,可能是tomcat还没有开始处理到它
这里记录一下SpringBoot内置Tomcat配置多端口启动
这一条
转载自:SpringBoot+内置Tomcat配置,参数调优,最大并发量,最大连接数_springboot tomcat 调优-CSDN博客