赞
踩
| 配置项 | 含义 | 默认 | 建议 | 注意 | 备注 |
|---|---|---|---|---|---|
| ConnectionTimeout | 连接超时 | 20s | 减少 | 与程序处理能力有关,处理能力越快设置短一点没关系 | 到底多久提示请求超时 |
| maxThreads | 处理连接的最大线程数(并发量) | 200 | 增加 | 不是越大越好 | |
| acceptCount(backlog) | 等待接受accept的请求数量限制 | 100 | 增加 | socket参数,min(accept,/proc/sys/net/core/somaxconn) | 超过Tomcat能接收的请求数以后,堆积在操作系统的数量 |
| maxConnections | 最大连接处理数 | nio 1w apr 8192 | 不变 | Tomcat能接收的请求限制 |
请求发到tomcat的顺序:



过程解析:
一个用户请求过来,如果是windows操作系统,它首先进入一个队列,我们的selector会监听底层的事件通知,这个队列就是accept queue,代表TCP的3次握手成功后就会进入到我们的accept queue队列,selector就会收到通知;红线那一部分开始就是Tomcat的范畴了,tomcat就是接受连接(请求),如果请求太多(超过accept+maxConnection),JVM就会崩掉;这1W个请求正在处理里面,这个处理就是我们的线程数量;请求超过默认的1W个请求也就是maxConnection的其他请求就会堆积到操作系统的acceptCount那里。这个参数就是控制堆积数量的,如果是windows系统的话,超过了这个堆积数量,Tomcat的maxConnection塞满了,操作系统的TCP也塞满了,那我们的服务器就不会让它再连接了;但是在Linux下面就不止有acceptCount,握手过程中还有一个SYN队列(acceptCount是指握手完成了才会进入accept queue),我们一般不会去调整红线前的操作系统的东西,因为那是属于内核的。我们一般会去调maxConnection,但是他有1W个,也不怎么会去调了,但什么情况会去调呢?




配置协议、请求IP、端口、请求方法、接口

然后启动测试

查看结果树,我们可以看每2个请求显示请求成功。虽然我们设置了10个线程,但是只设置了两个连接connections,所以每次只处理了两个请求,其他的都堆积在linux操作系统的默认128中了,所以,我们换windows操作系统试试

换windows操作系统


maxConnection=2
acceptCount=3
windows系统的话一次只能接收5个请求(2个在处理,3个允许在windows操作系统堆积)所以其他5个就会被告知连接失败


打个比方:
有一家理发店(Tomcat),只有两个理发的位置(操作系统2核),假设一个洗剪吹(线程)接待(处理)一个客人(请求)需要30分钟,休息(等待)30分钟;请问这家理发店需要几个洗剪吹才能高效轮班工作。答案肯定是4个。
4=(1+30/30)*2 ——————》(CPU处理至少一个线程+等待时间/处理时间)*2核

假设CPU时间片是50ms,先调度一个线程来执行,执行完50ms的计算后,这个线程需要等待50ms,这时CPU就没事干了,但是他不能停下来,就会再调度一个线程来工作,那么我们一个CPU只需要两个线程就可以把它打满。(2个线程可以处理多个请求,现实中每个请求的处理时间不一致,这就是我们程序代码的质量体现)
4=(1+50/50)*2
6=(1+100/50)*2 (假如每个请求的等待时间很长,我们就可以安排多几个线程来处理)









先设置好容量200的线程池

Spring结合servlet的异步处理

有一些应用程序就是很慢,想通过多线程来加速是不可能的,用MQ和CaChe的确可以解决。


负载层+网关层+数据层
因为tomcat更大的作用是基础组件,作用的是我们部署在上面的组件,Nginx是中间件,本身自带很多功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。