tomcat優化

在線上環境中咱們是採用了tomcat做爲Web服務器,它的處理性能直接關係到用戶體驗,在平時的工做和學習中,概括出如下七種調優經驗。css

1. 服務器資源

    服務器所能提供CPU、內存、硬盤的性能對處理能力有決定性影響。
    (1) 對於高併發狀況下會有大量的運算,那麼CPU的速度會直接影響處處理速度。
    (2) 內存在大量數據處理的狀況下,將會有較大的內存容量需求,能夠用-Xmx -Xms -XX:MaxPermSize等參數對內存不一樣功能塊進行劃分。咱們以前就遇到過內存分配不足,致使虛擬機一直處於full GC,從而致使處理能力嚴重降低。
    (3) 硬盤主要問題就是讀寫性能,當大量文件進行讀寫時,磁盤極容易成爲性能瓶頸。最好的辦法仍是利用下面提到的緩存。html

2. 利用緩存和壓縮

    對於靜態頁面最好是可以緩存起來,這樣就沒必要每次從磁盤上讀。這裏咱們採用了Nginx做爲緩存服務器,將圖片、css、js文件都進行了緩存,有效的減小了後端tomcat的訪問。前端

    另外,爲了能加快網絡傳輸速度,開啓gzip壓縮也是必不可少的。但考慮到tomcat已經須要處理不少東西了,因此把這個壓縮的工做就交給前端的Nginx來完成。能夠參考以前寫的《利用nginx加速web訪問》。linux

    除了文本能夠用gzip壓縮,其實不少圖片也能夠用圖像處理工具預先進行壓縮,找到一個平衡點可讓畫質損失很小而文件能夠減少不少。曾經我就見過一個圖片從300多kb壓縮到幾十kb,本身幾乎看不出來區別。nginx

3. 採用集羣

    單個服務器性能老是有限的,最好的辦法天然是實現橫向擴展,那麼組建tomcat集羣是有效提高性能的手段。咱們仍是採用了Nginx來做爲請求分流的服務器,後端多個tomcat共享session來協同工做。能夠參考以前寫的《利用nginx+tomcat+memcached組建web服務器負載均衡》。web

4. 優化tomcat參數

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

<Connector port="8080" 
        protocol="org.apache.coyote.http11.Http11NioProtocol" 
        connectionTimeout="20000" 
        redirectPort="8443"              
        maxThreads="500"              
        minSpareThreads="20"             
        acceptCount="100"            
        disableUploadTimeout="true"            
        enableLookups="false"              
        URIEncoding="UTF-8" />

5. 改用APR庫

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

    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,會更加明確緩存

 <Connector port="9906" URIEncoding="UTF-8"
	 	protocol="org.apache.coyote.http11.Http11AprProtocol" 
	 	SSLEnabled="true"
               	maxThreads="450" 
               	scheme="https" 
               	secure="true"
               	sslProtocol="TLSv1+TLSv1.1+TLSv1.2" 
               	SSLCertificateKeyFile="D:/tomcats/tomcat-7.0.57-x64/conf/server.pem"
               	SSLCertificateFile="D:/tomcats/tomcat-7.0.57-x64/conf/server.pem"
               	SSLCACertificateFile="D:/tomcats/tomcat-7.0.57-x64/conf/ca.cer"
               	SSLPassword="123456"
               	SSLVerifyClient="require"
     />
 
 注:server.pem同樣時,SSLCertificateKeyFile能夠不用寫


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

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

6. 優化網絡

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

1. 修改/etc/sysctl.cnf文件,在最後追加以下內容: 
 
net.core.netdev_max_backlog = 32768 
net.core.somaxconn = 32768 
net.core.wmem_default = 8388608 
net.core.rmem_default = 8388608 
net.core.rmem_max = 16777216 
net.core.wmem_max = 16777216 
net.ipv4.ip_local_port_range = 1024 65000 
net.ipv4.route.gc_timeout = 100 
net.ipv4.tcp_fin_timeout = 30 
net.ipv4.tcp_keepalive_time = 1200 
net.ipv4.tcp_timestamps = 0 
net.ipv4.tcp_synack_retries = 2 
net.ipv4.tcp_syn_retries = 2 
net.ipv4.tcp_tw_recycle = 1 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_mem = 94500000 915000000 927000000 
net.ipv4.tcp_max_orphans = 3276800 
net.ipv4.tcp_max_syn_backlog = 65536 
 
2. 保存退出,執行sysctl -p生效

7. 讓測試說話

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

 

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

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

相關文章
相關標籤/搜索