Tomcat的優(yōu)化分成兩塊:
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)唐山免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Tomcat啟動(dòng)命令行中的優(yōu)化參數(shù)即JVM優(yōu)化
Tomcat容器自身參數(shù)的優(yōu)化(這塊很像ApacheHttp Server)
一、JVM的優(yōu)化
1.Tomcat首先跑在JVM之上的,因?yàn)樗膯?dòng)其實(shí)也只是一個(gè)java命令行,首先我們需要對(duì)這個(gè)JAVA的啟動(dòng)命令行進(jìn)行調(diào)優(yōu)。
PS:這邊討論的JVM優(yōu)化是基于Oracle Sun的jdk1.6版本以上,其它JDK或者低版本JDK不適用。
2.Tomcat啟動(dòng)行參數(shù)的優(yōu)化
Tomcat 的啟動(dòng)參數(shù)位于tomcat的安裝目錄\bin目錄下,修改catalina.sh文件,注釋的最后一行后面增加下面參數(shù):
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"
參數(shù)解釋?zhuān)?/p>
-server
我不管你什么理由,只要你的tomcat是運(yùn)行在生產(chǎn)環(huán)境中的,這個(gè)參數(shù)必須給我加上,因?yàn)閠omcat默認(rèn)是以一種叫java –client的模式來(lái)運(yùn)行的,server即意味著你的tomcat是以真實(shí)的production的模式在運(yùn)行的,這也就意味著你的tomcat以 server模式運(yùn)行時(shí)將擁有:更大、更高的并發(fā)處理能力,更快更強(qiáng)捷的JVM垃圾回收機(jī)制,可以獲得更多的負(fù)載與吞吐量。。。更。。。還有更。。。
-Xms–Xmx
即JVM內(nèi)存設(shè)置了,把Xms與Xmx兩個(gè)值設(shè)成一樣是最優(yōu)的做法.
PS:一個(gè)系統(tǒng)隨著并發(fā)數(shù)越來(lái)越高,它的內(nèi)存使用情況逐步上升,上升到最高點(diǎn)不能上升了,開(kāi)始回落,你們不要認(rèn)為這個(gè)回落就是好事情,由其是大起大落,在內(nèi)存回落時(shí)它付出的代價(jià)是CPU高速開(kāi)始運(yùn)轉(zhuǎn)進(jìn)行垃圾回收,此時(shí)嚴(yán)重的甚至?xí)斐赡愕南到y(tǒng)出現(xiàn)“卡殼”就是你在好好的操作,突然網(wǎng)頁(yè)像死在那邊一樣幾秒甚至十幾秒 時(shí)間,因?yàn)镴VM正在進(jìn)行垃圾回收。
因此一開(kāi)始我們就把這兩個(gè)設(shè)成一樣,使得Tomcat在啟動(dòng)時(shí)就為最大化參數(shù)充分利用系統(tǒng)的效率,這個(gè)道理和jdbcconnection pool里的minpool size與maxpool size的需要設(shè)成一個(gè)數(shù)量是一樣的原理。如何知道我的JVM能夠使用最大值?。吭谠O(shè)這個(gè)最大內(nèi)存即Xmx值時(shí)請(qǐng)先打開(kāi)一個(gè)命令行,鍵入如下的命令:
java -Xmx2048m -version #檢查是否支持你所設(shè)的值
–Xmn
設(shè)置年輕代大小為512m。整個(gè)堆大小=年輕代大小+年老代大小+持久代大小.持久代一般固定大小為64m,所以增大年輕代后,將會(huì)減小年老代大小。此值對(duì)系統(tǒng)性能影響較大,Sun官方推薦配置為整個(gè)堆的3/8。
-Xss
是指設(shè)定每個(gè)線(xiàn)程的堆棧大小。這個(gè)就要依據(jù)你的程序,看一個(gè)線(xiàn)程大約需要占用多少內(nèi)存,可能會(huì)有多少線(xiàn)程同時(shí)運(yùn)行等。一般不易設(shè)置超過(guò)1M,要不然容易出現(xiàn)out of memory。
-XX:+AggressiveOpts
作用如其名(aggressive),啟用這個(gè)參數(shù),則每當(dāng)JDK版本升級(jí)時(shí),你的JVM都會(huì)使用最新加入的優(yōu)化技術(shù)(如果有的話(huà))
-XX:+UseBiasedLocking
啟用一個(gè)優(yōu)化了的線(xiàn)程鎖,我們知道在我們的appserver,每個(gè)http請(qǐng)求就是一個(gè)線(xiàn)程,有的請(qǐng)求短有的請(qǐng)求長(zhǎng),就會(huì)有請(qǐng)求排隊(duì)的現(xiàn)象,甚至還會(huì)出現(xiàn)線(xiàn)程阻塞,這個(gè)優(yōu)化了的線(xiàn)程鎖使得你的appserver內(nèi)對(duì)線(xiàn)程處理自動(dòng)進(jìn)行最優(yōu)調(diào)配。
-XX:PermSize=128M-XX:MaxPermSize=256M
JVM使用-XX:PermSize設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64;
在數(shù)據(jù)量的很大的文件導(dǎo)出時(shí),一定要把這兩個(gè)值設(shè)置上,否則會(huì)出現(xiàn)內(nèi)存溢出的錯(cuò)誤。
由XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小,默認(rèn)是物理內(nèi)存的1/4。
那么,如果是物理內(nèi)存4GB,那么64分之一就是64MB,這就是PermSize默認(rèn)值,也就是永生代內(nèi)存初始大小;四分之一是1024MB,這就是MaxPermSize默認(rèn)大小。
-XX:+DisableExplicitGC
在程序代碼中不允許有顯示的調(diào)用”System.gc()”。看到過(guò)有兩個(gè)極品工程中每次在DAO操作結(jié)束時(shí)手動(dòng)調(diào)用System.gc()一下,覺(jué)得這樣 做好像能夠解決它們的out of memory問(wèn)題一樣,付出的代價(jià)就是系統(tǒng)響應(yīng)時(shí)間嚴(yán)重降低,就和我在關(guān)于Xms,Xmx里的解釋的原理一樣,這樣去調(diào)用GC導(dǎo)致系統(tǒng)的JVM大起大落,性能不到什么地方去喲!
-XX:+UseParNewGC
對(duì)年輕代采用多線(xiàn)程并行回收,這樣收得快。
-XX:+UseConcMarkSweepGC
即CMS gc,這一特性只有jdk1.5即后續(xù)版本才具有的功能,它使用的是gc估算觸發(fā)和heap占用觸發(fā)。
我們知道頻頻繁的GC會(huì)造面JVM的大起大落從而影響到系統(tǒng)的效率,因此使用了CMS GC后可以在GC次數(shù)增多的情況下,每次GC的響應(yīng)時(shí)間卻很短,比如說(shuō)使用了CMS GC后經(jīng)過(guò)jprofiler的觀察,GC被觸發(fā)次數(shù)非常多,而每次GC耗時(shí)僅為幾毫秒。
-XX:MaxTenuringThreshold
設(shè)置垃圾最大年齡。如果設(shè)置為0的話(huà),則年輕代對(duì)象不經(jīng)過(guò)Survivor區(qū),直接進(jìn)入年老代。對(duì)于年老代比較多的應(yīng)用,可以提高效率。如果將此值設(shè)置為一 個(gè)較大值,則年輕代對(duì)象會(huì)在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對(duì)象再年輕代的存活時(shí)間,增加在年輕代即被回收的概率。
這個(gè)值的設(shè)置是根據(jù)本地的jprofiler監(jiān)控后得到的一個(gè)理想的值,不能一概而論原搬照抄。
-XX:+CMSParallelRemarkEnabled
在使用UseParNewGC 的情況下, 盡量減少 mark 的時(shí)間
-XX:+UseCMSCompactAtFullCollection
在使用concurrent gc 的情況下, 防止 memoryfragmention, 對(duì)live object 進(jìn)行整理, 使 memory 碎片減少。
-XX:LargePageSizeInBytes
指定 Java heap的分頁(yè)頁(yè)面大小
-XX:+UseFastAccessorMethods
get,set 方法轉(zhuǎn)成本地代碼
-XX:+UseCMSInitiatingOccupancyOnly
指示只有在 oldgeneration 在使用了初始化的比例后concurrent collector 啟動(dòng)收集
-XX:CMSInitiatingOccupancyFraction=70
CMSInitiatingOccupancyFraction,這個(gè)參數(shù)設(shè)置有很大技巧,基本上滿(mǎn)足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就 不會(huì)出現(xiàn)promotion failed。在我的應(yīng)用中Xmx是6000,Xmn是512,那么Xmx-Xmn是5488兆,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90說(shuō)明年老代到90%滿(mǎn)的時(shí)候開(kāi)始執(zhí)行對(duì)年老代的并發(fā)垃圾回收(CMS),這時(shí)還 剩10%的空間是548810%=548兆,所以即使Xmn(也就是年輕代共512兆)里所有對(duì)象都搬到年老代里,548兆的空間也足夠了,所以只要滿(mǎn)足上面的公式,就不會(huì)出現(xiàn)垃圾回收時(shí)的promotion failed;
因此這個(gè)參數(shù)的設(shè)置必須與Xmn關(guān)聯(lián)在一起。
-Djava.awt.headless=true
這個(gè)參數(shù)一般我們都是放在最后使用的,這全參數(shù)的作用是這樣的,有時(shí)我們會(huì)在我們的J2EE工程中使用一些圖表工具如:jfreechart,用于在web網(wǎng)頁(yè)輸出GIF/JPG等流,在winodws環(huán)境下,一般我們的app server在輸出圖形時(shí)不會(huì)碰到什么問(wèn)題,但是在linux/unix環(huán)境下經(jīng)常會(huì)碰到一個(gè)exception導(dǎo)致你在winodws開(kāi)發(fā)環(huán)境下圖片顯示的好好可是在linux/unix下卻顯示不出來(lái),因此加上這個(gè)參數(shù)以免避這樣的情況出現(xiàn)。
上述這樣的配置,基本上可以達(dá)到:
系統(tǒng)響應(yīng)時(shí)間增快
JVM回收速度增快同時(shí)又不影響系統(tǒng)的響應(yīng)率
JVM內(nèi)存最大化利用
線(xiàn)程阻塞情況最小化
二、tomcat本身的優(yōu)化
1.Tomcat容器內(nèi)的優(yōu)化
前面我們對(duì)Tomcat啟動(dòng)時(shí)的命令進(jìn)行了優(yōu)化,增加了系統(tǒng)的JVM可使用數(shù)、垃圾回收效率與線(xiàn)程阻塞情況、增加了系統(tǒng)響應(yīng)效率等還有一個(gè)很重要的指標(biāo),我們沒(méi)有去做優(yōu)化,就是吞吐量。
打開(kāi)tomcat安裝目錄\conf\server.xml文件,定位到這一行:
這一行就是我們的tomcat容器性能參數(shù)設(shè)置的地方,它一般都會(huì)有一個(gè)默認(rèn)值,這些默認(rèn)值是遠(yuǎn)遠(yuǎn)不夠我們的使用的,我們來(lái)看經(jīng)過(guò)更改后的這一段的配置: 參數(shù)釋義: URIEncoding=”UTF-8” 使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里還有搞個(gè)mod_encoding,還要手工編譯 maxSpareThreads maxSpareThreads 的意思就是如果空閑狀態(tài)的線(xiàn)程數(shù)多于設(shè)置的數(shù)目,則將這些線(xiàn)程中止,減少這個(gè)池中的線(xiàn)程總數(shù)。 minSpareThreads 最小備用線(xiàn)程數(shù),tomcat啟動(dòng)時(shí)的初始化的線(xiàn)程數(shù)。 enableLookups 這個(gè)功效和Apache中的HostnameLookups一樣,設(shè)為關(guān)閉。 connectionTimeout connectionTimeout為網(wǎng)絡(luò)連接超時(shí)時(shí)間毫秒數(shù)。 maxThreads maxThreads Tomcat使用線(xiàn)程來(lái)處理接收的每個(gè)請(qǐng)求。這個(gè)值表示Tomcat可創(chuàng)建的最大的線(xiàn)程數(shù),即最大并發(fā)數(shù)。 acceptCount acceptCount是當(dāng)線(xiàn)程數(shù)達(dá)到maxThreads后,后續(xù)請(qǐng)求會(huì)被放入一個(gè)等待隊(duì)列,這個(gè)acceptCount是這個(gè)隊(duì)列的大小,如果這個(gè)隊(duì)列也滿(mǎn)了,就直接refuse connection maxProcessors minProcessors 在Java中線(xiàn)程是程序運(yùn)行時(shí)的路徑,是在一個(gè)程序中與其它控制線(xiàn)程無(wú)關(guān)的、能夠獨(dú)立運(yùn)行的代碼段。它們共享相同的地址空間。多線(xiàn)程幫助程序員寫(xiě)出CPU最大利用率的高效程序,使空閑時(shí)間保持最低,從而接受更多的請(qǐng)求。 useURIValidationHack 我們來(lái)看一下tomcat中的一段源碼: 可以看到如果把useURIValidationHack設(shè)成"false",可以減少它對(duì)一些url的不必要的檢查從而減省開(kāi)銷(xiāo)。 enableLookups="false" 為了消除DNS查詢(xún)對(duì)性能的影響我們可以關(guān)閉DNS查詢(xún),方式是修改server.xml文件中的enableLookups參數(shù)值。 disableUploadTimeout 類(lèi)似于Apache中的keeyalive一樣 給Tomcat配置gzip壓縮(HTTP壓縮)功能 compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" HTTP壓縮可以大大提高瀏覽網(wǎng)站的速度,它的原理是,在客戶(hù)端請(qǐng)求網(wǎng)頁(yè)后,從服務(wù)器端將網(wǎng)頁(yè)文件壓縮,再下載到客戶(hù)端,由客戶(hù)端的瀏覽器負(fù)責(zé)解壓縮并瀏覽。相對(duì)于普通的瀏覽過(guò)程HTML,CSS,Javascript , Text,它可以節(jié)省40%左右的流量。更為重要的是,它可以對(duì)動(dòng)態(tài)生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網(wǎng)頁(yè)也能進(jìn)行壓縮,壓縮效率驚人。 1)compression="on" 打開(kāi)壓縮功能 2)compressionMinSize="2048" 啟用壓縮的輸出內(nèi)容大小,這里面默認(rèn)為2KB 3)noCompressionUserAgents="gozilla, traviata" 對(duì)于以下的瀏覽器,不啟用壓縮 4)compressableMimeType="text/html,text/xml" 壓縮類(lèi)型 最后不要忘了把8443端口的地方也加上同樣的配置,因?yàn)槿绻覀冏遠(yuǎn)ttps協(xié)議的話(huà),我們將會(huì)用到8443端口這個(gè)段的配置,對(duì)吧? 2.apr模式的使用 tomcat connector支持3種運(yùn)行模式,即:BIO(即阻塞式I/O操作)、NIO(non-blocking I/O)、APR(Apache Portable Runtime/Apache可移植運(yùn)行時(shí)) 官方文檔中對(duì)三種模式的對(duì)比: Java Blocking Connector Java Nio Blocking Connector APR Connector Classname Http11Protocol Http11NioProtocol Http11AprProtocol Tomcat Version 3.x 4.x 5.x 6.x 6.x 5.5.x 6.x Support Polling NO YES YES Polling Size N/A Unlimited - Restricted by mem Unlimited - Configurable Read HTTP Request Blocking Non Blocking Blocking Read HTTP Body Blocking Sim Blocking Blocking Write HTTP Response Blocking Sim Blocking Blocking SSL Support Java SSL Java SSL OpenSSL SSL Handshake Blocking Non blocking Blocking Max Connections maxThreads See polling size See polling size BIO是tomcat默認(rèn)的運(yùn)行模式,NIO的配置比較簡(jiǎn)單,將connector中的協(xié)議改成NIO即可: Tomcat apr運(yùn)行模式的配置是三種運(yùn)行模式之中相對(duì)比較麻煩的一種。據(jù)官方文檔所述,Tomcat apr需要以下三個(gè)組件的支持: APR library[APR庫(kù)] JNI wrappers for APR used by Tomcat (libtcnative) OpenSSL libraries[OpenSSL庫(kù)] 此外,與配置nio運(yùn)行模式一樣,也需要將對(duì)應(yīng)的Connector節(jié)點(diǎn)的protocol屬性值改為org.apache.coyote.http11.Http11AprProtocol。 下載tomcat-native-1.1.33-src.tar.gz 編輯/etc/profile,末尾增加 重啟運(yùn)行tomcat就可以了security
if (connector.getUseURIValidationHack()) {
String uri = validate(request.getRequestURI());
if (uri == null) {
res.setStatus(400);
res.setMessage("Invalid URI");
throw new IOException("Invalid URI");
} else {
req.requestURI().setString(uri);
// Redoing the URI decoding
req.decodedURI().duplicate(req.requestURI());
req.getURLDecoder().convert(req.decodedURI(), true);
}
}
tar xzf tomcat-native-1.1.33-src.tar.gz
cd tomcat-native-1.1.33-src/jni/native
./configure
make
make install
export LD_LIBRARY_PATH=/usr/local/apr/lib
網(wǎng)站名稱(chēng):tomcat6優(yōu)化配置(參考網(wǎng)絡(luò)資源整理)
URL地址:http://weahome.cn/article/gogsid.html