Tomcat性能優化

web壓力測試的實現原理都是通過發送大量的重複的頁面請求來模擬多用戶對被測系統的併發訪問,以此達到產生壓力的目地。產生壓力的手段都是通過錄制或編寫壓力腳本,這些腳本以多進程或多線程的方式在客戶端運行,這樣通過人爲製造各種類型的壓力,我們可以觀察被測系統在各種壓力情況下的反映,從而定位系統瓶頸,作爲系統調優的基礎。目前已經市場上的性能測試工具不下一百種,從單一的開放源碼的免費小工具如 Apache 自帶的 web 性能測試工具 Apache Benchmark、開源的Jmeter 到大而全的商業性能測試軟件如 Mercury 的 LoadRunner 等等。

常用的軟件測試工具網站:http://www.softwareqatest.com/qatweb1.html#LOAD

對於tomcat的性能調整可以分爲兩塊
外部環境:調整非Tomcat組件,例如Tomcat運行的操作系統和運行Tomcat的java虛擬機。
自身調整: 修改Tomcat自身的參數,調整Tomcat配置文件中的參數。

外部環境:
1. JAVA虛擬機性能優化
Tomcat本身不能直接在計算機上運行,需要依賴於硬件基礎之上的操作系統和一個java虛擬機。你可以根據自己的需要選擇不同的操作系統和對應的JDK的版本。
首先爲Java虛擬機設置使用的內存大小

參數

描述

-Xms<size>

JVM初始化堆的大小

-Xmx<size>

JVM堆的最大值


這兩個值的大小一般根據需要進行設置。初始化堆的大小執行了虛擬機在啓動時向系統申請的內存的大小。一般而言,這個參數不重要。但是有的應用程序在大負載的情況下會急劇地佔用更多的內存,此時這個參數就是顯得非常重要,如果虛擬機啓動時設置使用的內存比較小而在這種情況下有許多對象進行初始化,虛擬機就必須重複地增加內存來滿足使用。由於這種原因,我們一般把-Xms和-Xmx設爲一樣大,而堆的最大值受限於系統使用的物理內存。一般使用數據量較大的應用程序會使用持久對象,內存使用有可能迅速地增長。當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,並且導致應用服務崩潰。因此一般建議堆的最大值設置爲可用內存的最大值的80%。
linux系統下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下設置:
JAVA_OPTS='-Xms【初始化內存大小】 -Xmx【可以使用的最大內存】'
例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化內存爲256MB,可以使用的最大內存爲512MB。
另外需要考慮的是Java提供的垃圾回收機制。虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應用有關,應該通過分析實際的垃圾收集的時間和頻率來調整。如果堆的大小很大,那麼完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和內存的需要一致,完全收集就很快,但是會更加頻繁。調整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基準測試的時候,爲保證最好的性能,要把堆的大小設大,保證垃圾收集不在整個基準測試的過程中出現。

2.Tomcat與其它web服務器整合使用
雖然tomcat也可以作web服務器,但其處理靜態html的速度比不上apache,且其作爲web服務器的功能遠不如apache,因此我們想把apache和tomcat集成起來,將html與jsp的功能部分進行明確分工,讓tomcat只處理jsp部分,其它的圖片、js等由apache,Nginx等web服務器處理,可以大大節省tomcat有限的工作“線程”。

3. 負載均衡
在負載均衡的思路下,多臺服務器爲對稱方式,每臺服務器都具有同等的地位,可以單獨對外提供服務而無須其他服務器的輔助。通過負載分擔技術,將外部發送來的請求按一定規則分配到對稱結構中的某一臺服務器上,而接收到請求的服務器都獨立迴應客戶機的請求。
提供服務的一組服務器組成了一個應用服務器集羣(cluster),並對外提供一個統一的地址。當一個服務請求被髮至該集羣時,根據一定規則選擇一臺服務器,並將服務轉向給該服務器處理。
通過負載均衡技術,使應用服務超過了一臺服務器上限時,可以利用多臺服務器同時爲大量用戶提供服務。當某臺服務器出現故障時,負載均衡服務器會自動進行檢測並停止將服務請求分發至該服務器,而由其他工作正常的服務器繼續提供服務,從而保證了服務的可靠性。 
負載均衡實現的方式大概有四種:第一是通過DNS,但只能實現簡單的輪流分配,不能處理故障,第二如果是基於MS IIS,Windows 2003 server本身就帶了負載均衡服務,第三是硬件方式,通過交換機的功能或專門的負載均衡設備可以實現,第四種是軟件方式,通過一臺負載均衡服務器進行,上面安裝軟件。使用Apache Httpd Server做負載平衡器,Tomcat集羣節點使用Tomcat就可以做到以上第四種方式。這種方式比較靈活,成本相對也較低。另外一個很大的優點就是可以根據應用的情況和服務器的情況採取一些策略。


內部環境:

1. 調整線程數
Tomcat使用線程池加快處理請求的速度。在Java中線程是程序運行的路徑,多線程程序可以有效利用CPU,使cpu空閒時間保持最低,從而接受更多的請求
web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。

在Tomcat5對這些參數進行了調整,請看下錶:

屬性名

描述

maxThreads

Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數。

acceptCount

指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。

connnectionTimeout

網絡連接超時,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。通常可設置爲30000毫秒。

minSpareThreads

Tomcat初始化時創建的線程數。

maxSpareThreads

一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。

最好的方式是多設置幾次並且進行測試,觀察cpu、內存、io、gc、響應時間等指標情況。在不同的機器、操作系統或虛擬機組合的情況下可能會不同,而且不是所有人的web站點的流量都是一樣的,因此沒有一刀切的方案來確定線程數的值。

2. 爲了防止惡意攻擊,禁止某些機器訪問
Tomcat提供了兩個參數供你配置:RemoteHostValve 和RemoteAddrValve
全局設置,對Tomcat下所有應用生效
server.xml中添加下面一行,重啓服務器即可:
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192.168.1.*" deny=""/> 
此行放在</Host>之前。

補充:
Tomcat 與 Web 服務器 

    Tomcat 是提供一個支持 Servlet 和 JSP 運行的容器。Servlet 和 JSP 能根據實時需要,產生動態網頁內容。而對於 Web 服務器來說, Apache 僅僅支持靜態網頁,對於支持動態網頁就會顯得無能爲力;Tomcat 則既能爲動態網頁服務,同時也能爲靜態網頁提供支持。儘管它沒有通常的 Web 服務器快、功能也不如 Web 服務器豐富,但是 Tomcat 逐漸爲支持靜態內容不斷擴充。大多數的 Web 服務器都是用底層語言編寫如 C,利用了相應平臺的特徵,因此用純 Java 編寫的 Tomcat 執行速度不可能與它們相提並論。 

     一般來說,大的站點都是將 Tomcat 與 Apache 的結合,Apache 負責接受所有來自客戶端的 HTTP 請求,然後將 Servlets 和 JSP 的請求轉發給 Tomcat 來處理。Tomcat 完成處理後,將響應傳回給 Apache,最後 Apache 將響應返回給客戶端。 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章