1. 程式人生 > >tomcat 記憶體配置優化 Xms Xmx

tomcat 記憶體配置優化 Xms Xmx

簡介

考慮一下這種場景,你開發了一個應用,它有十分優秀的佈局設計,最新的特性以及其它的優秀特點。但是在效能這方面欠缺,不管這個應用如何都會遭到客戶拒絕。客戶總是期望它們的應用應該有更好的效能。如果你在產品中使用了Tomcat伺服器,那麼這篇文章就會給你幾方面來提升Tomcat伺服器的效能。感謝ITWorld article給本文提供資源。經過沉思我已經知道了和早期版本相比最新的Tomcat提供更好的效能和穩定性。所以一直使用最新的Tomcat版本。現在本文使用下面幾步來提高Tomcat伺服器的效能。

  1. 增加JVM堆記憶體大小
  2. 修復JRE記憶體洩漏
  3. 執行緒池設定
  4. 壓縮
  5. 資料庫效能調優
  6. Tomcat本地庫
  7. 其它選項

 

第一步  – 提高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",下面,給出這個檔案的配置資訊,

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

Xms – 指定JVM初始化堆的大小
-Xmx – 指定JVM堆的最大值
     這兩個值的大小一般根據需要進行設定。初始化堆的大小執行了虛擬機器在啟動時向系統申請的記憶體的大小。一般而言,這個引數不重要。但是有的應用 程式在大負載的情況下會急劇地佔用更多的記憶體,此時這個引數就是顯得非常重要,如果虛擬機器啟動時設定使用的記憶體比較小而在這種情況下有許多物件進行初始 化,虛擬機器就必須重複地增加記憶體來滿足使用。由於這種原因,我們一般把-Xms和-Xmx設為一樣大,而堆的最大值受限於系統使用的實體記憶體。一般使用數 據量較大的應用程式會使用持久物件,記憶體使用有可能迅速地增長。當應用程式需要的記憶體超出堆的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。因 此一般建議堆的最大值設定為可用記憶體的最大值的80%。

Tomcat預設可以使用的記憶體為128MB,在較大型的應用專案中,這點記憶體是不夠的,需要調大。 

  Windows下,在檔案{tomcat_home}/bin/catalina.bat,Unix下,在檔案{tomcat_home}/bin/catalina.sh的前面,增加如下設定: 

  JAVA_OPTS='-Xms【初始化記憶體大小】 -Xmx【可以使用的最大記憶體】' 

  需要把這個兩個引數值調大。例如: 

  JAVA_OPTS='-Xms256m -Xmx512m' 

  表示初始化記憶體為256MB,可以使用的最大記憶體為512MB。 

  另外需要考慮的是Java提供的垃圾回收機制。虛擬機器的堆大小決定了虛擬機器花費在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應用有 關,應該通過分析實際的垃圾收集的時間和頻率來調整。如果堆的大小很大,那麼完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和記憶體的需要一致, 完全收集就很快,但是會更加頻繁。調整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基準測試的時候,為保證最好的性 能,要把堆的大小設大,保證垃圾收集不在整個基準測試的過程中出現。 

  如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過 3-5 秒。如果垃圾收整合為瓶頸,那麼需要指定代的大小,檢查垃圾收集的詳細輸出,研究 垃圾收集引數對效能的影響。一般說來,你應該使用實體記憶體的 80% 作為堆大小。當增加處理器時,記得增加記憶體,因為分配可以並行進行,而垃圾收集不是並行的。  

在重啟你的Tomcat伺服器之後,這些配置的更改才會有效。下面將介紹如何處理JRE記憶體洩漏.

 

第二步 – 解決JRE記憶體洩露

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

1  

你可以在server.xml檔案中找到這個監聽器的配置,server.xml位置在“tomcat project folder/conf/server.xml”。接下來,我們將看看如何調整連線屬性“maxThreads”。

第三步 – 執行緒池設定

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

1  
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”。任何多出的併發請求將收到“拒絕連線”的錯誤提示,直到另一個處理請求程序被釋放。錯誤看起來如下,

1 org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (250) are
2 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像如下設定中完成,

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”。接下來我們將看看如何調優資料庫。

第五步- 資料庫效能調優

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

第6步 – Tomcat原生庫

Tomcat的原生庫基於Apache可移植執行時(Apache Portable Runtime簡稱APR),給程式設計師提供了超強的擴充套件性和效能,在產品運作中幫助融合原生的伺服器技術以展現最佳的效能。想知道安裝說明的朋友請參考Tomcat Native Library – (APR) Installation

第7步 – 其他選項

這些選項是:

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