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