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和名字解析
- HostnameLookup ?off
3)打開UseCanonicalName模塊
- UseCanonicalName on
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自身進行優化,包括增大內存、調節并發線程數等。
?
重要參數說明:
? ? ?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
?
?
? ? ?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
?