為了確保服務不會被過多的http長連接壓垮,我們需要對tomcat設定個最大連接數,超過這個連接數的請求會拒絕,讓其負載到其它機器。達到保護自己的同時起到連接數負載均衡的作用。
一、解決方案:修改tomcat配置文件,修改最大連接數(增大)
修改server.xml配置文件,Connector節點中增加acceptCount和maxThreads這兩個屬性的值,並且使acceptCount大於等於maxThreads:
<Connector port="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一樣大,這個值應該是主要根據應用的訪問峰值與平均值來權衡配置的。
如果設的較小,可以保證接受的請求較快響應,但是超出的請求可能就直接被拒絕
如果設的較大,可能就會出現大量的請求超時的情況,因為我們系統的處理能力是一定的。