天天看點

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 将響應傳回給用戶端。