1. 程式人生 > >Tomcat容器做到自我保護,設定最大連線數(服務限流:tomcat請求數限制)

Tomcat容器做到自我保護,設定最大連線數(服務限流:tomcat請求數限制)

http://itindex.net/detail/58707-%E5%81%87%E6%AD%BB-tomcat-%E5%AE%B9%E5%99%A8

為了確保服務不會被過多的http長連線壓垮,我們需要對tomcat設定個最大連線數,超過這個連線數的請求會拒絕,讓其負載到其它機器。達到保護自己的同時起到連線數負載均衡的作用。

一、解決方案:修改tomcat配置檔案,修改最大連線數(增大) 
修改server.xml配置檔案,Connector節點中增加acceptCount和maxThreads這兩個屬性的值,並且使acceptCount大於等於maxThreads:

<Connectorport="8080"protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"        maxConnections="800"acceptCount="500"maxThreads="400"
/>

 

二、實驗驗證: 
maxThreads:tomcat起動的最大執行緒數,即同時處理的任務個數,預設值為200 
acceptCount:當tomcat起動的執行緒數達到最大時,接受排隊的請求個數,預設值為100

這兩個值(acceptCount+maxThreads)如何起作用,請看下面三種情況 
情況1:接受一個請求,此時tomcat起動的執行緒數沒有到達maxThreads,tomcat會起動一個執行緒來處理此請求。 
情況2:接受一個請求,此時tomcat起動的執行緒數已經到達maxThreads,tomcat會把此請求放入等待佇列,等待空閒執行緒。 
情況3:接受一個請求,此時tomcat起動的執行緒數已經到達maxThreads,等待佇列中的請求個數也達到了acceptCount,此時tomcat會直接拒絕此次請求,返回connection refused

同時加上maxConnections 
原來tomcat最大連線數取決於maxConnections這個值加上acceptCount這個值,在連線數達到了maxConenctions之後,tomcat仍會保持住連線,但是不處理,等待其它請求處理完畢之後才會處理這個請求。

三、總結: 
tomcat能支援最大連線數由maxConnections加上acceptCount來決定。同時maxThreads如何設定?

一般的伺服器操作都包括兩方面:1計算(主要消耗cpu),2等待(io、資料庫等)

第一種極端情況,如果我們的操作是純粹的計算,那麼系統響應時間的主要限制就是cpu的運算能力,此時maxThreads應該儘量設的小,降低同一時間內爭搶cpu的執行緒個數,可以提高計算效率,提高系統的整體處理能力。

第二種極端情況,如果我們的操作純粹是IO或者資料庫,那麼響應時間的主要限制就變為等待外部資源,此時maxThreads應該儘量設的大,這樣 才能提高同時處理請求的個數,從而提高系統整體的處理能力。此情況下因為tomcat同時處理的請求量會比較大,所以需要關注一下tomcat的虛擬機器記憶體設定和linux的open file限制。

現實應用中,我們的操作都會包含以上兩種型別(計算、等待),所以maxThreads的配置並沒有一個最優值,一定要根據具體情況來配置。

最好的做法是:在不斷測試的基礎上,不斷調整、優化,才能得到最合理的配置。 
acceptCount的配置,我一般是設定的跟maxThreads一樣大,這個值應該是主要根據應用的訪問峰值與平均值來權衡配置的。 
如果設的較小,可以保證接受的請求較快響應,但是超出的請求可能就直接被拒絕 
如果設的較大,可能就會出現大量的請求超時的情況,因為我們系統的處理能力是一定的。