tomcat 最大并发数
只针对BIO模式,目标请求会sleep两秒再返回结果,通过jmeter测试工具进行并发测试
操作系统:windows && linux
tomcat7测试:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" maxThreads="1" acceptCount="2"
redirectPort="8443" />
文档:http://localhost:8080/docs/config/http.html
官方解释:acceptCount对暂时无法执行的请求进行队列保存,超出设置则拒绝连接。
测试发现无法限制住最大并发数,所有请求都可以依次执行,每次有1个线程执行(maxThreads=1)
最大并发数如果过大,大于acceptCount值好几倍,会随机出现连接被拒绝。
进一步调查-----------------------------------------------------------------------------------------------------------------------------------
首先关于tcp queue简单介绍:
tcp三次握手:
第一次,客户端发送syn,等待服务端确认,此时客户端进入SYN_SEND状态
第二次,服务端接收syn包并确认,发送syn+ack给客户端,此时服务端进入SYN_RECV状态
第三次,客户端收到syn+ack,再次向服务端发送ack,此时客户端进入ESTAB状态(注意,此时服务端未必进入ESTAB状态)
半连接队列:服务端维护的与客户端保持SYN_RECV状态的连接队列,等待客户端回复,当收到客户端ack后,如果条件允许(全连接队列未达到最大值),服务端进入ESTAB状态,从半连接队列移到全连接队列的队尾。
全连接队列:完成三次握手等待accept。完成三次握手即进入了全连接队列的队尾,当进程调用accept时,全连接队列中的队头项将返回给进程,并从队列中移出连接。如果该队列为空,那么进程将被投入睡眠,直到TCP在该队列中放入一项才唤醒它。
在listen(int sockfd, int backlog)中,backlog在Linux 2.2之后表示的是已完成三次握手但还未被应用程序accept的队列长度。
全连接队列满,半连接队列未满:
客户端发出syn分节,服务端收下,并向客户端发出syn+ack。
客户端收到服务端syn+ack后,成为ESTAB状态,向服务端发送第三次握手ack。
服务端收到ack后,发现全连接队列已满,默认情况下,服务端什么也不做,状态依然是SYN_RECV。
客户端会重传syn和ack,当达到一定的阈值(/proc/sys/net/ipv4/tcp_synack_retries)时,客户端与服务端断开连接,服务端删除客户端在半连接队列中的syn分节。
全连接、半连接队列都满:
客户端发出syn分节,服务端发现半连接队列已满,直接丢弃syn,使客户端重传syn。
客户端重传syn,再次到达服务端后,服务端发现已经重传过,则收下,并告诉客户端syn+ack。
后续流程与上述一致,相比之下,多了一次客户端重传syn分节。
修改tcp参数配置:
tcp_synack_retries和tcp_syn_retries定义SYN 的重试连接次数
/etc/rc.d/rc.local文件中追加:
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_syn_retries=3
重启。
也可直接执行命令:
sysctl -w net.ipv4.tcp_synack_retries=1
sysctl -w net.ipv4.tcp_syn_retries=3
关于队列的长度:
半连接队列:≈2 * min(backlog, net.ipv4.tcpmax_syn_backlog)
全连接队列:min(/proc/sys/net/core/somaxconn(本系统128), backlog),表示最多有 min() + 1个 ESTAB 的连接等待 accept()。
修改somaxconn,
在/etc/sysctl.conf中添加如下:
net.core.somaxconn = 2048
然后在终端中执行
sysctl -p
进一步试验-------------------------------------------------------------------------------------------------------------------------------------------------------------------
在linux下,通过ss -ant进行观察tcp queue

并发5个请求

acceptCount配置作为socket中的backlog的值,如果acceptCount不设置或者设置为0,则会取默认值,经测试是100。
全连接队列大小为 min(/proc/sys/net/core/somaxconn(本系统128), 2) + 1=3,即等待服务端accept的ESTAB状态的连接最多有3个,如Recv-Q所示。
3个Recv-Q为323(表示请求bytes数值)的ESTAB状态的连接正等待server accept
1个Recv-Q为0的ESTAB状态的连接表示server端已经accept了请求,只是还没有返回结果(sleep中)。
1个SYN-RECV状态是半连接状态,位于半连接队列当中(此时客户端已经处于ESTAB状态),全连接队列已经满了。
对于处在半连接状态的连接,客户端会定时重发,直至达到阈值,如下:
第一次握手

第二次握手

第三次握手

客户端发送数据包

但由于此时服务端未能将连接从半连接队列移至全连接队列,状态依然是SYN-RECV,即未得到服务端ack,因此客户端继续发数据包

发送几次之后,服务端有了回应,告诉客户端说,你之前发的包丢了

然后客户端也告诉服务端,丢失的状态、对应的id号及次数,这里的43就是第三次握手的43,失败次数是1

然后客户端又开始重传了

终于服务端受不了了,此时客户端服务端彻底断开。
通过调整ipv4.tcp_synack_retries和ipv4.tcp_syn_retries,可以增加重试次数
结论:
对于tomcat中的acceptCount只是全连接队列的大小,就是说客户端和服务端都已经是ESTAB状态的连接,不考虑connectionTime的情况,在此队列中的连接最终都会被处理。对于大于acceptCount的连接请求,如果在tcp重试阈值范围之内完成半连接到全连接的状态转换,那么还是有机会被服务端accept并处理的。
因此,不能说只要大于acceptCount的连接就一定被拒绝!
参考文献:
http://www.cnblogs.com/leezhxing/p/5329786.html
http://blog.chinaunix.net/uid-24782829-id-3456109.html
http://www.cnblogs.com/menghuanbiao/p/5212131.html
http://www.cnblogs.com/zengkefu/p/5606696.html 有详细的源码分析
tomcat 最大并发数的更多相关文章
- Tomcat并发数优化,修改service.xml性能调优 增加最大并发连接数
可以在控制台的启动信息里看见,默认状态下没有被打开nio配置,启动时的信息,如下: 2010-2-1 12:59:40 org.apache.coyote.http11.Http11Protocol ...
- Tomcat的最大并发数
日常应用中,单台Tomcat能支持最大的并发数是多少? 作为一个有经验的Java Web开发人员对这个问题应该有大概的印象,并会让问题再具体点,比如Tomcat版本,运行模式,并发请求允许的最大响应时 ...
- tomcat并发数
Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的.更好的硬件,更多的处理器都会使Tomcat支持更多的并发. Tomcat默认的HTTP实现是采用阻塞式 ...
- Node.js真的有高并发优势吗?看看Node.js和Tomcat的并发测试结果
同一套业务逻辑,实现一个webservice中间接口,中间涉及memcached和mogodb的一些操作.分别在Node.js和JAVA平台实现,java代码部署在Tomcat 7.0上,用Apach ...
- 调整Tomcat的并发线程到5000+
调整Tomcat的并发线程数到5000+ 1. 调整server.xml的配置 先调整maxThreads的数值,在未调整任何参数之前,默认的并发线程可以达到40. 调整此项后可以达到1800左右. ...
- Linux查看连接数,并发数
Linux查看连接数,并发数 博客分类: 小记 linux 软连接 ln -s /home/ictfmcg/data/photo /var/jtnd/data/photo tomcat 6的Conn ...
- tomcat 高并发配置 与优化
公司的一个服务器使用Tomcat6默认配置,在后台一阵全点击服务器就报废了,查了一下就要是PERMSIZE默认值过小造成(16-64) TOMCAT_HOME/bin/catalina.sh 添加一行 ...
- Tomcat之并发优化
1.位置: (1)/opt/tomcat7/conf下的server.xml文件中<Connector>节点的配置优化,记得先备份. (2)出厂默认(在server.x ...
- Tomcat的并发能力
关注 一.一些限制 Windows 每个进程中的线程数不允许超过 2000 Linux 每个进程中的线程数不允许超过 1000 在 Java 中每开启一个线程需要耗用 1MB 的 JVM 内存空间 ...
随机推荐
- IntelliJ IDEA 2017版 spring-boot2.0.4+mybatis 自动部署的细节问题
一.加载pom依赖包 <!--spring-boot开发热部署--> <dependency> <groupId>org.springframework.boot& ...
- 用cglib包来为类产生动态代理类对象
一:在JDK里也有动态代理的类和接口,是Proxy和InvocationHandler,但是Proxy只能为接口产生代理类,借助InvocationHandler的实现类来完成对类对象的代理: 但是在 ...
- 工作总结(一):Linux C
这三个月以来一直忙着赶进度,没有停下来记录一些东西,很多很好的东西往往只能零零散散地记在草稿本上, 这样偶尔想起来自己都找不到,所以现在抽空总结下来. 这些天做了三件事,其一是在Linux下开发了对接 ...
- winSockets编程(四)阻塞模式(服务端)
在阻塞模式下,在I/O操作完成前,执行的操作函数将一直等候而不会立即返回,该函数所在的线程会阻塞在这里.相反,在非阻塞模式下,套接字函数立即返回,而不管I/O是否完成. 重点知识和思想: ////// ...
- uwsgi_read_timeout超时处理
最近发现一服务器一个奇怪的现象: Django的视图函数在浏览器一个请求的情况下,竟然做了两个请求的函数处理.不可思议,找了几天也不知道为什么, 只发现只要用uwsgi_read_timeout之后, ...
- day18(javaEE三大组件之一servlet(简介(一)))
Servlet servlet是小型服务器语言,使用它可以处理前台传递来的信息,servlet进行处理后在响应给前台,其中servlet起到了关键性的作用.前端输入的信息可以持久化的存储在数据库中,并 ...
- URAL1099. Work Scheduling(一般图匹配带花树开花算法)
1099. Work Scheduling Time limit: 0.5 second Memory limit: 64 MB There is certain amount of night gu ...
- ZUFE2486 Heap 2017-05-31 14:37 41人阅读 评论(0) 收藏
2486: Heap 时间限制: 2 Sec 内存限制: 128 MB 提交: 16 解决: 5 [提交][状态][讨论版] 题目描述 有n个非负整数,a1,a2,a3.....an. 有Q次询问 ...
- 《mysql必知必会》学习_第四章_20180724_欢
P27: select prod_name from products; # select 列 from 表 # 从表products 中检索 名为 prod_name 的列 P28 多个语句一起必须 ...
- MapReduce编程解析
MapReduce编程模型之案例 wordcount 输入数据 atguigu atguiguss sscls clsjiaobanzhangxuehadoop 输出数据 atguigu 2banzh ...