Tomcat线程池的深入理解

1.工作机制:

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

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

 

2.线程池作用:

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

 

3.参数分析:

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

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

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

 

<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
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-01-23 15:52  陌上归人的博客  阅读(1770)  评论(0编辑  收藏  举报