组内技术分享过程中,发现大家对tomcat中的三个参数maxThreads、maxConnections、acceptCount理解不到位,随布置了一个小作业,希望会后大家搞清楚。一晃一周就过去了,今天我跟进这个事情的时候,发现进展并不好。因此查了一些资料,然后和部分同学讨论后,随整理如下希望能帮助大家。
Tomcat一部分职责是,接受用户的请求(连接)。
Tomcat还有一部分职责是,然后处理请求。
接受用户的请求时候, Tomcat扮演类似饭店的接待员的角色。试想一下,如果一个饭店里面所有餐桌,都有人在用餐。 但是接待员不管不顾,来了用户还是请进来,那么势必会严重影响用户体验。
举个例子有一家餐馆,能够同时最大服务100人。如果客人来了之后,发现没有空闲的位子,也愿意等待一定的时间,假设结合各种经验值,最大等待的用户控制在10个是最好的。因为如果第11个顾客来了,他需要等待的时间超过正常能容忍的范围。
那么比较理想的情况应该是来一个顾客:
1) 发现有餐桌是空闲的,那么可以直接服务。
2) 如果发现所有的餐桌都有人,但是等候的位子有空,那么请客人等待一下。
3) 如果等候的位子也满了,那么请客人下次再来消费。
当然如果客人消费完毕后,有空闲的餐桌,应该立即请等候区的客人用餐;如果等候区有空闲的位置,那么新到的客人就可以去等候区排队。
acceptCount:控制等候区位子的最大个数的。
maxConnections:餐馆里面所有的餐桌。
maxThreads:可以理解为餐馆里面的工作人员,他们需要服务好,所有的餐桌上顾客。
为啥要理解这些概念呢? 因为如果不理解这些概念,那么在日常的tomcat调优中,就会抓瞎。
如果我说一些场景,大家猜猜可能是什么原因导致。
1) 服务端qps 起不来,但是通过日志看业务逻辑响应速度很快。
2) 连接被大量占用,系统卡顿。
Ps:
Tomcat 官网对 maxThreads、maxConnections、acceptCount的解释
https://tomcat.apache.org/tomcat-8.5-doc/config/http.html