tomcat7.0性能優化-挑戰極限完整版

0 測試結果  
參考精簡版的空跑測試結論 
http://phl.iteye.com/blog/1868206 

1 tomcat  
1.1 tomcat運行模式 
Connector/protocol 
org.apache.coyote.http11.Http11Protocol - blocking Java connector 
org.apache.coyote.http11.Http11NioProtocol - non blocking Java connector 
org.apache.coyote.http11.Http11AprProtocol - the APR/native connector. 

                       Java Blocking Connector   Java Non Blocking Connector   APR/native Connector 
                                 BIO                         NIO                       APR 
    Classname              Http11Protocol             Http11NioProtocol         Http11AprProtocol 
    Tomcat Version           3.x onwards                 6.x onwards              5.5.x onwards 
    Support Polling              NO                          YES                       YES 
    Polling Size                 N/A                   maxConnections             maxConnections 
    Read HTTP Request         Blocking                  Non Blocking                 Blocking 
    Read HTTP Body            Blocking                  Sim Blocking                 Blocking 
    Write HTTP Response       Blocking                  Sim Blocking                 Blocking 
    Wait for next Request     Blocking                  Non Blocking               Non Blocking 
    SSL Support               Java SSL                    Java SSL                   OpenSSL 
    SSL Handshake             Blocking                  Non blocking                 Blocking 
    Max Connections        maxConnections              maxConnections             maxConnections 

1.2 APR與tomcat-native安裝 
到http://apr.apache.org/下載下面3個包 

apr-1.5.1.tar.gz
apr-iconv-1.2.1.tar.gz 
apr-util-1.5.4.tar.gz

1.安裝apr 
./configure --prefix=/usr/local/tomcat-apr/apr-1.5.1
make 

make install html

2.安裝apr-iconv 
./configure --prefix=/usr/local/tomcat-apr/apr-iconv-1.2.1 --with-apr=/usr/local/tomcat-apr/apr-1.5.1/
make
make install 

3.安裝apr-util 
./configure --prefix=/usr/local/tomcat-apr/apr-util-1.5.4 --with-apr=/usr/local/tomcat-apr/apr-1.5.1/ --with-apr-iconv=/usr/local/tomcat-apr/apr-iconv-1.2.1/bin/apriconv
make
make install 

4安裝tomcat-native 
在tomcat目錄下,找到bin/tomcat-native-1.1.32-src 
./configure --prefix=/usr/local/tomcat-apr/tomcat-native-1.1.32 --with-apr=/usr/local/tomcat-apr/apr-1.5.1 --with-java-home=/usr/local/jdk1.7.0
make
make install

配置環境變量 
vi ~/.bashrc 
export LD_LIBRARY_PATH=/usr/local/tomcat-apr/apr-1.5.1/lib:/usr/local/tomcat-apr/tomcat-native-1.1.32/lib
使環境變量生效 
source ~/.bashrc 
附加閱讀 

---------------------------------------------------------------------- 
Libraries have been installed in: 
/application/search/usr/tomcat-native/tomcat-native-1.1.32/lib 

If you ever happen to want to link against installed libraries 
in a given directory, LIBDIR, you must either use libtool, and 
specify the full pathname of the library, or use the `-LLIBDIR' 
flag during linking and do at least one of the following: 
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable 
during execution 
- add LIBDIR to the `LD_RUN_PATH' environment variable 
during linking 
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag 
- have your system administrator add LIBDIR to `/etc/ld.so.conf' 

See any operating system documentation about shared libraries for 
more information, such as the ld(1) and ld.so(8) manual pages. 
---------------------------------------------------------------------- 

1.3 優化配置 
官方參考文檔 http://tomcat.apache.org/tomcat-7.0-doc/config/http.html 
爲了提升安全性,通常狀況下屏蔽 AJP 
註釋或者刪除server.xml中的 Connector節點 
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 

啓用NIO或者APR模式運行 
想運行在該模式下,直接修改server.xml裏的Connector節點,修改protocol爲 
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"   (或者Http11AprProtocol) 
connectionTimeout="20000" 
URIEncoding="UTF-8" 
useBodyEncodingForURI="true" 
enableLookups="false"  (是否反查域名) 
redirectPort="8443" /> 

根據經驗,調整nio的線程池,參考http://tomcat.apache.org/tomcat-7.0-doc/config/http.html 

線程池參數,須要直接在connector節點配置。 
  <Connector port="8080" 
               protocol="org.apache.coyote.http11.Http11NioProtocol"  
               connectionTimeout="20000" 
               URIEncoding="UTF-8" 
               useBodyEncodingForURI="true" 
               maxThreads="768" 
               minSpareThreads="64" 
               enableLookups="false" 
               redirectPort="8443" /> 

調整內存 
JAVA_OPTS="-Xms1024m -Xmx1024" 

啓用APR 
Apr要本身安裝 
<Connector port="8081" 
               executor="tomcatThreadPool" 
               protocol="org.apache.coyote.http11.Http11AprProtocol" 
               connectionTimeout="20000" 
               URIEncoding="UTF-8" 
               useBodyEncodingForURI="true" 
               enableLookups="false" 
               redirectPort="8444" /> 

調整線程池 
<Connector port="8081" 
               executor="tomcatThreadPool" 
               protocol="org.apache.coyote.http11.Http11AprProtocol" 
               connectionTimeout="20000" 
               URIEncoding="UTF-8" 
               useBodyEncodingForURI="true" 
               enableLookups="false" 
               redirectPort="8444" /> 

<Executor name="tomcatThreadPool" 
namePrefix="catalina-exec-" 
maxThreads="1024" 
minSpareThreads="512" 
prestartminSpareThreads="true" /> 

注意:線程池設置在apr,nio模式下不生效(我的估計是個bug),查看manager頁面,線程數仍是200。所以須要將maxThreads,minSpareThreads直接設置在connector節點下  


2 經驗總結  
首先要掌握未優化以前,服務器性能現狀; 
設置虛擬機內存,性能提高明顯; 
設置tomcat運行模式略微有提升; 
設置tomcat線程池,通常設置的比較大以避免成爲瓶頸; 
逐步遞增的性能調試計劃,從較少請求數,較低併發開始逐步遞增。直到性能明顯降低位置; 
以吞吐率、併發、響應時間等爲關鍵性能指標; 
區分裸奔性能和分佈式調用的性能; 
儘可能覆蓋所有代碼運行,服務啓動要爲性能測試作特殊處理(callId,timeStamp); 
作AB壓力測試,能夠編寫個shell夜間運行並將結果重定向; 

3 widget的壓力測試技術  
224網段有防火牆設置,因此先前的壓力測試不夠準確 
以後採起了搬遷物理服務器到防火牆外面 
作了相關的壓力測試 
優化點以下: 
1 動態、靜態分離部署 
2 將widget從2臺擴充到8臺物理服務器 
3 單臺物理服務器,配置1臺tomcat佔用所有服務器資源性能  <  配置8臺tomcat佔用所有服務器資源性能,大概差4-5倍 

Linux命令查看CPU  
more /proc/cpuinfo 

主要查看物理cpu數,線程數 
processor      邏輯處理器的id。 
physical id    物理封裝的處理器的id。 
core id        每一個核心的id。 
cpu cores      位於相同物理封裝的處理器中的內核數量。 
siblings       位於相同物理封裝的處理器中的邏輯處理器的數量。 

 

 

Apache-Bench工具介紹  
Apache HTTP服務器已經帶了一個測試工具: ab 

通常把apache壓力測試稱爲AB測試. ab工具的位置在apache2的bin目錄裏爲何用這個工具 

l  支持命令行執行,能夠在linux行運行 
l  簡單,實用 
l  應用普遍 

1.1.1    輸入參數 
經常使用的命令以下: 
./ab -n 請求次數 -c 併發數 地址 

參數名 參數含義 
-n 請求數 
-c 併發數 

windows下,地址要用雙引號 
linux下,地址用單引號 

1.1.2    輸出報表 
字段名字 中文解釋 
Server Software 被測試的Web服務器軟件名稱 
Server Hostname 請求的URL中的主機部分名稱 
Server Port 被測試的WEB服務器的監聽端口 
Document Path URL中的相對路徑 
Document Length http響應數據的正文長度 
Concurrency Level 併發用戶數(-c) 
Time taken for tests 全部請求被處理完所花費的總時間 
Complete requests 總請求數(-n) 
Failed requests 失敗請求數 
Total transferred 全部請求的響應數據長度和,包括頭和正文 
HTML transferred 全部請求的響應數據中,正文數據的和 
Requests per second 吞吐率 
Time per request 用戶平均請求等待時間 = time taken for tests / (complete requests / concurrency level) 
Time per request: 服務器平均請求處理時間 = 吞吐率的倒數 = time per request / concurrency level 
Transfer rate 請求在單位時間內,從服務器獲的數據長度 
Percentage of the requests served within a certain time (ms) 請求處理時間的分佈狀況 

參考資料  java

http://apr.apache.org/compiling_unix.html
linux

http://www.cnblogs.com/jackei/archive/2006/07/18/454144.html  apache-ab  shell

http://wenku.baidu.com/view/3fe17e1bc5da50e2524d7fb9.html apache-ab  apache

http://phl.iteye.com/blog/910984  apr安裝 
http://phl.iteye.com/blog/910996  tomcat運行模式 
http://phl.iteye.com/admin/blogs/1561604 proc/cpuinfo的概念 
http://tomcat.apache.org/tomcat-7.0-doc/config/executor.html  tomcat線程池配置 
http://tomcat.apache.org/tomcat-7.0-doc/config/http.html  tomcat protocol 
http://city-moon.iteye.com/blog/578282  Tomcat 6 支持 NIO -- Tomcat的四種基於HTTP協議的Connector性能比較
相關文章
相關標籤/搜索