性能文章>容量评估实践:一个Tomcat最多能同时处理多少个HTTP请求​?>

容量评估实践:一个Tomcat最多能同时处理多少个HTTP请求​?原创

7月前
242135
  • 背景

  • Tomcat流量模型概览

  • 如何评估Tomcat的最大容量

  • WHY

  • 拓展

背景

系统上线后,要评估下系统容量+业务流量,可以避免系统资源浪费、防止系统资源不足导致系统不可用。

本次以Tomcat这个Servlet容器来分析一个SpringBoot项目最多能同时处理多个请求?

Tomcat流量模型概览


Tomcat的工作模式概览


Tomcat中Service的连接器工作模式概览

WHAT:如何评估Tomcat的最大容量

Tomcat同时处理的HTTP请求数:
MIN(server.tomcat.max-connectionsserver.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:最少有几个厨师同时在岗【值班厨师数】

整个流程如下:

(1)取号:如果maxConnections连接数没有满,就不需要取号,因为还有空余的餐桌,直接被大堂服务员领上餐桌,点菜就餐即可。
如果 maxConnections 连接数满了,但是取号人数没有达到 acceptCount,则取号成功。
如果取号人数已达到acceptCount,则拿号失败,会得到Tomcat的Connection refused connect 的回复信息。
(2)上桌:如果有餐桌空出来了,表示maxConnections连接数没有满,排队的人,可以进入大堂上桌就餐。
(3)就餐:就餐需要厨师炒菜。
厨师的数量,比顾客的数量,肯定会少一些。一个厨师一定需要给多张餐桌炒菜,如果就餐的人越多,厨师也会忙不过来。
这时候就可以增加厨师,一增加到上限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

 

点赞收藏
bit01
请先登录,查看3条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

为什么要做代码Review?

为什么要做代码Review?

日常Bug排查-集群逐步失去响应

日常Bug排查-集群逐步失去响应

浅析AbstractQueuedSynchronizer

浅析AbstractQueuedSynchronizer

5
3