前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >容量评估实践:一个Tomcat最多能同时处理多少个HTTP请求​?

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

作者头像
烟雨平生
发布2023-09-05 11:31:46
7810
发布2023-09-05 11:31:46
举报
文章被收录于专栏:数字化之路数字化之路

背景

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

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

Tomcat的工作模式概览

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

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

Tomcat同时处理的HTTP请求数: MIN(server.tomcat.max-connections,server.tomcat.max-threads)。

代码语言:javascript
复制
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应用程序中考虑并发时,以下关键领域需要特别关注: 最大线程数——这是为处理服务器请求可以分配的最大线程数 共享的外部资源——调用共享的外部资源,如数据库 异步方法调用——这些方法调用会在等待响应时将线程释放回线程池 共享的内部资源——调用共享的内部资源,如缓存和潜在共享的应用程序状态

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[拒绝策略]处理。

REFER

https://blog.csdn.net/weixin_43803688/article/details/124253382 https://www.zhihu.com/question/601023613

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 的数字化之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档