1. 程式人生 > >Tomcat性能優化方案

Tomcat性能優化方案

數據庫性能測試 col emp webapp ren 數據庫連接 調優 agent -h

1. 提高JVM棧內存Increase JVM heap memory

你使用過tomcat的話,簡單的說就是“內存溢出”. 通常情況下,這種問題出現在實際的生產環境中.產生這種問題的原因是tomcat使用較少的內存給進程,通過配置TOmcat的配置文件(Windows 下的catalina.bat或Linux下的catalina.sh)可以解決這種問題.這種解決方法是通過增加JVM的棧內存實現的.也就是說,JVM通常不去調用垃圾回收器,所以服務器可以更多關註處理web請求,並要求盡快完成。要更改文件(catalina.sh) 位於"\tomcat server folder\bin\catalina.sh",下面,給出這個文件的配置信息,


JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8  
    -server -Xms1024m -Xmx1024m  
    -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m  
    -XX:MaxPermSize=512m -XX:+DisableExplicitGC"  

-Xms – 指定初始化時化的棧內存
-Xms – 指定初始化時化的棧內存
-Xmx – 指定最大棧內存
在重啟你的Tomcat服務器之後,這些配置的更改才會有效。下面將介紹如何處理JRE內存泄漏. 

2. 解決JRE內存泄露

性能表現不佳的另一個主要原因是內存泄漏,正如我之前說過:始終使用最新的tomcat服務器以獲得更好的性能和可伸縮性。現在,這句話變成真的。如果我們使用最新的tomcat版本6.0.26及以上就可以解決這個錯誤,因為它包含了一個監聽器來處理JRE和PermGen的內存泄漏。使用的監聽器是,

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  
你可以在server.xml文件中找到這個監聽器的配置,server.xml位置在“tomcat project folder/conf/server.xml”。接下來,我們將看看如何調整連接屬性“maxThreads”。

3. 線程池設置

線程池指定Web請求負載的數量,因此,為獲得更好的性能這部分應小心處理。可以通過調整連接器屬性“maxThreads”完成設置。maxThreads的值應該根據流量的大小,如果值過低,將有沒有足夠的線程來處理所有的請求,請求將進入等待狀態,只有當一個的處理線程釋放後才被處理;如果設置的太大,Tomcat的啟動將花費更多時間。因此它取決於我們給maxThreads設置一個正確的值。

<Connector port="8080" address="localhost"  
2   maxThreads="250" maxHttpHeaderSize="8192"  
3   emptySessionPath="true" protocol="HTTP/1.1"  
4   enableLookups="false" redirectPort="8181" acceptCount="100"  
5   connectionTimeout="20000" disableUploadTimeout="true" />  
在上述配置中,maxThreads值設定為“250”,這指定可以由服務器處理的並發請求的最大數量。如果沒有指定,這個屬性的默認值為“200”。任何多出的並發請求將收到“拒絕連接”的錯誤提示,直到另一個處理請求進程被釋放。錯誤看起來如下,
[java] view plain copy
org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (250) are  
currently busy, waiting. Increase maxThreads (250) or check the servlet status  
如果應用提示上述錯誤,務必檢查上述錯誤是否是由於單個請求花費太長時間造成的,這個問題的原因是這樣的,有時候如果數據庫連接不釋放的話,進程將不會處理其它請求。  
註意: 如果請求的數量超過了“750”,這將不是意味著將maxThreads屬性值設置為“750”,它意外著最好使用“Tomcat集群”的多個實例。也就是說,如果有“1000”請求,兩個Tomcat實例設置“maxThreads= 500”,而不在單Tomcat實例的情況下設置maxThreads=1000。

根據我的經驗,準確值的設定可以通過將應用在在各種環境中測試得出。接下來,我們來看看如何壓縮的MIME類型。

4. 壓縮

Tomcat有一個通過在server.xml配置文件中設置壓縮的選項。壓縮可以在connector像如下設置中完成,
[html] view plain copy
1   <Connector port="8080" protocol="HTTP/1.1"  
2   connectionTimeout="20000"  
3   redirectPort="8181" compression="500"  
4   compressableMimeType="text/html,text/xml,text/plain,application/octet-stream" />  
在前面的配置中,當文件的大小大於等於500bytes時才會壓縮。如果當文件達到了大小但是卻沒有被壓縮,那麽設置屬性compression="on"。否則Tomcat默認設置是“off”。接下來我們將看看如何調優數據庫。  

5. 數據庫性能調優

Tomcat性能在等待數據庫查詢被執行期間會降低。如今大多數應用程序都是使用可能包含“命名查詢”的關系型數據庫。如果是那樣的話,Tomcat會在啟動時默認加載命名查詢,這個可能會提升性能。另一件重要事是確保所有數據庫連接正確地關閉。給數據庫連接池設置正確值也是十分重要的。我所說的值是指Resource要素的最大空閑數(maxIdle),最大連接數(maxActive),最大建立連接等待時間(maxWait)屬性的值。因為配置依賴與應用要求,我也不能在本文指定正確的值。你可以通過調用數據庫性能測試來找到正確的值。

6. Tomcat原生庫

Tomcat的原生庫基於Apache可移植運行時(Apache Portable Runtime簡稱APR),給程序員提供了超強的擴展性和性能,在產品運作中幫助融合原生的服務器技術以展現最佳的性能

7. 其他選項

這些選項是:
開啟瀏覽器的緩存,這樣讀取存放在webapps文件夾裏的靜態內容會更快,大大推動整體性能。
每當開機時,Tomcat服務器應當自動地重啟。
一般情況下HTTPS請求會比HTTP請求慢。如果你想要更好的安全性,即使慢一點我們還是要選擇HTTPS。

8. gzip壓縮

原理簡介

HTTP 壓縮可以大大提高瀏覽網站的速度,它的原理是,在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML ,CSS,Javascript , Text ,它可以節省40%左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。

配置方法

Tomcat5.0以後的版本是支持對輸出內容進行壓縮的,使用的是gzip壓縮格式 。

修改%TOMCAT_HOME%/conf/server.xml,修訂節點如下:

<Connector port="80" protocol="HTTP/1.1"     
        connectionTimeout="20000"     
        redirectPort="8443" executor="tomcatThreadPool" URIEncoding="utf-8"     
                    compression="on"     
                    compressionMinSize="50" noCompressionUserAgents="gozilla, traviata"     
                    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />    
  
  從上面節點的屬性可以看出,要使用gzip壓縮功能,你需要在Connector節點中加上如下屬性
- compression="on" 打開壓縮功能 
- compressionMinSize="50" 啟用壓縮的輸出內容大小,默認為2KB 
- noCompressionUserAgents="gozilla, traviata" 對於以下的瀏覽器,不啟用壓縮 
- compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型需要壓縮

測試方法

啟用了TOMCAT這個壓縮功能後,我們如何來測試壓縮是否有效呢?
首先Tomcat是根據瀏覽器請求頭中的accept-encoding來判斷瀏覽器是否支持壓縮功能,如果這個值包含有gzip,就表明瀏覽器支持gzip壓縮內容的瀏覽,我們可以用兩種方法來驗證壓縮是否生效。
大家直接通過瀏覽器訪問啟用了壓縮配置的服務器,然後通過抓包工具查看抓到的數據包,如果內容有很多你看不懂,就說明已經啟用壓縮功能了。

Tomcat性能優化方案