提升tomcat服務器性能的經驗

ec3y 9年前發布 | 22K 次閱讀 Tomcat 應用服務器

在線上環境中我們是采用了tomcat作為Web服務器,它的處理性能直接關系到用戶體驗,在平時的工作和學習中,歸納出以下七種調優經驗。

1. 服務器資源

服務器所能提供CPU、內存、硬盤的性能對處理能力有決定性影響。

(1) 對于高并發情況下會有大量的運算,那么CPU的速度會直接影響到處理速度。

(2)內存在大量數據處理的情況下,將會有較大的內存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等參數對內存不同功能塊進行劃分。我們之前就遇到過內存分配不足,導致虛擬機一直處于full GC,從而導致處理能力嚴重下降。

(3)硬盤主要問題就是讀寫性能,當大量文件進行讀寫時,磁盤極容易成為性能瓶頸。最好的辦法還是利用下面提到的緩存。

2. 利用緩存和壓縮

對于靜態頁面最好是能夠緩存起來,這樣就不必每次從磁盤上讀。這里我們采用了Nginx作為緩存服務器,將圖片、css、js文件都進行了緩存,有效的減少了后端tomcat的訪問。

另外,為了能加快網絡傳輸速度,開啟gzip壓縮也是必不可少的。但考慮到tomcat已經需要處理很多東西了,所以把這個壓縮的工作就交給前端的Nginx來完成。可以參考之前寫的《利用nginx加速web訪問》。

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

3. 采用集群

單個服務器性能總是有限的,最好的辦法自然是實現橫向擴展,那么組建tomcat集群是有效提升性能的手段。我們還是采用了Nginx來作為請求分流的服務器,后端多個tomcat共享session來協同工作。可以參考之前寫的《利用nginx+tomcat+memcached組建web服務器負載均衡》。

4. 優化tomcat參數

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

<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的庫來實現操作系統級別控制。

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

APR則需要安裝第三方庫,在高并發下會讓性能有明顯提升。

具體安裝辦法:

1)安裝apr tar zxvf apr-1.4.2.tar 
cd apr-1.4.2 
./configure --prefix=/usr/local/apr 
make 
make install  
2)安裝apr-iconv 程序代碼 
tar -zxvf apr-iconv-1.2.1.tar.gz 
cd apr-iconv-1.2.1 
./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr 
make 
make install  
3)安裝apr-util 程序代碼 
tar zxvf apr-util-1.3.10.tar.gz 
cd apr-util-1.3.10 
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv 
make 
make install  
4)安裝tomcat-native 程序代碼 
tar zxvf tomcat-native-1.1.20-src.tar.gz 
cd tomcat-native-1.1.20-src/jni/native   
./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.6.0_23 
make 
make install  
5)添加環境變量 
vi /etc/profile 
#在他文件末尾處添加下面的變量 
# apr export LD_LIBRARY_PATH=/usr/local/apr/lib 
執行 
source /etc/profile 
此時環境變量生效果  
啟動tomcat TOMCAT_HOME/bin/start.sh 
more TOMCAT_HOME/logs/catalina.out  
即可看到 Aug 29, 2010 3:47:32 PM org.apache.catalina.core.AprLifecycleListener init INFO: Loaded APR based Apache Tomcat Native library 1.1.20. 
優化完成

安裝完成后重啟即可生效。如使用默認protocal就是apr,但最好把將protocol修改成org.apache.coyote.http11.Http11AprProtocol,會更加明確

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

                   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方式!


 本文由用戶 ec3y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!