tomcat的最大線程數、最大排隊數多少合適

tomcat 的Connector配置以下html

<</span>Connector port="8080" protocol="HTTP/1.1"
connectionTimeout
="20000"
redirectPort
="8443"
maxThreads
="800" acceptCount="1000"/>

 其中最後兩個參數意義以下:linux

maxThreads:tomcat起動的最大線程數,即同時處理的任務個數,默認值爲200web

acceptCount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值爲100數據庫

 

這兩個值如何起做用,請看下面三種狀況tomcat

狀況1:接受一個請求,此時tomcat起動的線程數沒有到達maxThreads,tomcat會起動一個線程來處理此請求。服務器

狀況2:接受一個請求,此時tomcat起動的線程數已經到達maxThreads,tomcat會把此請求放入等待隊列,等待空閒線程。多線程

狀況3:接受一個請求,此時tomcat起動的線程數已經到達maxThreads,等待隊列中的請求個數也達到了acceptCount,此時tomcat會直接拒絕這次請求,返回connection refused併發

maxThreads如何配置測試

通常的服務器操做都包括量方面: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同樣大,這個值應該是主要根據應用的訪問峯值與平均值來權衡配置的。

若是設的較小,能夠保證接受的請求較快相應,可是超出的請求可能就直接被拒絕

若是設的較大,可能就會出現大量的請求超時的狀況,由於咱們系統的處理能力是必定的。

備註:

最佳設置能夠參考 http://blog.sina.com.cn/s/blog_4080505a01016o3d.html