標籤:style blog http color java 使用 os io
1、整合apache
雖然Tomcat也可以作web伺服器,但是處理靜態html的速度比不上apache,且其作為web伺服器的功能遠不如Apache,因此把apache和tomcat整合起來,講html和jsp功能部分進行明確的分工,讓tomcat只處理jsp部分,其他的由apache、IIS等web伺服器去處理,因此大大提供tomcat的運行效率。
部署方式:
- 安裝apache伺服器
- 部署tomcat
- 將mod_jk.so拷貝到modules目錄下面
- 修改httpd.conf和mod_jk.conf
使用情境:大量使用靜態頁面的應用系統
2、apache+tomcat叢集
對於並發要求很高的系統,需要採取負載平衡的方式來分擔tomcat伺服器的壓力。
負載平衡實現的四種方式:
1)通過DNS,但只能簡單的實現輪流分配,不能處理故障。
2)基於MS IIS、Windows 2003 Server本身內建的負載平衡服務。
3)硬體方式,通過交換器功能或專門的負載平衡裝置來實現。
4)通過一台負載平衡伺服器實現,上面安裝軟體。
使用apache http server做負載平衡器、叢集節點使用tomcat來實現上述的第4種方式,即:apache+tomcat叢集來實現負載平衡。該方式可以最大程度的發揮伺服器的效能,可以在配置較高的伺服器上部署多個tomcat,也可以在多台伺服器上分別部署tomcat,apache和tomcat整合的方式使用JK的方式。經驗證,系統對大使用者量使用的回應程式面,apache+3tomcat叢集>apache+2tomcat叢集>apache整合tomcat>單個tomcat,並且採用多個tomcat時,如果一個tomcat宕機,系統可以繼續使用,所以硬體系統效能足夠優越的情況下,需要盡量發揮軟體的效能,可以採用增加tomcat叢集的方式。
apache+tomcat叢集使用的設定檔:
- httpd.conf
- mod_jk.conf(對jk資訊的配置,包括jk的路徑等)
- workers.properties(對tomcat伺服器的串連定義檔案)
apache需要調整的運行參數:
1)設定mpm參數
- ThreadPerChild---用於設定每個進程的線程數(在windows環境下預設是64,最大值是1920,建議值100~500)
- MaxRequestPerChild---每個子進程能夠處理的最大請求數(很大程度上取決於伺服器的記憶體,建議值3000)
2)關閉DNS和名字解析
3)開啟UseCanonicalName模組
4)關閉多餘模組,一般來說,不需要載入的模組有mod_include.so、mod_autoindex.so、mod_access.so、mod_auth.so
5)開啟KeepAlive支援
- KeepAlive on
- KeepAliveTimeout 15
- MaxKeepAliveRequests 1000
部署方式:
- 安裝apache伺服器
- 部署tomcat叢集
- 將mod_jk.so拷貝到modules目錄下面
- 修改相關設定檔
使用情境:並發使用者數高的系統
3、JVM調優
1)JDK版本選擇
在滿足項目需要的前提下,盡量選用版本較高的JVM,一般來說高版本產品在速度和效率上比低版本會有改進。 JDK1.4比JDK1.3效能提高了近10%-20%,JDK1.5比JDK1.4效能提高25%-75%。
2)JVM版本選擇
SUN的JVM動態庫有client和server兩個版本,分別針對案頭應用和伺服器應用做了相應的最佳化,client版本載入速度較快,server版本載入速度較慢但運行起來較快。在命令列輸入 java -version 可以看到jvm目前配置的是哪個版本。如果要修改jvm的版本,可更改預設java.exe調用的jvm.dll,這個由jvm.cfg決定。編輯%JAVA_HOME%/jre/lib/i386/jvm.cfg檔案,裡面第一行寫的是-client(預設就是client版本),把第二行的-server KNOWN 放到第一行, 如下所示:
-server KNOWN
-client KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR
然後重啟tomcat,在命令列下輸入java -version ,就可以看到類似如下的資訊:
java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03 )
Java HotSpot(TM) Server VM (build 11.3-b02 , mixed mode)
表明Tomcat已經修改為使用Server版本的JVM,可進行對比測試,對比一下Client版本的JVM和Server版本的效能差異,從而決定採用哪個版本的JVM。另外,也可以考慮更換其它廠商的JVM,例如Oracle的JRockit等。
3)JVM參數調優
JVM啟動參數配置例子:
export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true “
4、tomcat容器本身調優
1)禁用DNS查詢
消除因DNS查詢所消耗的時間,可以在tomcat種關閉DNS查詢:
- enableLookups="false" ---server.xml檔案中
2)調整線程數
Tomcat使用線程池加速響應速度來處理請求。在Java中線程是程式運行時的路徑,是在一個程式中與其它控制線程無關的、能夠獨立啟動並執行程式碼片段。它們共用相同的地址空間。多線程協助程式員寫出CPU最大利用率的高效程式,使空閑時間保持最低,從而接受更多的請求。
Tomcat4中可以通過修改minProcessors和maxProcessors的值來控制線程數。
這些值在安裝後就已經設定為預設值並且是足夠使用的,但是隨著網站的擴容而改大這些值。minProcessors伺服器啟動時建立的處理請求的線程數應該足夠處理一個小量的負載。也就是說,如果一天內每秒僅發生5次單擊事件,並且個每請求任務處理需要1秒鐘,那麼預先設定線程數為5就足夠了。但在你的網站訪問量較大時就需要設定更大的線程數,指定為參數maxProcessors的值。maxProcessors的值也是有上限的,應防止流量不可控制(或者惡意的服務攻擊),從而導致超出了虛擬機器使用記憶體的大小。如果要加大並發串連數,應同時加大這兩個參數(但別忘了:web server允許的最大串連數還受制於作業系統的核心參數設定)。
Tomcat5對這些參數(server.xml中)進行了調整:
- maxThreads:Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可建立的最大的線程數。
- acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。
- connnectionTimeout:網路連接逾時,單位:毫秒。設定為0表示永不逾時,這樣設定有隱患的。通常可設定為30000毫秒。
- minSpareThreads:Tomcat初始化時建立的線程數。
- maxSpareThreads:一旦建立的線程超過這個值,Tomcat就會關閉不再需要的socket線程。
最好的方式是多設定幾次並且進行測試,觀察回應時間和記憶體使用量情況。在不同的機器、作業系統或虛擬機器組合的情況下可能會不同,而且並不是所有人的web網站的流量都是一樣的,因此沒有一刀切的方案來確定線程數的值。
5、ARP庫
所謂的Apache Tomcat Native library其實叫APR,全稱為:Apache Portable Runtime and Tomcat。Apache Tomcat Native library是Apache為了提升Tomcat的效能開發的一套本地化Socket、Thread、IO組件,也就是說它有進階IO功能, 作業系統層級的功能調用, 以及本地進程處理等等, 這些都能使Tomcat更像一個Web Server(像Apache那樣), 而不是只能用來解釋JSP, 也就是說提升單獨的Tomcat作為伺服器的吞吐效能。
Tomcat中使用APR庫,其實就是在Tomcat中使用JNI(Java Native Interface的縮寫,中文為JAVA本地調用)的方式來讀取檔案以及進行網路傳輸。可以大大提升Tomcat對靜態檔案的處理效能,同時如果你使用了HTTPS方式傳輸的話,也可以提升SSL的處理效能。一般在Windows下,可以直接下載編譯好的二進位版本的dll庫檔案來使Tomcat啟用APR,一般建議拷貝庫檔案tcnative-1.dll到Tomcat的bin目錄下。而在Linux下,可以直接解壓和安裝bin目錄下的tomcat_native.tar.gz檔案。
怎麼才能判斷Tomcat是否已經啟用了APR庫呢?方法是通過看Tomcat的開機記錄catalina.out:
如果沒有啟用APR,則開機記錄一般有這麼一條: org.apache.coyote.http11.Http11Protocol start
如果啟用了APR,則這條日誌就會變成: org.apache.coyote.http11.Http11AprProtocol start
APR資料參考:http://tomcat.apache.org/tomcat-5.5-doc/apr.html
安裝部署APR:
1. Windows下安裝APR
用於Windows的APR是一個名稱為:tcnative-1.dll的檔案。可到下面網址下載匹配版本的tcnative-1.dll,把下載的tcnative-1.dll檔案放到<$JAVA_HOME>/bin目錄下,啟動Tomcat就可以看到Tomcat已經載入部署了APR:Loaded APR based Apache Tomcat Native library 1.1.20
2. Linux下安裝APR
1)安裝APR
到http://apr.apache.org下載apr-1.2.12.tar.gz,然後用以下命令安裝:
tar -xvf apr-1.2.12.tar.gz
cd apr-1.2.12
./configure --prefix=/tomcat/apr
make
make install
2)安裝APR-UTIL
到http://apr.apache.org下載apr-util-1.2.12.tar.gz,然後用以下命令安裝:
tar -xvf apr-util-1.2.12.tar.gz
cd apr-util-1.2.12
./configure --prefix=/tomcat/apr --with-apr=/tomcat/apr
make
make install
3)安裝tomcat native library
cd /usr/local/tomcat/bin
tar zxvf tomcat-native.tar.gz
cd tomcat-native-1.1.10-src/jni/native
./configure --prefix=/tomcat/apr -- with-apr=/tomcat/apr –with-java-home=/usr/jdk
make
make install
4)編輯tomcat/bin/catalina.sh
將JAVA_OPTS="$CATALINA_OPTS -Djava.library.path= tomcat/apr/lib"
加在# ----- Execute The Requested Command -----------------------------------------前面
5)添加環境變數
# vi /etc/profile
添加:
export LD_LIBRARY_PATH=/usr/local/apr/lib
6)重啟Tomcat後,查看Tomcat輸出日誌,可見APR成功載入了
# vim /usr/local/tomcat/logs/catalina.out
資訊: Loaded Apache Tomcat Native library 1.1.10.
2008-7-8 10:20:27 org.apache.catalina.core.AprLifecycleListener init
資訊: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2008-7-8 10:20:27 org.apache.coyote.http11.Http11AprProtocol init
6、Compression壓縮
HTTP壓縮可以大大提高瀏覽網站的速度,它的原理是在用戶端請求網頁後,從伺服器端將網頁檔案壓縮,再下載到用戶端,由用戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML,CSS,JS, Text,可以節省40%左右的流量。更為重要的是,它可以對動態產生的,包括CGI、PHP, JSP, ASP, Servlet, SHTML等輸出的網頁也能進行壓縮,壓縮效率驚人。
- compression="on" 開啟壓縮功能
- compressionMinSize="2048" 啟用壓縮的輸出內容大小,這裡面預設為2KB
- noCompressionUserAgents="gozilla, traviata" 對於以下的瀏覽器,不啟用壓縮
- compressableMimeType="text/html,text/xml" 壓縮類型
(server.xml中)配置以後是這樣的:
<Connector port="8088" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" compression="on" compressionMinSize1="2048" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>
Tomcat調優綜述:
根據以上分析,如果想要Tomcat達到最優的效果,首先要爭取使得作業系統以及網路資源達到最優,並且最好使用高版本的JDK。對於有大量靜態頁面的系統,採用Apache整合Tomcat的方式,把靜態頁面交由Apache處理,動態部分交由Tomcat處理,能極大解放Tomcat的處理能力。使用ARP庫也能極大的提高Tomcat對靜態檔案的處理能力。對於並發要求較高的系統,採用Apache加Tomcat叢集的方式,將負載分別分擔到多個Tomcat上,能很大的提高系統的效能,充分利用硬體資源。同時需要對Tomcat自身進行最佳化,包括增大記憶體、調節並發線程數等。
重要參數說明:
1)maxThreads - 連接線程數監控與調整
maxThreads是最大並發線程數,如果同時的並發請求量超過這個值,Tomcat也不會再增加線程,這時並發請求將進入隊列。增加maxThreads的值可以加大Tomcat的並發處理能力,但是設定過高的maxThreads值也會對效能帶來影響,佔有過多的系統資源,甚至造成Tomcat崩潰。線程數可在Tomcat的Manager狀態頁面進行監控。
針對Tomcat7進行實驗,以說明maxThreads對於Tomcat伺服器效能的影響:
Tomcat堆記憶體設定為256M,用LoadRunner啟動50個虛擬使用者測試JpetStore首頁面(http://192.168.1.101:8080/jpetstore/shop/index.shtml),可得到以下測試結果:
(1)、預設配置maxThreads=200,平均事務回應時間:0.390
(2)、maxThreads=5,平均事務回應時間:0.355
(3)、maxThreads=50,平均事務回應時間:0.369
(4)、maxThreads=3,平均事務回應時間:0.559
可以看到,當maxThreads設定比較小時,Tomcat處理請求的速度有所下降。如果我們在測試指令碼中設定嚴格的並發(插入集合點lr_Rendezvous函數),可得到以下結果:
(1)、maxThreads=3,平均事務回應時間:2.609
(2)、maxThreads=50,平均事務回應時間:0.597
可以看到,在高強度的並發情況下,如果Tomcat的maxThreads值設定比較小,會嚴重影響效能,一般需要設定大於最大同時並發請求數。
注意:一般Web伺服器允許的最大串連數還受限制於作業系統的核心參數設定,通常Windows是2000個左右,Linux是1000個左右。在CentOS 中可以用以下命令查看Socket最大串連數:ulimit -a
其中的open files是允許開啟的最大檔案數,CentOS預設是1024。這個數值可通過修改vi /etc/security/limits.conf檔案來設定,例如修改為32768,可在檔案後添加:
* soft nofile 32768
* hard nofile 32768
儲存,重啟系統後就生效了。
為了證明這個Linux系統參數對Socket串連的影響,我們可以進行對比實驗,修改/etc/security/limits.conf:
* soft nofile 200
* hard nofile 200
在LoadRunner中啟動200個VU並發(設定集合點),在Controller的Connection和Connection per Second圖中看到串連數偏少(相比起預設設定的1024):
(1)、參數設定為200
平均事務回應時間:19.664
Connections:177.376
Connections per Second-New Connection:28.082
Connections per Second-Connection Shutdown:28.082
(2)、參數設定為1024(預設設定)
平均事務回應時間:2.712
Connections:315.136
Connections per Second-New Connection:114.000
Connections per Second-Connection Shutdown:114.000
在Socket串連建立受到限制的情況下,Tomcat的並發處理能力也受到明顯的影響,平均事務回應時間急劇上升。
2)connectionTimeout – 連線逾時的設定
connectionTimeout是Connector從接受串連到提交URI的等待的時間(單位是毫秒),預設設定為60000(即60秒)。connectionTimeout如果設定得比較小的話,可能造成大量使用者訪問網站時出現“502”異常。
telnet實驗:直接用telnet連上tomcat,如果不保持持續地輸入,則串連很快會斷開(如果connectionTimeout時間設定得比較小的話);如果一直不停輸入,串連會被繼續保持。
關於該項的詳細解釋和配置可參考tomcat協助文檔:http://tomcat.apache.org/tomcat-5.5-doc/config/http.html
3)acceptCount - 最大排隊數的設定
acceptCount是指當所有線程都已經被用於處理請求時,允許多少新的串連請求進入排隊隊列等候處理,當隊列滿的時候,任何新的請求都將被拒絕。預設設定值為100。
配置例子如下:
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"maxThreads="800" acceptCount="1000"/>
其中:maxThreads是Tomcat啟動的最大線程數,預設值為200;acceptCount是當Tomcat起動的線程數達到最大時,接受排隊的請求個數,預設值為100,這兩個值一起工作,可能出現下面三種情況:
- 情況1:接受一個請求,此時Tomcat啟動的線程數還沒有到達maxThreads設定的個數,Tomcat會啟動一個線程來處理此請求。
- 情況2:接受一個請求,此時Tomcat啟動的線程數已經到達maxThreads設定的個數,Tomcat會把此請求放入等待隊列,等待空閑線程可用。
- 情況3:接受一個請求,此時Tomcat啟動的線程數已經到達maxThreads設定的個數,而且等待隊列中的請求個數也達到了acceptCount設定的個數,此時Tomcat會直接拒絕此次請求,返回connection refused的錯誤。
關於Sun’s HotSpot JVM的其它與效能相關的調整參數參考:
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#PerformanceTuning