Tomcat修改service.xml效能調優 增加最大併發連線數
詳細配置:
<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
1、 Tomcat的外部調優
Java虛擬機器(JVM)效能優化,可以通過以下兩個引數來設定虛擬機器使用記憶體的大小,-Xms<size>(JVM初始化堆的大小)和-Xmx<size>(JVM堆的最大值)。
這兩個值的大小一般根據需要進行設定。初始化堆的大小執行了虛擬機器在啟動時向系統申請的記憶體的大小。一般而言,這個引數不重要。但是有的應用程式在大負載的情況下會急劇地佔用更多的記憶體,此時這個引數就是顯得非常重要,如果虛擬機器啟動時設定使用的記憶體比較小而在這種情況下有許多物件進行初始化,虛擬機器就必須重複地增加記憶體來滿足使用。由於這種原因,我們一般把-Xms和-Xmx設為一樣大,而堆的最大值受限於系統使用的實體記憶體。一般使用資料量較大的應用程式會使用持久物件,記憶體使用有可能迅速地增長。當應用程式需要的記憶體超出堆的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。因此一般建議堆的最大值設定為可用記憶體的最大值的80%。
Tomcat預設可以使用的記憶體為128MB,在較大型的應用專案中,這點記憶體是不夠的,需要調大。
Windows下,在檔案{tomcat_home}/bin/catalina.bat,Unix下,在檔案{tomcat_home}/bin/catalina.sh的前面,增加如下設定:
JAVA_OPTS='-Xms【初始化記憶體大小】-Xmx【可以使用的最大記憶體】'
需要把這個兩個引數值調大。例如:AVA_OPTS='-Xms256m-Xmx512m',表示初始化記憶體為256MB,可以使用的最大記憶體為512MB。
另外需要考慮的是Java提供的垃圾回收機制。虛擬機器的堆大小決定了虛擬機器花費在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應用有關,應該通過分析實際的垃圾收集的時間和頻率來調整。如果堆的大小很大,那麼完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和記憶體的需要一致,完全收集就很快,但是會更加頻繁。調整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基準
2、 Tomcat的內部調優
(一)禁止DNS查詢
有時候我們的應用可能要記錄客戶端的資訊,兩種方式,一是記錄客戶端的數字IP地址,另一個是在DNS資料中查詢真實的主機名。DNS查詢會增加網路通訊,以致造成了網路延遲。要消除這個延遲,我們可以禁掉DNS查詢。這時我們的應用再呼叫getRemoteHost( )方法時,它就只會得到數字IP地址。這個配置是在Tomcat的serve.xml檔案中,Connector物件的enableLookups屬性,如下:
<!--
Define a non-SSLCoyote HTTP/1.1 Connector on port 8080
-->
<Connector
className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080"minProcessors="5" maxProcessors="75"
enableLookups="true" redirectPort="8443"
acceptCount="10" debug="0" connectionTimeout="20000"
useURIValidationHack="false"
/>
在生產系統中,除非應用要得到所有客戶端真實的主機名,這個通常是建議禁掉的。實在不行這樣的工作我們可以在Tomcat的外面做。在一個流量較小的Servr這種修改的效果可能不是十分明顯,但是對於某些站點來說,也許突然之間流量暴增也說不定呢,比如,前段時間的奧運票務網站,哈哈!
(二)調整執行緒數
另一個影響效能的是Connector所使用的程序數。Tomcat使用一個執行緒池來提高請求響應的速度。Java中的一個執行緒單獨同
我們可以通過修改Connector物件的minProcessors和maxProcessors來控制執行緒數。這個數字也許在剛上線的時候進行了適當的設定,可是當用戶數變多的時候我們就要增加配置數了。minProcessors值應該設定的足夠大來處理最小負載。當用戶變多的時候,Tomcat會分配更多的執行緒,不超過maxProcessors。上限也一定要設定的適當,以免使server的記憶體超過JVM的記憶體限制而掛掉。
(三)加速JSP的編譯
第一次訪問JSP的時候,它會被轉換成Java servlet原始碼,然後編譯成二進位制程式碼。這個過程中,我們是可以控制所使用的編譯器的。預設情況,Tomcat所使用的是和命令列上執行javac時同樣的編譯器。其實有更快的編譯器的,我們可以利用這些來提高JSP的編譯速度。
五、Tomcat伺服器的監控
1、Tomcat自帶的監控指標servelet
第一步:在配置檔案中增加使用者訪問的許可權。修改conf/tomcat-users.xml檔案,在其中加入一行 <user username="使用者名稱" password="密碼" roles="manager"/>
第二步:在IE瀏覽器中輸入http://IP地址:埠號/manager/status
第三步:在彈出的對話方塊中輸入第一步設定的使用者名稱和密碼,即可檢視到應用伺服器的相關效能指標資料。
2、使用專門的工具進行監控,網上很多在此就不再贅述。
在tomcat配置檔案server.xml中的配置中,和連線數相關的引數有:
minProcessors:最小空閒連線執行緒數,用於提高系統處理效能,預設值為10
maxProcessors:最大連線執行緒數,即:併發處理的最大請求數,預設值為75
acceptCount:允許的最大連線數,即等待佇列,指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理。應大於等於maxProcessors,預設值為100,
enableLookups:是否反查域名,取值為:true或false。為了提高處理能力,應設定為false
connectionTimeout:網路連線超時,單位:毫秒。設定為0表示永不超時,這樣設定有隱患的。通常可設定為30000毫秒。
和最大連線數相關的引數為maxProcessors和acceptCount。如果要加大併發連線數應同時加大這兩個引數。
web server允許的最大連線數還受制於作業系統的核心引數設定,通常Windows是2000個左右,Linux是1000個左右。
3、server.xml配置簡介
下面講述這個檔案中的基本配置資訊,更具體的配置資訊請參考tomcat的文件:
server:
1、port指定一個埠,這個埠負責監聽關閉tomcat的請求
2、shutdown指定向埠傳送的命令字串
service:
1、name指定service的名字
Connector(表示客戶端和service之間的連線):
1、port指定伺服器端要建立的埠號,並在這個斷口監聽來自客戶端的請求
2、minProcessors伺服器啟動時建立的處理請求的執行緒數
3、maxProcessors最大可以建立的處理請求的執行緒數
4、enableLookups如果為true,則可以通過呼叫request.getRemoteHost()進行DNS查詢來得到遠端客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址
5、redirectPort指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的埠號
6、acceptCount指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理
7、connectionTimeout指定超時的時間數(以毫秒為單位)
執行緒數可以大致上用“同時線上人數*每秒使用者操作次數(每秒的連線數)*系統平均操作時間(伺服器的處理時間)”來計算。
Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求):
1、defaultHost指定預設的處理請求的主機名,它至少與其中的一個host元素name屬性值是一樣的。
Context(表示一個web應用程式):
1、docBase應用程式的路徑或者是WAR檔案存放的路徑
2、path表示此web應用程式的url的字首,這樣請求的url為
http://localhost:8080/path/****
3、reloadable這個屬性非常重要,如果為true,則tomcat會自動檢測應用程式的/WEB-INF/lib和/WEB-INF/classes目錄的變化,自動裝載新的應用程式,我們可以在不重起tomcat的情況下改變應用程式
host(表示一個虛擬主機):
1、name指定主機名
2、appBase應用程式基本目錄,即存放應用程式的目錄
3、unpackWARs如果為true,則tomcat會自動將WAR檔案解壓,否則不解壓,直接從WAR檔案中執行應用程式
Logger(表示日誌,除錯和錯誤資訊):
1、className指定logger使用的類名,此類必須實現org.apache.catalina.Logger介面
2、prefix指定log檔案的字首
3、suffix指定log檔案的字尾
4、timestamp如果為true,則log檔名中要加入時間,例:localhost_log.2001-10-04.txt
Realm(表示存放使用者名稱,密碼及role的資料庫):
1、className指定Realm使用的類名,此類必須實現org.apache.catalina.Realm介面
Valve(功能與Logger差不多,其prefix和suffix屬性解釋和Logger中的一樣):
1、className指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve
類可以記錄應用程式的訪問資訊
directory(指定log檔案存放的位置):
1、pattern有兩個值,common