Tomcat常用配置詳解

1 目錄結(jié)構(gòu) /bin:腳本文件目錄。 /common/lib:存放所有web項目都可以訪問的公共jar包(使用Common類加載器加載)。 /conf:存放配置文件,最重要的是server.xml。 /logs:存放日志文件。 /server/webapps:來管理Tomcat-web服務(wù)用的。僅對TOMCAT可見,對所有的WEB APP都不可見(使用Catalina類加載器加載)。 /shared/lib:僅對所有WEB APP可見,對TOMCAT不可見(使用Shared類加載器加載)。 /temp:Tomcat運行時候存放臨時文件用的。 /webapps:web應(yīng)用發(fā)布目錄。 /work:Tomcat把各種由jsp生成的servlet文件放在這個目錄下。刪除后,啟動時會自動創(chuàng)建。 2 配置文件 server.xml:主要的配置文件。 web.xml:缺省的web app配置,WEB-INF/web.xml會覆蓋該配置。 context.xml:不清楚跟server.xml里面的context是否有關(guān)系。 server.xml配置 server標簽 port:指定一個端口,這個端口負責(zé)監(jiān)聽關(guān)閉tomcat的請求。 shutdown:指定向端口發(fā)送的命令字符串。 service標簽 name:指定service的名字。 Connector(表示客戶端和service之間的連接)標簽 port:指定服務(wù)器端要創(chuàng)建的端口號,并在這個斷口監(jiān)聽來自客戶端的請求。 minProcessors:服務(wù)器啟動時創(chuàng)建的處理請求的線程數(shù)。 maxProcessors:最大可以創(chuàng)建的處理請求的線程數(shù)。 enableLookups:如果為true,則可以通過調(diào)用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址。 redirectPort:指定服務(wù)器正在處理http請求時收到了一個SSL傳輸請求后重定向的端口號。 acceptCount:指定當所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理。 connectionTimeout:指定超時的時間數(shù)(以毫秒為單位)。 Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求)標簽 defaultHost:指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的。 Context(表示一個web應(yīng)用程序,通常為WAR文件,關(guān)于WAR的具體信息見servlet規(guī)范)標簽 docBase:該web應(yīng)用的文檔基準目錄(Document Base,也稱為Context Root),或者是WAR文件的路徑。可以使用絕對路徑,也可以使用相對于context所屬的Host的appBase路徑。 path:表示此web應(yīng)用程序的url的前綴,這樣請求的url為http://localhost:8080/path/****。 reloadable:這個屬性非常重要,如果為true,則tomcat會自動檢測應(yīng)用程序的/WEB-INF/lib和/WEB-INF/classes目錄的變化,自動裝載新的應(yīng)用程序,我們可以在不重起tomcat的情況下改變應(yīng)用程序。 useNaming:如果希望Catalina為該web應(yīng)用使能一個JNDI InitialContext對象,設(shè)為true。該InitialialContext符合J2EE平臺的約定,缺省值為true。 workDir:Context提供的臨時目錄的路徑,用于servlet的臨時讀/寫。利用javax.servlet.context.tempdir屬性,servlet可以訪問該目錄。如果沒有指定,使用$CATALINA_HOME/work下一個合適的目錄。 swallowOutput:如果該值為true,System.out和System.err的輸出被重定向到web應(yīng)用的logger。如果沒有指定,缺省值為false debug:與這個Engine關(guān)聯(lián)的Logger記錄的調(diào)試信息的詳細程度。數(shù)字越大,輸出越詳細。如果沒有指定,缺省為0。 host(表示一個虛擬主機)標簽 name:指定主機名。 appBase:應(yīng)用程序基本目錄,即存放應(yīng)用程序的目錄。 unpackWARs:如果為true,則tomcat會自動將WAR文件解壓,否則不解壓,直接從WAR文件中運行應(yīng)用程序。 Logger(表示日志,調(diào)試和錯誤信息)標簽 className:指定logger使用的類名,此類必須實現(xiàn)org.apache.catalina.Logger接口。 prefix:指定log文件的前綴。 suffix:指定log文件的后綴。 timestamp:如果為true,則log文件名中要加入時間,如下例:localhost_log.2001-10-04.txt。 Realm(表示存放用戶名,密碼及role的數(shù)據(jù)庫)標簽 className:指定Realm使用的類名,此類必須實現(xiàn)org.apache.catalina.Realm接口。 Valve(功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣)標簽 className:指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應(yīng)用程序的訪問信息。 directory:指定log文件存放的位置。 pattern:有兩個值,common方式記錄遠程主機名或ip地址,用戶名,日期,第一行請求的字符串,HTTP響應(yīng)代碼,發(fā)送的字節(jié)數(shù)。combined方式比common方式記錄的值更多。 3 配置虛擬目錄 1)直接部署到webapps目錄下面訪問。 2)修改conf/server.xml文件。在中加入。docBase目錄默認使用appBase="webapps"這個目錄。也可以是絕對路徑。 配置主目錄,可以將path=""。 3)當項目沒有放在webapps目錄下時,可以在conf/Catalina/localhost新建一個XXX.XML文件。里面加入。 注意:這里的path屬性不需要設(shè)置,設(shè)置了也不會起作用的。 也可以使用該方法建立主目錄指向另一個目錄,例如:命名為ROOT.xml,這樣默認訪問的主目錄就被修改過了。 4 配置連接數(shù) maxThreads:Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創(chuàng)建的最大的線程數(shù)。 acceptCount:指定當所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理。 minSpareThreads:Tomcat初始化時創(chuàng)建的線程數(shù)。 maxSpareThreads:一旦創(chuàng)建的線程超過這個值,Tomcat就會關(guān)閉不再需要的socket線程。 enableLookups:是否反查域名,取值為:true或false。為了提高處理能力,應(yīng)設(shè)置為false connectionTimeout:網(wǎng)絡(luò)連接超時,單位:毫秒。設(shè)置為0表示永不超時,這樣設(shè)置有隱患的。默認可設(shè)置為20000毫秒。 web server允許的最大連接數(shù)還受制于操作系統(tǒng)的內(nèi)核參數(shù)設(shè)置,通常Windows是2000個左右,Linux是1000個左右。 5 配置內(nèi)存大小 修改bin/catalina.bat中的set CATALINA_OPTS=-Xms64m -Xmx128m。 Xms指最小內(nèi)存,Xmx指最大內(nèi)存。 6 安全配置 1)將SHUTDOWN修改為其他一些字符串。否則就容易被人給停止掉了。 2)對應(yīng)tomcat3.1中,屏蔽目錄文件自動列出 修改conf/web.xml中的defaultorg.apache.catalina.servlets.DefaultServletdebug0listingstrue13)訪問日志設(shè)置 在server.xml中加入這樣訪問日志會記錄到Logs中。 4)修改用戶名、密碼 conf/tomcat-users.xml 5)屏蔽后臺管理入口 方法一:從控制用戶和權(quán)限著手。廢掉要管理權(quán)限的用戶就可以了。 方法二:將conf/Catalina/localhost/manager.xml改名。 6)配置403,404,500錯誤頁面 默認情況下,報出HTTP錯誤的時候會暴露tomcat版本號。如果不想暴露的話,就需要重新定義錯誤跳轉(zhuǎn)頁面。401/401.jsp404/404.jsp500/500.jsp注意:在測試的時候碰到一個奇怪的現(xiàn)象,平時項目里面的時候測試正常的??墒墙裉煸趖omcat目錄里面新建一個測試目錄測試并不能跳轉(zhuǎn)到指定錯誤頁面。暫時不知道為什么。 7 配置Log4j日志記錄 項目中拋出的異常,拋到tomcat中的異常會被tomcat記錄下來,存放至logs/localhost.yyyy-MM-dd.log文件中。 平時我們在項目中使用的log4j記錄日志跟tomcat是沒有任何關(guān)系的,是獨立的一個程序,記錄的文件是自定義的。 我們可以在tomcat中定義一個log4j的公共日志處理方式,這樣在項目中就不需要在定義log4j的配置了。 1)將log4j-1.2.15.jar加入到commonlib目錄。 2)將log4j.properties加入到commonclasses目錄。 內(nèi)容例如: # Output pattern : date [thread] priority category - message log4j.rootLogger=DEUBG, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.logfile.File=${catalina.home}/logs/tomcat_app.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n #3rd party library level log4j.logger.org.hibernate.cache=ERROR 注意:我們項目中使用e.printStackTrace();輸出的異常會在控制臺輸出來,但是,不會記錄到tomcat日志中。 而且,也不會記錄到log4j的日志中。要想記錄到log4j日志中,必須使用log4j輸出來。 所以,實際上web項目中進行異常處理應(yīng)該將e.printStackTrace();寫寫法多改成log4j的形式才對! 但是,實際項目中很多項目多偷懶使用了e.printStackTrace();方式輸出異常。當出現(xiàn)異常的時候在控制臺上查看一下就可以了,也不考慮實際運行時候的維護。假如有人不小心關(guān)了控制臺,那么,你不就看不到異常了嗎? 個人介意使用log4j的形式記入web異常! 8 Tomcat5亂碼問題 Tomcat5跟Tomcat4對參數(shù)處理是不一樣的,在Tomcat4中g(shù)et與post的編碼是一樣的,所以只要在過濾器中通過request.setCharacterEncoding()設(shè)定一次就可以解決get與set的問題。然而,在Tomcat5中,get與post的處理是分開的,對get請求使用URIEncoding進行處理,對post使用request.setCharacterEncoding()處理。Tomcat5中,在server.xml的Connector元素增加了以下配置參數(shù): URIEncoding:用來設(shè)定通過URI傳遞的#########################################################################################################################從“第三天”的性能測試一節(jié)中,我們得知了決定性能測試的幾個重要指標,它們是:ü 吞吐量ü Responsetimeü Cpuloadü MemoryUsage我 們也在第三天的學(xué)習(xí)中對Apache做過了一定的優(yōu)化,使其最優(yōu)化上述4大核心指標的讀數(shù),那么我們的Apache調(diào)優(yōu)了,我們的Tomcat也作些相應(yīng) 的調(diào)整,當完成今的課程后,到時你的“小貓”到時真的會“飛”起來的,所以請用心看完,這篇文章一方面用來向那位曾寫過“Tomcat如何承受1000個 用戶”的作都的敬,一方面又是這篇原文的一個擴展,因為在把原文的知識用到相關(guān)的兩個大工程中去后解決了:1) 承受更大并發(fā)用戶數(shù)2) 取得了良好的性能與改善(系統(tǒng)平均性能提升達20倍,極端一個交易達80倍)。另外值的一提的是,我們當時工程里用的“小貓”是跑在32位機下的, 也就是我們的JVM最大受到2GB內(nèi)存的限制,都已經(jīng)跑成“飛”了。。。。。。如果在64位機下跑這頭“小貓”。。。。。。大家可想而知,會得到什么樣的效果呢?下面就請請詳細的設(shè)置吧! 二、一切基于JVM(內(nèi)存)的優(yōu)化2.1 32位操作系統(tǒng)與64位操作系統(tǒng)中JVM的對比我們一般的開發(fā)人員,基本用的是都是32位的Windows系統(tǒng),這就導(dǎo)致了一個嚴重的問題即:32位windows系統(tǒng)對內(nèi)存限制,下面先來看一個比較的表格:操作系統(tǒng)操作系統(tǒng)位數(shù)內(nèi)存限制解決辦法Winxp324GB超級兔子Win7324GB可以通過設(shè)置/PAEWin200332可以突破4GB達16GB必需要裝win2003 advanced server且要打上sp2補丁Win764無限制機器能插多少內(nèi)存,系統(tǒng)內(nèi)存就能支持到多大Win200364無限制機器能插多少內(nèi)存,系統(tǒng)內(nèi)存就能支持到多大Linux64無限制機器能插多少內(nèi)存,系統(tǒng)內(nèi)存就能支持到多大Unix64無限制機器能插多少內(nèi)存,系統(tǒng)內(nèi)存就能支持到多大上述問題解決后,我們又碰到一個新的問題,32位系統(tǒng)下JVM對內(nèi)存的限制:不能突破2GB內(nèi)存,即使你在Win2003 Advanced Server下你的機器裝有8GB-16GB的內(nèi)存,而你的JAVA,只能用到2GB的內(nèi)存。其實我一直很想推薦大家使用Linux或者是Mac操作系統(tǒng)的,而且要裝64位,因為必竟我們是開發(fā)用的不是打游戲用的,而Java源自Unix歸于Unix(Linux只是運行在PC上的Unix而己)。所以很多開發(fā)人員運行在win32位系統(tǒng)上更有甚者在生產(chǎn)環(huán)境下都會布署win32位的系統(tǒng),那么這時你的Tomcat要優(yōu)化,就要講究點技巧了。而在64位操作系統(tǒng)上無論是系統(tǒng)內(nèi)存還是JVM都沒有受到2GB這樣的限制。Tomcat的優(yōu)化分成兩塊:ü Tomcat啟動命令行中的優(yōu)化參數(shù)即JVM優(yōu)化ü Tomcat容器自身參數(shù)的優(yōu)化(這塊很像ApacheHttp Server)這一節(jié)先要講的是Tomcat啟動命令行中的優(yōu)化參數(shù)。Tomcat首先跑在JVM之上的,因為它的啟動其實也只是一個java命令行,首先我們需要對這個JAVA的啟動命令行進行調(diào)優(yōu)。需要注意的是:這邊討論的JVM優(yōu)化是基于Oracle Sun的jdk1.6版有以上,其它JDK或者低版本JDK不適用。2.2 Tomcat啟動行參數(shù)的優(yōu)化Tomcat 的啟動參數(shù)位于tomcat的安裝目錄\bin目錄下,如果你是Linux操作系統(tǒng)就是catalina.sh文件,如果你是Windows操作系統(tǒng)那么 你需要改動的就是catalina.bat文件。打開該文件,一般該文件頭部是一堆的由##包裹著的注釋文字,找到注釋文字的最后一段如:# $Id: catalina.sh 522797 2007-03-27 07:10:29Z fhanik $# ----------------------------------------------------------------------------- # OS specific support. $var _must_ be set to either true or false.敲入一個回車,加入如下的參數(shù)Linux系統(tǒng)中tomcat的啟動參數(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 "Windows系統(tǒng)中tomcat的啟動參數(shù)set 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ù)好多啊,可能有人寫到現(xiàn)在都沒見一個tomcat的啟動命令里加了這么多參數(shù),當然,這些參數(shù)只是我機器上的,不一定適合你,尤其是參數(shù)后的value(值)是需要根據(jù)你自己的實際情況來設(shè)置的。參數(shù)解釋:ü -server我不管你什么理由,只要你的tomcat是運行在生產(chǎn)環(huán)境中的,這個參數(shù)必須給我加上因 為tomcat默認是以一種叫java –client的模式來運行的,server即意味著你的tomcat是以真實的production的模式在運行的,這也就意味著你的tomcat以 server模式運行時將擁有:更大、更高的并發(fā)處理能力,更快更強捷的JVM垃圾回收機制,可以獲得更多的負載與吞吐量。。。更。。。還有更。。。Y給我記住啊,要不然這個-server都不加,那是要打屁股了。ü -Xms–Xmx即JVM內(nèi)存設(shè)置了,把Xms與Xmx兩個值設(shè)成一樣是最優(yōu)的做法,有人說Xms為最小值,Xmx為最大值不是挺好的,這樣設(shè)置還比較人性化,科學(xué)化。人性?科學(xué)?你個頭啊。大家想一下這樣的場景:一 個系統(tǒng)隨著并發(fā)數(shù)越來越高,它的內(nèi)存使用情況逐步上升,上升到最高點不能上升了,開始回落,你們不要認為這個回落就是好事情,由其是大起大落,在內(nèi)存回落 時它付出的代價是CPU高速開始運轉(zhuǎn)進行垃圾回收,此時嚴重的甚至?xí)斐赡愕南到y(tǒng)出現(xiàn)“卡殼”就是你在好好的操作,突然網(wǎng)頁像死在那邊一樣幾秒甚至十幾秒 時間,因為JVM正在進行垃圾回收。因此一開始我們就把這兩個設(shè)成一樣,使得Tomcat在啟動時就為最大化參數(shù)充分利用系統(tǒng)的效率,這個道理和jdbcconnection pool里的minpool size與maxpool size的需要設(shè)成一個數(shù)量是一樣的原理。如何知道我的JVM能夠使用最大值???拍腦袋?不行!在設(shè)這個最大內(nèi)存即Xmx值時請先打開一個命令行,鍵入如下的命令:看,能夠正常顯示JDK的版本信息,說明,這個值你能夠用。不是說32位系統(tǒng)下最高能夠使用2GB內(nèi)存嗎?即:2048m,我們不防來試試可以嗎?不可以!不要說2048m呢,我們小一點,試試1700m如何嘿嘿,連1700m都不可以,更不要說2048m了呢,2048m只是一個理論數(shù)值,這樣說吧我這邊有幾臺機器,有的機器-Xmx1800都沒問題,有的機器最高只能到-Xmx1500m。因此在設(shè)這個-Xms與-Xmx值時一定一定記得先這樣測試一下,要不然直接加在tomcat啟動命令行中你的tomcat就再也起不來了,要飛是飛不了,直接成了一只瘟貓了。ü –Xmn設(shè)置年輕代大小為512m。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8。ü -Xss是指設(shè)定每個線程的堆棧大小。這個就要依據(jù)你的程序,看一個線程 大約需要占用多少內(nèi)存,可能會有多少線程同時運行等。一般不易設(shè)置超過1M,要不然容易出現(xiàn)out ofmemory。ü -XX:+AggressiveOpts作用如其名(aggressive),啟用這個參數(shù),則每當JDK版本升級時,你的JVM都會使用最新加入的優(yōu)化技術(shù)(如果有的話)ü -XX:+UseBiasedLocking啟用一個優(yōu)化了的線程鎖,我們知道在我們的appserver,每個http請求就是一個線程,有的請求短有的請求長,就會有請求排隊的現(xiàn)象,甚至還會出現(xiàn)線程阻塞,這個優(yōu)化了的線程鎖使得你的appserver內(nèi)對線程處理自動進行最優(yōu)調(diào)配。ü -XX:PermSize=128M-XX:MaxPermSize=256MJVM使用-XX:PermSize設(shè)置非堆內(nèi)存初始值,默認是物理內(nèi)存的1/64;在數(shù)據(jù)量的很大的文件導(dǎo)出時,一定要把這兩個值設(shè)置上,否則會出現(xiàn)內(nèi)存溢出的錯誤。由XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小,默認是物理內(nèi)存的1/4。那么,如果是物理內(nèi)存4GB,那么64分之一就是64MB,這就是PermSize默認值,也就是永生代內(nèi)存初始大??;四分之一是1024MB,這就是MaxPermSize默認大小。ü -XX:+DisableExplicitGC在 程序代碼中不允許有顯示的調(diào)用”System.gc()”。看到過有兩個極品工程中每次在DAO操作結(jié)束時手動調(diào)用System.gc()一下,覺得這樣 做好像能夠解決它們的out ofmemory問題一樣,付出的代價就是系統(tǒng)響應(yīng)時間嚴重降低,就和我在關(guān)于Xms,Xmx里的解釋的原理一樣,這樣去調(diào)用GC導(dǎo)致系統(tǒng)的JVM大起大 落,性能不到什么地方去喲!ü -XX:+UseParNewGC對年輕代采用多線程并行回收,這樣收得快。ü -XX:+UseConcMarkSweepGC即CMS gc,這一特性只有jdk1.5即后續(xù)版本才具有的功能,它使用的是gc估算觸發(fā)和heap占用觸發(fā)。我們知道頻頻繁的GC會造面JVM的大起大落從而影響到系統(tǒng)的效率,因此使用了CMS GC后可以在GC次數(shù)增多的情況下,每次GC的響應(yīng)時間卻很短,比如說使用了CMS GC后經(jīng)過jprofiler的觀察,GC被觸發(fā)次數(shù)非常多,而每次GC耗時僅為幾毫秒。ü -XX:MaxTenuringThreshold設(shè) 置垃圾最大年齡。如果設(shè)置為0的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進入年老代。對于年老代比較多的應(yīng)用,可以提高效率。如果將此值設(shè)置為一 個較大值,則年輕代對象會在Survivor區(qū)進行多次復(fù)制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概率。這個值的設(shè)置是根據(jù)本地的jprofiler監(jiān)控后得到的一個理想的值,不能一概而論原搬照抄。ü -XX:+CMSParallelRemarkEnabled在使用UseParNewGC 的情況下, 盡量減少 mark 的時間ü -XX:+UseCMSCompactAtFullCollection在使用concurrent gc 的情況下, 防止 memoryfragmention, 對live object 進行整理, 使 memory 碎片減少。ü -XX:LargePageSizeInBytes指定 Java heap的分頁頁面大小ü -XX:+UseFastAccessorMethodsget,set 方法轉(zhuǎn)成本地代碼ü -XX:+UseCMSInitiatingOccupancyOnly指示只有在 oldgeneration 在使用了初始化的比例后concurrent collector 啟動收集ü -XX:CMSInitiatingOccupancyFraction=70CMSInitiatingOccupancyFraction,這個參數(shù)設(shè)置有很大技巧,基本上滿足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就 不會出現(xiàn)promotion failed。在我的應(yīng)用中Xmx是6000,Xmn是512,那么Xmx-Xmn是5488兆,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90說明年老代到90%滿的時候開始執(zhí)行對年老代的并發(fā)垃圾回收(CMS),這時還 剩10%的空間是5488*10%=548兆,所以即使Xmn(也就是年輕代共512兆)里所有對象都搬到年老代里,548兆的空間也足夠了,所以只要滿 足上面的公式,就不會出現(xiàn)垃圾回收時的promotion failed;因此這個參數(shù)的設(shè)置必須與Xmn關(guān)聯(lián)在一起。ü -Djava.awt.headless=true這 個參數(shù)一般我們都是放在最后使用的,這全參數(shù)的作用是這樣的,有時我們會在我們的J2EE工程中使用一些圖表工具如:jfreechart,用于在web 網(wǎng)頁輸出GIF/JPG等流,在winodws環(huán)境下,一般我們的app server在輸出圖形時不會碰到什么問題,但是在linux/unix環(huán)境下經(jīng)常會碰到一個exception導(dǎo)致你在winodws開發(fā)環(huán)境下圖片顯 示的好好可是在linux/unix下卻顯示不出來,因此加上這個參數(shù)以免避這樣的情況出現(xiàn)。上述這樣的配置,基本上可以達到:ü 系統(tǒng)響應(yīng)時間增快ü JVM回收速度增快同時又不影響系統(tǒng)的響應(yīng)率ü JVM內(nèi)存最大化利用ü 線程阻塞情況最小化2.3 Tomcat容器內(nèi)的優(yōu)化前面我們對Tomcat啟動時的命令進行了優(yōu)化,增加了系統(tǒng)的JVM可使用數(shù)、垃圾回收效率與線程阻塞情況、增加了系統(tǒng)響應(yīng)效率等還有一個很重要的指標,我們沒有去做優(yōu)化,就是吞吐量。還記得我們在第三天的學(xué)習(xí)中說的,這個系統(tǒng)本身可以處理1000,你沒有優(yōu)化和配置導(dǎo)致它默認只能處理25。因此下面我們來看Tomcat容器內(nèi)的優(yōu)化。打開tomcat安裝目錄\conf\server.xml文件,定位到這一行:這一行就是我們的tomcat容器性能參數(shù)設(shè)置的地方,它一般都會有一個默認值,這些默認值是遠遠不夠我們的使用的,我們來看經(jīng)過更改后的這一段的配置:URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" redirectPort="8443"/>好大一陀唉。。。。。。沒關(guān)系,一個個來解釋ü URIEncoding=”UTF-8”使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里還有搞個mod_encoding,還要手工編譯ü maxSpareThreadsmaxSpareThreads 的意思就是如果空閑狀態(tài)的線程數(shù)多于設(shè)置的數(shù)目,則將這些線程中止,減少這個池中的線程總數(shù)。ü minSpareThreads最小備用線程數(shù),tomcat啟動時的初始化的線程數(shù)。ü enableLookups這個功效和Apache中的HostnameLookups一樣,設(shè)為關(guān)閉。ü connectionTimeoutconnectionTimeout為網(wǎng)絡(luò)連接超時時間毫秒數(shù)。ü maxThreadsmaxThreads Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創(chuàng)建的最大的線程數(shù),即最大并發(fā)數(shù)。ü acceptCountacceptCount是當線程數(shù)達到maxThreads后,后續(xù)請求會被放入一個等待隊列,這個acceptCount是這個隊列的大小,如果這個隊列也滿了,就直接refuse connectionü maxProcessors與minProcessors在 Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關(guān)的、能夠獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最 大利用率的高效程序,使空閑時間保持最低,從而接受更多的請求。通常Windows是1000個左右,Linux是2000個左右。ü useURIValidationHack我們來看一下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); } }可以看到如果把useURIValidationHack設(shè)成"false",可以減少它對一些url的不必要的檢查從而減省開銷。ü enableLookups="false"為了消除DNS查詢對性能的影響我們可以關(guān)閉DNS查詢,方式是修改server.xml文件中的enableLookups參數(shù)值。ü disableUploadTimeout類似于Apache中的keeyalive一樣ü 給Tomcat配置gzip壓縮(HTTP壓縮)功能compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"HTTP 壓縮可以大大提高瀏覽網(wǎng)站的速度,它的原理是,在客戶端請求網(wǎng)頁后,從服務(wù)器端將網(wǎng)頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負責(zé)解壓縮并瀏覽。相對 于普通的瀏覽過程HTML,CSS,Javascript , Text ,它可以節(jié)省40%左右的流量。更為重要的是,它可以對動態(tài)生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網(wǎng)頁也能進行壓縮,壓縮效率驚人。1)compression="on" 打開壓縮功能2)compressionMinSize="2048" 啟用壓縮的輸出內(nèi)容大小,這里面默認為2KB3)noCompressionUserAgents="gozilla, traviata" 對于以下的瀏覽器,不啟用壓縮4)compressableMimeType="text/html,text/xml" 壓縮類型最后不要忘了把8443端口的地方也加上同樣的配置,因為如果我們走https協(xié)議的話,我們將會用到8443端口這個段的配置,對吧?URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="d:/tomcat2/conf/shnlap93.jks" keystorePass="aaaaaa" />好了,所有的Tomcat優(yōu)化的地方都加上了。結(jié)合第三天中的Apache的性能優(yōu)化,我們這個架構(gòu)可以“飛奔”起來了,當然這邊把有提及任何關(guān)于數(shù)據(jù)庫優(yōu)化的步驟,但僅憑這兩步,我們的系統(tǒng)已經(jīng)有了很大的提升。舉個真實的例子:上一個項目,經(jīng)過4輪performance testing,第一輪進行了問題的定位,第二輪就是進行了apache+tomcat/weblogic的優(yōu)化,第三輪是做集群優(yōu)化,第四輪是sql與codes的優(yōu)化。在到達第二輪時,我們的性能已經(jīng)提升了多少倍呢?我們來看一個loaderrunner的截圖吧:左邊第一列是第一輪沒有經(jīng)過任何調(diào)優(yōu)的壓力測試報告。右邊這一列是經(jīng)過了apache優(yōu)化,tomcat優(yōu)化后得到的壓力測試報告。大家看看,這就提高了多少倍?這還只是在沒有改動代碼的情況下得到的改善,現(xiàn)在明白了好好的調(diào)優(yōu)一個apache和tomcat其實是多么的重要了?如果加上后面的代碼、SQL的調(diào)優(yōu)、數(shù)據(jù)庫的調(diào)優(yōu)。。。。。。所以我在上一個工程中有單筆交易性能(無論是吞吐量、響應(yīng)時間)提高了80倍這樣的極端例子的存在。####################################################################tomcat默認參數(shù)是為開發(fā)環(huán)境制定,而非適合生產(chǎn)環(huán)境,尤其是內(nèi)存和線程的配置,默認都很低,容易成為性能瓶頸。 tomcat內(nèi)存優(yōu)化linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m最大堆內(nèi)存是1024m,對于現(xiàn)在的硬件還是偏低,實施時,還是按照機器具體硬件配置優(yōu)化。 tomcat 線程優(yōu)化maxThreads="600" ///最大線程數(shù)minSpareThreads="100"http:///初始化時創(chuàng)建的線程數(shù)maxSpareThreads="500"http:///一旦創(chuàng)建的線程超過這個值,Tomcat就會關(guān)閉不再需要的socket線程。acceptCount="700"http://指定當所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理 這里是http connector的優(yōu)化,如果使用apache和tomcat做集群的負載均衡,并且使用ajp協(xié)議做apache和tomcat的協(xié)議轉(zhuǎn)發(fā),那么還需要優(yōu)化ajp connector。由于tomcat有多個connector,所以tomcat線程的配置,又支持多個connector共享一個線程池。首先。打開/conf/server.xml,增加最大線程500(一般服務(wù)器足以),最小空閑線程數(shù)20,線程最大空閑時間60秒。 然后,修改節(jié)點,增加executor屬性,executor設(shè)置為線程池的名字:可以多個connector公用1個線程池,所以ajp connector也同樣可以設(shè)置使用tomcatThreadPool線程池。 禁用DNS查詢當web應(yīng)用程序向要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者通過域名服務(wù)器查找機器名 轉(zhuǎn)換為IP地址。DNS查詢需要占用網(wǎng)絡(luò),并且包括可能從很多很遠的服務(wù)器或者不起作用的服務(wù)器上去獲取對應(yīng)的IP的過程,這樣會消耗一定的時間。修改server.xml文件中的Connector元素,修改屬性enableLookups參數(shù)值: enableLookups="false"如果為true,則可以通過調(diào)用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址 設(shè)置session過期時間conf\web.xml中通過參數(shù)指定:180單位為分鐘。 Apr插件提高Tomcat性能 Tomcat可以使用APR來提供超強的可伸縮性和性能,更好地集成本地服務(wù)器技術(shù). APR(Apache Portable Runtime)是一個高可移植庫,它是Apache HTTP Server 2.x的核心。APR有很多用途,包括訪問高級IO功能(例如sendfile,epoll和OpenSSL),OS級別功能(隨機數(shù)生成,系統(tǒng)狀態(tài)等等),本地進程管理(共享內(nèi)存,NT管道和UNIX sockets)。這些功能可以使Tomcat作為一個通常的前臺WEB服務(wù)器,能更好地和其它本地web技術(shù)集成,總體上讓Java更有效率作為一個高性能web服務(wù)器平臺而不是簡單作為后臺容器。 在產(chǎn)品環(huán)境中,特別是直接使用Tomcat做WEB服務(wù)器的時候,應(yīng)該使用Tomcat Native來提高其性能 要測APR給tomcat帶來的好處最好的方法是在慢速網(wǎng)絡(luò)上(模擬Internet),將Tomcat線程數(shù)開到300以上的水平,然后模擬一大堆并發(fā)請求。 如果不配APR,基本上300個線程狠快就會用滿,以后的請求就只好等待。但是配上APR之后,并發(fā)的線程數(shù)量明顯下降,從原來的300可能會馬上下降到只有幾十,新的請求會毫無阻塞的進來。 在局域網(wǎng)環(huán)境測,就算是400個并發(fā),也是一瞬間就處理/傳輸完畢,但是在真實的Internet環(huán)境下,頁面處理時間只占0.1%都不到,絕大部分時間都用來頁面?zhèn)鬏?。如果不用APR,一個線程同一時間只能處理一個用戶,勢必會造成阻塞。所以生產(chǎn)環(huán)境下用apr是非常必要的。復(fù)制代碼(1)安裝APR tomcat-native apr-1.3.8.tar.gz 安裝在/usr/local/apr #tar zxvf apr-1.3.8.tar.gz #cd apr-1.3.8 #./configure;make;make install apr-util-1.3.9.tar.gz 安裝在/usr/local/apr/lib #tar zxvf apr-util-1.3.9.tar.gz #cd apr-util-1.3.9 #./configure --with-apr=/usr/local/apr ----with-java-home=JDK;make;make install #cd apache-tomcat-6.0.20/bin #tar zxvf tomcat-native.tar.gz #cd tomcat-native/jni/native #./configure --with-apr=/usr/local/apr;make;make install (2)設(shè)置 Tomcat 整合 APR 修改 tomcat 的啟動 shell (startup.sh),在該文件中加入啟動參數(shù): CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/apr/lib" 。 (3)判斷安裝成功: 如果看到下面的啟動日志,表示成功。 2007-4-26 15:34:32 org.apache.coyote.http11.Http11AprProtocol init

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容