Tomcat线程池的深刻理解

1.工做机制:html

Tomcat启动时若是没有请求过来,那么线程数(都是指线程池的)为0;apache

一旦有请求,Tomcat会初始化minSpareThreads设置的线程数;tomcat

 

2.线程池做用:多线程

Tomcat的线程池的线程数跟你的瞬间并发有关系,好比maxThreads设置为1000,当瞬间并发达到1000那么Tomcat就会起1000个线程来处理,这时候跟你应用的快慢关系不大。并发

 

3.参数分析:性能

//编辑tomcat安装目录下的conf目录下的server.xml文件测试

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"spa

maxThreads="3000" minSpareThreads="800"/>.net

 

<Connector executor="tomcatThreadPool" port="8084" protocol="org.apache.coyote.http11.Http11AprProtocol"线程

connectionTimeout="60000"

keepAliveTimeout="30000"

maxKeepAliveRequests="8000"

maxHttpHeaderSize="8192"

URIEncoding="UTF-8"

enableLookups="false"

acceptCount="1000"

disableUploadTimeout="true"

redirectPort="8443" />

 

maxThreads:Tomcat线程池最多能起的线程数;

maxConnections:Tomcat瞬间最多能并发处理的请求(链接);

acceptCount:Tomcat维护最大的队列数(当全部可使用的处理请求的线程数都被使用时,能够放处处理队列中的请求数,超过这个数的请求将不予处理);

minSpareThreads:Tomcat初始化的线程池大小或者说Tomcat线程池最少会有这么多线程。

 

比较容易弄混的是maxThreads和maxConnections这两个参数:

好比maxThreads=1000,maxConnections=800,假设某一瞬间的并发时1000,那么最终Tomcat的线程数将会是800,即同时处理800个请求,剩余200进入队列"排队",若是acceptCount=100,那么有100个请求会被拒掉。

注意:根据前面所说,只是并发那一瞬间Tomcat会起800个线程处理请求,可是稳定后,某一瞬间可能只有不多的线程处于RUNNABLE状态,大部分线程是TIMED_WAITING,若是你的应用处理时间够快的话。因此真正决定Tomcat最大可能达到的线程数是maxConnections这个参数和并发数,当并发数超过这个参数则请求会排队,这时响应的快慢就看你的程序性能了。

并发的概念:无论什么并发确定是有一个时间单位的(通常是1s),准确的来说应该是当时Tomcat处理一个请求的时间内并发数,好比当时Tomcat处理某一个请求花费了1s,那么若是这1s过来的请求数达到了3000,那么Tomcat的线程数就会为3000,maxConnections只是Tomcat作的一个限制。

 

4.Tomcat会中止长时间闲置的线程

这个时间就是maxIdleTime。但我以前的测试中确实没有发现线程释放的现象,这是为何呢?我发现除了这个参数线程池线程是否释放?释放多少?还跟当前Tomcat每秒处理的请求数(从Jmeter或LoadRunner来看能够理解为TPS)有关系。经过下表能够清晰的看出来线程数,TPS和maxIdleTime之间的关系:

固然这个Thread Count不会小于minSpareThreads。

 

(参考)https://www.cnblogs.com/zhanjindong/p/concurrent-and-tomcat-threads-updated.html

 
---------------------
做者:@凭栏
来源:CSDN
原文:https://blog.csdn.net/xiaoxudong666/article/details/79688941

相关文章
相关标签/搜索