容量评估实践:一个Tomcat最多能同时处理多少个HTTP请求?原创
1年前
365635
-
背景
-
Tomcat流量模型概览
-
如何评估Tomcat的最大容量
-
WHY
-
拓展
背景
系统上线后,要评估下系统容量+业务流量,可以避免系统资源浪费、防止系统资源不足导致系统不可用。
Tomcat流量模型概览
Tomcat的工作模式概览
Tomcat中Service的连接器工作模式概览
WHAT:如何评估Tomcat的最大容量
Tomcat同时处理的HTTP请求数:
MIN(server.tomcat.max-connections,server.tomcat.max-threads)。
server.tomcat.max-connections: 设置连接器的最大连接数。
server.tomcat.max-threads: 设置连接器的工作线程(线程池)的最大线程数。
server.tomcat.min-spare-threads: 设置连接器的工作线程(线程池)的最小空闲线程数。
server.tomcat.accept-count: 设置连接器的接受队列长度,即当所有工作线程都被占用时,可以接受的并发请求数量。
server.tomcat.max-http-header-size: 设置HTTP请求和响应头的最大大小。
server.tomcat.uri-encoding: 设置URI编码方式,默认为UTF-8。
server.tomcat.connection-timeout: 设置连接超时时间(以毫秒为单位)。
server.tomcat.max-swallow-size: 设置Tomcat容器能够处理的最大HTTP POST请求体大小。
在Spring Boot应用程序中考虑并发时,以下关键领域需要特别关注: 最大线程数——这是为处理服务器请求可以分配的最大线程数 共享的外部资源——调用共享的外部资源,如数据库 异步方法调用——这些方法调用会在等待响应时将线程释放回线程池 共享的内部资源——调用共享的内部资源,如缓存和潜在共享的应用程序状态 JackieTang,公众号:生活点亮技术扼住高并发、高性能的咽喉---Spring Boot并发进阶
WHY:原因剖析?
如果把tomcat比作一个火锅店,就餐的流程是取号、入座、叫服务员。
可以做以下三个类比:
(1)acceptCount 无法立刻响应请求时进入队列等待的最大请求数【门口最大的等待数】
排号的数量不是无限制的,火锅店的排号到了一定数据量之后,服务往往会说:已经客满。
(2)maxConnections 最大连接数【餐桌数】
如果所有的桌子都已经坐满,则表示餐厅已满,已经达到了服务的数量上限,不能再有顾客进入餐厅了。
(3)maxThreads:最大线程数【最多同时工作的厨师数】
每一个厨师,在同一时刻,只能给一张餐桌炒菜,就像极了JVM中的一条线程。
(4)min-spare-threads:最少有几个厨师同时在岗【值班厨师数】
整个流程如下:
如果 maxConnections 连接数满了,但是取号人数没有达到 acceptCount,则取号成功。
如果取号人数已达到acceptCount,则拿号失败,会得到Tomcat的Connection refused connect 的回复信息。
厨师的数量,比顾客的数量,肯定会少一些。一个厨师一定需要给多张餐桌炒菜,如果就餐的人越多,厨师也会忙不过来。
这时候就可以增加厨师,一增加到上限maxThreads的值,如果还是不够,只能是拖慢每一张餐桌的上菜速度,这种情况,就是大家常见的"上一道菜吃光了,下一道菜还没有上"尴尬场景。
拓展:任务满了,怎么办。。。
Tomcat 的默认核心线程数是 10,最大线程数 200,队列长度是无限长。 但是由于其运行机制和 JDK 线程池不一样: 在核心线程数满了之后,会直接启用最大线程数。 JDK的线程池是coreSize满了之后,后面的任务放到等待队列。 如果等待队列已满,则增加worker线程数处理新任务; 如果有新任务进来,等待队列仍然满,则继续启动新的worker线程,直到等于maxPoolSize。 这个线程池中的worker线程数等于maxPoolSize后,新进来的任务会按线程池配置的RejectExecutionHandler[拒绝策略]处理。 why技术,公众号:ImportNew一个 SpringBoot 项目能处理多少请求?
REFER
https://blog.csdn.net/weixin_43803688/article/details/124253382
https://www.zhihu.com/question/601023613
点赞收藏
分类: