Tomcat 生產服務器性能優化

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

  1. 增長JVM堆內存大小
  2. 修復JRE內存泄漏
  3. 線程池設置
  4. 壓縮
  5. 數據庫性能調優
  6. Tomcat本地庫
  7. 其它選項
Lesus
Lesus
翻譯於 1年前

5人頂html

 

 翻譯的不錯哦!java

其它翻譯版本(1)

第一步  – 提升JVM棧內存Increase JVM heap memorylinux

你使用過tomcat的話,簡單的說就是「內存溢出」. 一般狀況下,這種問題出如今實際的生產環境中.產生這種問題的緣由是tomcat使用較少的內存給進程,經過配置TOmcat的配置文件(Windows 下的catalina.bat或Linux下的catalina.sh)能夠解決這種問題.這種解決方法是經過增長JVM的棧內存實現的.也就是說,JVM一般不去調用垃圾回收器,因此服務器能夠更多關注處理web請求,並要求儘快完成。要更改文件(catalina.sh) 位於"\tomcat server folder\bin\catalina.sh",下面,給出這個文件的配置信息,程序員

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

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

MtrS
MtrS
翻譯於 1年前

2人頂數據庫

 

 翻譯的不錯哦!apache

其它翻譯版本(1)

第二步 – 解決JRE內存泄露編程

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

?
1
<Listener className= "org.apache.catalina.core.JreMemoryLeakPreventionListener" />

你能夠在server.xml文件中找到這個監聽器的配置,server.xml位置在「tomcat project folder/conf/server.xml」。接下來,咱們將看看如何調整鏈接屬性「maxThreads」。

Garfielt
Garfielt
翻譯於 1年前

2人頂

 

 翻譯的不錯哦!

其它翻譯版本(1)

第三步 – 線程池設置

線程池指定Web請求負載的數量,所以,爲得到更好的性能這部分應當心處理。能夠經過調整鏈接器屬性「maxThreads」完成設置。maxThreads的值應該根據流量的大小,若是值太低,將有沒有足夠的線程來處理全部的請求,請求將進入等待狀態,只有當一個的處理線程釋放後才被處理;若是設置的太大,Tomcat的啓動將花費更多時間。所以它取決於咱們給maxThreads設置一個正確的值。

 
?
1
2
3
4
5
<Connector port= "8080" address= "localhost"
maxThreads= "250" maxHttpHeaderSize= "8192"
emptySessionPath= "true" protocol= "HTTP/1.1"
enableLookups= "false" redirectPort= "8181" acceptCount= "100"
connectionTimeout= "20000" disableUploadTimeout= "true" />
Garfielt
Garfielt
翻譯於 1年前

1人頂

 

 翻譯的不錯哦!

在上述配置中,maxThreads值設定爲「250」,這指定能夠由服務器處理的併發請求的最大數量。若是沒有指定,這個屬性的默認值爲「200」。任何多出的併發請求將收到「拒絕鏈接」的錯誤提示,直到另外一個處理請求進程被釋放。錯誤看起來以下,

?
1
2
org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads ( 250 ) are
currently busy, waiting. Increase maxThreads ( 250 ) or check the servlet status

若是應用提示上述錯誤,務必檢查上述錯誤是不是因爲單個請求花費太長時間形成的,這個問題的緣由是這樣的,有時候若是數據庫鏈接不釋放的話,進程將不會處理其它請求。

Garfielt
Garfielt
翻譯於 1年前

1人頂

 

 翻譯的不錯哦!

注意: 若是請求的數量超過了「750」,這將不是意味着將maxThreads屬性值設置爲「750」,它意外着最好使用「Tomcat集羣」的多個實例。也就是說,若是有「1000」請求,兩個Tomcat實例設置「maxThreads= 500」,而不在單Tomcat實例的狀況下設置maxThreads=1000。 

根據個人經驗,準確值的設定能夠經過將應用在在各類環境中測試得出。接下來,咱們來看看如何壓縮的MIME類型。 
Garfielt
Garfielt
翻譯於 1年前

1人頂

 

 翻譯的不錯哦!

其它翻譯版本(1)

第4步- 壓縮

Tomcat有一個經過在server.xml配置文件中設置壓縮的選項。壓縮能夠在connector像以下設置中完成,

?
1
2
3
4
<Connector port= "8080" protocol= "HTTP/1.1"
connectionTimeout= "20000"
redirectPort= "8181" compression= "500"
compressableMimeType= "text/html,text/xml,text/plain,application/octet-stream" />
在前面的配置中,當文件的大小大於等於500bytes時纔會壓縮。若是當文件達到了大小可是卻沒有被壓縮,那麼設置屬性compression="on"。不然Tomcat默認設置是「off」。接下來咱們將看看如何調優數據庫。
Lesus
Lesus
翻譯於 1年前

1人頂

 

 翻譯的不錯哦!

其它翻譯版本(1)

第五步- 數據庫性能調優

Tomcat性能在等待數據庫查詢被執行期間會下降。現在大多數應用程序都是使用可能包含「命名查詢」的關係型數據庫。若是是那樣的話,Tomcat會在啓動時默認加載命名查詢,這個可能會提高性能。另外一件重要事是確保全部數據庫鏈接正確地關閉。給數據庫鏈接池設置正確值也是十分重要的。我所說的值是指Resource要素的最大空閒數(maxIdle),最大鏈接數(maxActive),最大創建鏈接等待時間(maxWait)屬性的值。由於配置依賴與應用要求,我也不能在本文指定正確的值。你能夠經過調用數據庫性能測試來找到正確的值。

Lesus
Lesus
翻譯於 1年前

1人頂

 

 翻譯的不錯哦!

第6步 – Tomcat原生庫

Tomcat的原生庫基於Apache可移植運行時(Apache Portable Runtime簡稱APR),給程序員提供了超強的擴展性和性能,在產品運做中幫助融合原生的服務器技術以展示最佳的性能。想知道安裝說明的朋友請參考Tomcat Native Library – (APR) Installation

第7步 – 其餘選項

這些選項是:

  • 開啓瀏覽器的緩存,這樣讀取存放在webapps文件夾裏的靜態內容會更快,大大推進總體性能。
  • 每當開機時,Tomcat服務器應當自動地重啓。
  • 通常狀況下HTTPS請求會比HTTP請求慢。若是你想要更好的安全性,即便慢一點咱們仍是要選擇HTTPS。

就這麼多啦。在這篇文章裏,我教給了你們一些提升Tomcat服務器性能的方法。若是你以爲這篇文章有用,或者你對提升Tomcat服務器性能有別的見解,請不要忘記留下寶貴的評論。祝你今天編程愉快!

 

 

 

 

 

 

 

 

 

 

優化tomcat參數

    這裏以tomcat7的參數配置爲例,須要修改conf/server.xml文件,主要是優化鏈接配置,關閉客戶端dns查詢。

  1. <Connector port="8080"   
  2.            protocol="org.apache.coyote.http11.Http11NioProtocol"  
  3.            connectionTimeout="20000"  
  4.            redirectPort="8443"   
  5.            maxThreads="500"   
  6.            minSpareThreads="20"  
  7.            acceptCount="100" 
  8.            disableUploadTimeout="true" 
  9.            enableLookups="false"   
  10.            URIEncoding="UTF-8" /> 

5. 改用APR庫

    tomcat默認採用的BIO模型,在幾百併發下性能會有很嚴重的降低。tomcat自帶還有NIO的模型,另外也能夠調用APR的庫來實現操做系統級別控制。

    NIO模型是內置的,調用很方便,只須要將上面配置文件中protocol修改爲org.apache.coyote.http11.Http11NioProtocol,重啓便可生效。上面配置我已經改過了,默認的是HTTP/1.1。

    APR則須要安裝第三方庫,在高併發下會讓性能有明顯提高。具體安裝辦法能夠參考http://www.cnblogs.com/huangjingzhou/articles/2097241.html。安裝完成後重啓便可生效。如使用默認protocal就是apr,但最好把將protocol修改爲org.apache.coyote.http11.Http11AprProtocol,會更加明確

    在官方找到一個表格詳細說明了這三種方式的區別:

  1.                   Java Blocking Connector   Java Nio Blocking Connector   APR/native Connector 
  2.                              BIO                         NIO                       APR 
  3. Classname                AjpProtocol               AjpNioProtocol           AjpAprProtocol 
  4. Tomcat Version           3.x onwards                 7.x onwards              5.5.x onwards 
  5. Support Polling              NO                          YES                       YES 
  6. Polling Size                 N/A                   maxConnections             maxConnections 
  7. Read Request Headers      Blocking                  Sim Blocking                   Blocking 
  8. Read Request Body         Blocking                  Sim Blocking                   Blocking 
  9. Write Response            Blocking                  Sim Blocking                   Blocking 
  10. Wait for next Request     Blocking                  Non Blocking               Non Blocking 
  11. Max Connections        maxConnections              maxConnections             maxConnections 

6. 優化網絡

    Joel也明確提出了優化網卡驅動能夠有效提高性能,這個對於集羣環境工做的時候尤其重要。因爲咱們採用了linux服務器,因此優化內核參數也是一個很是重要的工做。給一個參考的優化參數:

  1. 1. 修改/etc/sysctl.cnf文件,在最後追加以下內容: 
  2.  
  3. net.core.netdev_max_backlog = 32768 
  4. net.core.somaxconn = 32768 
  5. net.core.wmem_default = 8388608 
  6. net.core.rmem_default = 8388608 
  7. net.core.rmem_max = 16777216 
  8. net.core.wmem_max = 16777216 
  9. net.ipv4.ip_local_port_range = 1024 65000 
  10. net.ipv4.route.gc_timeout = 100 
  11. net.ipv4.tcp_fin_timeout = 30 
  12. net.ipv4.tcp_keepalive_time = 1200 
  13. net.ipv4.tcp_timestamps = 
  14. net.ipv4.tcp_synack_retries = 
  15. net.ipv4.tcp_syn_retries = 
  16. net.ipv4.tcp_tw_recycle = 
  17. net.ipv4.tcp_tw_reuse = 
  18. net.ipv4.tcp_mem = 94500000 915000000 927000000 
  19. net.ipv4.tcp_max_orphans = 3276800 
  20. net.ipv4.tcp_max_syn_backlog = 65536 
  21.  
  22. 2. 保存退出,執行sysctl -p生效 

7. 讓測試說話

    優化系統最忌諱的就是隻調優不測試,有時不適當的優化反而會讓性能更低。以上全部的優化方法都要在本地進行性能測試事後再不斷調整參數,這樣最終才能達到最佳的優化效果。

 

補充Bio、Nio、Apr模式的測試結果:

    對於這幾種模式,我用ab命令模擬1000併發測試10000詞,測試結果比較意外,爲了確認結果,我每種方式反覆測試了10屢次,而且在兩個服務器上都測試了一遍。結果發現Bio和Nio性能差異很是微弱,難怪默認竟然仍是Bio。可是採用apr,鏈接創建的速度會有50%~100%的提高。直接調用操做系統層果真神速啊,這裏強烈推薦apr方式!

相關文章
相關標籤/搜索