tomcat的maxThreads、acceptCount(最大线程数、最大排队数) html
url: http://blog.sina.com.cn/s/blog_605f5b4f01012ljj.htmllinux
tomcat 的Connector配置以下数据库
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="800" acceptCount="1000"/>
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200tomcat
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100服务器
这两个值如何起做用,请看下面三种状况多线程
状况1:接受一个请求,此时tomcat起动的线程数没有到达maxThreads,tomcat会起动一个线程来处理此请求。并发
状况2:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,tomcat会把此请求放入等待队列,等待空闲线程。测试
状况3:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,等待队列中的请求个数也达到了acceptCount,此时tomcat会直接拒绝这次请求,返回connection refused优化
maxThreads如何配置url
通常的服务器操做都包括量方面:1计算(主要消耗cpu),2等待(io、数据库等)
第一种极端状况,若是咱们的操做是纯粹的计算,那么系统响应时间的主要限制就是cpu的运算能力,此时maxThreads应该尽可能设的小,下降同一时间内争抢cpu的线程个数,能够提升计算效率,提升系统的总体处理能力。
第二种极端状况,若是咱们的操做纯粹是IO或者数据库,那么响应时间的主要限制就变为等待外部资源,此时maxThreads应该尽可能设的大,这样 才能提升同时处理请求的个数,从而提升系统总体的处理能力。此状况下由于tomcat同时处理的请求量会比较大,因此须要关注一下tomcat的虚拟机内 存设置和linux的open file限制。
我在测试时遇到一个问题,maxThreads我设置的比较大好比3000,当服务的线程数大到必定程度时,通常是2000出头,单次请求的响应时间就会急剧的增长,
百思不得其解这是为何,四处寻求答案无果,最后我总结的缘由多是cpu在线程切换时消耗的时间随着线程数量的增长愈来愈大,
cpu把大多数时间都用来在这2000多个线程直接切换上了,固然cpu就没有时间来处理咱们的程序了。
之前一直简单的认为多线程=高效率。。其实多线程自己并不能提升cpu效率,线程过多反而会下降cpu效率。
当cpu核心数<线程数时,cpu就须要在多个线程直接来回切换,以保证每一个线程都会得到cpu时间,即一般咱们说的并发执行。
因此maxThreads的配置绝对不是越大越好。
现实应用中,咱们的操做都会包含以上两种类型(计算、等待),因此maxThreads的配置并无一个最优值,必定要根据具体状况来配置。
最好的作法是:在不断测试的基础上,不断调整、优化,才能获得最合理的配置。
acceptCount的配置,我通常是设置的跟maxThreads同样大,这个值应该是主要根据应用的访问峰值与平均值来权衡配置的。
若是设的较小,能够保证接受的请求较快相应,可是超出的请求可能就直接被拒绝
若是设的较大,可能就会出现大量的请求超时的状况,由于咱们系统的处理能力是必定的。