高併發Tomcat7.0配置
1、tomcat自動部署問題。
tomcat6.x跟7.x預設情況下 unpackWARs="true" autoDeploy="true",也就是拷貝war到webapp下面tomcat會自動解壓並部署,但是一般情況下是關閉這個的,因為線上不停止伺服器而更新容易出現數據錯誤問題。所以unpackWARs="true" autoDeploy="false",但是這裡有一個問題,貌似是tomcat的一個小bug。停止tomcat,部署新的war包上去,再重啟,應該是發現新的war包然後解壓覆蓋舊的,但是實際情況是不會部署新的包,官方文件描述是會重新部署的,但是實際情況卻不是這樣。具體原因不明,現在為了保證最新程式碼,我都是直接刪除原來的。
2、tomcat最大執行緒數,最大排隊數的配置。
首先發現網上漫天的資料都是很老的版本,現在應該都是tomcat6.0或者7.0的了。所以很多老的配置已經過時了。比如minProcessors,maxProcessors這兩個值網上大多資料說明修改他們倆,但是這兩個值在
Each incoming request requires a thread for the duration of that request. If more simultaneous requests are received than can be handled by the currently available request processing threads, additional threads will be created up to the configured maximum (the value of the maxThreads attribute). If still more simultaneous requests are received, they are stacked up inside the server socket created by theConnector, up to the configured maximum (the value of the acceptCount attribute). Any further simultaneous requests will receive "connection refused" errors, until resources are available to process them.如果我們達到更多的併發請求,而這些請求不是我們當前的程序線可以處理得了的,那麼額外的執行緒就會被重新配置以達到配置最大化(maxThreads屬性所設定的值)。如果還有併發要求,那麼他們就會被併入由聯結器建立得伺服器介面,從而達到配置最大化(直至達到acceptCount屬性所設定的值)。
這個是tomcat官方的解釋,在文中很清楚的說明了,修改最大連線數的辦法。maxThreads:The maximum number of request processing threads to be created by this Connector, which therefore determines the maximum number of simultaneous requests that can be handled. If not specified, this attribute is set to 200. If an executor is associated with this connector, this attribute is ignored as the connector will execute tasks using the executor rather than an internal thread pool.
處理request的最大執行緒數是由Connector決定的。這個值決定著目前可處理的最大併發數,如果沒有設定,預設值為200,如果executor 與connector相關聯,那麼這個值將會被忽略,
acceptCount:The maximum queue length for incoming connection requests when all possible request processing threads are in use. Any requests received when the queue is full will be refused. The default value is 100.網上很多資料顯示,linux的最大執行緒數是1000,window會高一點2000多。這個應該是根據機器cpu等的效能來計算的。
實際的配置資料應該是根據自己的機器與負載情況多嘗試找一個最優配置。
3、tomcat的BIO,NIO,APR三種高階Connector執行模式。
tomcat支援以上三種執行模式。
BIO:同步阻塞,是一個連線一個執行緒。客戶端有連結請求時伺服器就啟動一個執行緒處理,連結不操作會造成資源浪費,可以考慮執行緒池機制改善。BIO方式適用於連線數目比較小且固定的架構,這種方式對伺服器資源要求比較高,併發侷限於應用中。
NIO:同步非阻塞,是一個請求一個執行緒。客戶端所有的連線請求都會註冊到多路複用器,多路複用器輪詢到連線有I/O請求時啟動一個執行緒處理。適用於連線數目多且連線比較短的架構,比如聊天伺服器,併發侷限於應用中。
AIO:非同步非阻塞,是一個有效請求一個執行緒。伺服器實現模式為一個有效請求一個執行緒,客戶端的I/O請求都是由OS完成再通知伺服器啟動執行緒處理。適用於連線數目多且連線比較長的架構,比如相簿伺服器,
4、附加幾個常用引數的解釋。
connectionTimeout:網路連線超時,單位:毫秒。設定為0表示永不超時,通常可設定為20000毫秒。
URIEncoding:指定Tomcat 容器的URL 編碼格式。
enableLookups:如果為true,則可以通過呼叫request.getRemoteHost()進行DNS查詢來得到遠端客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址。建議設定false,能提高部分效能。
maxThreads:tomcat起動的最大執行緒數,即同時處理的任務個數,預設值為200
acceptCount:當tomcat起動的執行緒數達到最大時,接受排隊的請求個數,預設值為100
minSpareThreads:表示即使沒有人使用也開這麼多空執行緒等待 .
maxConnections:這個貌似應該是新加的引數吧,我沒求證。伺服器能接受和處理的最大數量,bio預設是maxThreads 的值,nio預設10000,APR/native 預設是8192。
keepAliveTimeout:這個是保持長連線的時間限制,預設就是connectionTimeout 設定的時間。
maxSpareThreads:表示如果最多可以空75個執行緒,例如某時刻有80人訪問,之後沒有人訪問了,則tomcat不會保留80個空執行緒,而是關閉5個空的。這個引數在7.0也刪掉了。unpackWARs:如果為true ,則tomcat 會自動將WAR 檔案解壓,否則不解壓,直接從WAR 檔案中執行應用程式
附上查詢資料中很好的幾個連結地址: