cent 8.0 安装tomcat 9.0_Tomcat部署及优化
原文章地址:https://www.cnblogs.com/happy-king/p/9193257.html
一、Tomcat安裝部署
一、安裝jdk和Tomcat
1、上傳jdk和Tomcat
mkdir -p /opt/tools/ /application ##jdk:jdk-8u131 tomcat:9.0 cd /opt/tools/ rz apache-tomcat-9.0.0.M17.tar.gz jdk-8u131-linux-x64.tar.gz2、解壓jdk和Tomcat
1、jdk部署 tar xf jdk-8u131-linux-x64.tar.gz -C /application chown -R root.root /application/jdk1.8.0_131/ ln -s /application/jdk1.8.0_131/ /application/jdk2、Tomcat部署 tar xf apache-tomcat-9.0.0.M17.tar.gz -C /application chown -R root.root /application/apache-tomcat-9.0.0.M17/ ln -s /application/apache-tomcat-9.0.0.M17/ /application/tomcat3、設(shè)定環(huán)境變量
方法一:vim設(shè)置/etc/profile
#jdk export JAVA_HOME=/application/jdk export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH #tomcat export TOMCAT_HOME=/application/tomcat export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar方法二:sed追加
sed -i.bak '$a export JAVA_HOME=/application/jdknexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHnexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile使配置生效,查看java版本
source /etc/profile java -version二、Tomcat配置文件server.xml詳解
<Server port="8015" shutdown="WZSSHUTDOWN"><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><!-- Security listener. Documentation at /docs/config/listeners.html<Listener className="org.apache.catalina.security.SecurityListener" /><!-- Define an AJP 1.3 Connector on port 8009 --><!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />--><Connector port="8221" protocol="HTTP/1.1" #port 端口配置connectionTimeout="20000" #connectionTimeout指定超時(shí)的時(shí)間數(shù)(以毫秒為單位)maxThreads="3000" #tomcat起動(dòng)的最大線程數(shù),即同時(shí)處理的任務(wù)個(gè)數(shù),默認(rèn)值為200minSpareThreads="100" #初始化時(shí)創(chuàng)建的線程數(shù)acceptCount="800" #指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí),可以放到處理隊(duì)列中的請(qǐng)求數(shù),超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理maxKeepAliveRequests="200" #表示該連接最大支持的請(qǐng)求數(shù)。超過(guò)該請(qǐng)求數(shù)的連接也將被關(guān)閉(此時(shí)就會(huì)返回一個(gè)Connection: close頭給客戶端)。URIEncoding="UTF-8" #指定字符集redirectPort="8443" /> #指定服務(wù)器正在處理http請(qǐng)求時(shí)收到了一個(gè)SSL傳輸請(qǐng)求后重定向的端口號(hào)/application/tomcat/conf/server.xml
三、Tomcat的日志級(jí)別
1、日志級(jí)別詳解
#可配置項(xiàng)(5類(lèi)日志):catalina、localhost、manager、admin、host-manager handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler#日志輸出為輸出到文件和輸出到控制臺(tái) .handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler#日志輸出級(jí)別:SEVERE (最高級(jí)別) > WARNING > INFO > CONFIG > FINE > FINER(精心) > FINEST (所有內(nèi)容,最低級(jí)別) #配置文件使catalina日志輸出級(jí)別為FINE 1catalina.org.apache.juli.FileHandler.level = FINE #catalina文件輸出位置 1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs #catalina日志前綴為catalina 1catalina.org.apache.juli.FileHandler.prefix = catalina.#配置文件使localhost日志輸出級(jí)別為FINE 2localhost.org.apache.juli.FileHandler.level = FINE #localhost文件輸出位置 2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs #localhost日志前綴為localhost 2localhost.org.apache.juli.FileHandler.prefix = localhost.#配置文件使manager日志輸出級(jí)別為FINE 3manager.org.apache.juli.FileHandler.level = FINE #manager文件輸出位置 3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs #manager日志前綴為manager 3manager.org.apache.juli.FileHandler.prefix = manager.#配置文件使host-manager日志輸出級(jí)別為FINE 4host-manager.org.apache.juli.FileHandler.level = FINE #host-manager文件輸出位置 4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs #host-manager日志前綴為host-manager 4host-manager.org.apache.juli.FileHandler.prefix = host-manager.#配置文件使控制臺(tái)日志輸出級(jí)別為FINE java.util.logging.ConsoleHandler.level = FINE #控制臺(tái)日志輸出格式 java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter#localhost日志文件輸出級(jí)別為INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO #localhost日志文件輸出處理類(lèi)2localhost.org.apache.juli.FileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler#manager日志文件輸出級(jí)別為INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO #manager日志文件輸出處理類(lèi)3manager.org.apache.juli.FileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.FileHandler#host-manager日志文件輸出級(jí)別為INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO #host-manager日志文件輸出處理類(lèi)4host-manager.org.apache.juli.FileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler2、修改Tomcat默認(rèn)的日志級(jí)別,減少日志量
將logging.properties將FINE改成INFO
二、Tomcat優(yōu)化
一、內(nèi)存優(yōu)化
默認(rèn)情況下Tomcat的相關(guān)內(nèi)存配置較低,這對(duì)于一些大型項(xiàng)目顯然是不夠用的,這些項(xiàng)目運(yùn)行就已經(jīng)耗費(fèi)了大部分內(nèi)存空間,何況大規(guī)模訪問(wèn)的情況。
1、內(nèi)存問(wèn)題
即使是本文中的這個(gè)只有一個(gè)頁(yè)面的超小項(xiàng)目,在并發(fā)達(dá)到一定程度后也會(huì)拋出以下類(lèi)似異常:
嚴(yán)重: Exception invoking periodic operation: java.lang.OutOfMemoryError: Java heap space 嚴(yán)重: Error processing request java.lang.OutOfMemoryError: GC overhead limit exceeded說(shuō)明Tomcat已經(jīng)無(wú)力支持訪問(wèn)處理,內(nèi)部GC也已經(jīng)“無(wú)能無(wú)力”。所以一般情況下我們需要重新配置Tomcat的相關(guān)內(nèi)存大小。
2、修改內(nèi)存等jvm相關(guān)配置
Linux下修改TOMCAT_HOME/bin/catalina.sh,在其中加入,可以放在CLASSPATH=下面(#OS specific添加以下代碼):
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=512m"windows下修改TOMCAT_HOME/bin/catalina.bat,在其中加入,可以放在set CLASSPATH=下面:
set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx3、JVM參數(shù)詳解
4、驗(yàn)證
1、JDK自帶的驗(yàn)證工具
設(shè)置成功后我們可以利用JDK自帶的工具進(jìn)行驗(yàn)證,這些工具都在JAVA_HOME/bin目錄下:
1 jps:用來(lái)顯示本地的java進(jìn)程,以及進(jìn)程號(hào),進(jìn)程啟動(dòng)的路徑等。 2 jmap:觀察運(yùn)行中的JVM 物理內(nèi)存的占用情況,包括Heap size , Perm size 下載地址 等。2、jps工具
進(jìn)入命令行模式后,進(jìn)入JAVA_HOME/bin目錄下,然后輸入jps命令:其中Bootstrap進(jìn)程是啟動(dòng)Tomcat的進(jìn)程。
# jps 9635 Jps 6601 -- process information unavailable 36884 Bootstrap3、jmap工具
jmap查看其內(nèi)存相關(guān)配置
# jmap -heap 36884 Attaching to process ID 36884, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.79-b02using parallel threads in the new generation. using thread-local object allocation. Concurrent Mark-Sweep GCHeap Configuration:MinHeapFreeRatio = 40MaxHeapFreeRatio = 70MaxHeapSize = 4294967296 (4096.0MB) //最大堆內(nèi)存NewSize = 2147483648 (2048.0MB)MaxNewSize = 2147483648 (2048.0MB)OldSize = 5439488 (5.1875MB)NewRatio = 2SurvivorRatio = 4PermSize = 268435456 (256.0MB) //永久代初始大小 MaxPermSize = 536870912 (512.0MB) 永久代最大大小G1HeapRegionSize = 0 (0.0MB)Heap Usage: New Generation (Eden + 1 Survivor Space):capacity = 1789591552 (1706.6875MB)used = 196280728 (187.1878890991211MB)free = 1593310824 (1519.499610900879MB)10.96790649132434% used Eden Space:capacity = 1431699456 (1365.375MB)used = 180701304 (172.33019256591797MB)free = 1250998152 (1193.044807434082MB)12.621455099582017% used From Space:capacity = 357892096 (341.3125MB)used = 15579424 (14.857696533203125MB)free = 342312672 (326.4548034667969MB)4.353106473745651% used To Space:capacity = 357892096 (341.3125MB)used = 0 (0.0MB)free = 357892096 (341.3125MB) 0.0% used concurrent mark-sweep generation:capacity = 2147483648 (2048.0MB)used = 637442344 (607.9123916625977MB)free = 1510041304 (1440.0876083374023MB)29.683222249150276% used Perm Generation:capacity = 268435456 (256.0MB)used = 116514152 (111.1165542602539MB)free = 151921304 (144.8834457397461MB)43.40490400791168% used74530 interned Strings occupying 7681632 bytes.從結(jié)果可以看出配置已經(jīng)成功了。
二、配置優(yōu)化
TOMCAT_HOME/conf/server.xml可以配置端口,虛擬路徑等等 Tomcat相關(guān)主要配置。
1、Connector 優(yōu)化
Connector是連接器,負(fù)責(zé)接收客戶的請(qǐng)求,以及向客戶端回送響應(yīng)的消息。所以 Connector的優(yōu)化是重要部分。默認(rèn)情況下 Tomcat只支持200線程訪問(wèn),超過(guò)這個(gè)數(shù)量的連接將被等待甚至超時(shí)放棄,所以我們需要提高這方面的處理能力。
? 修改這部分配置需要修改TOMCAT_HOME/conf/server.xml,打開(kāi)server.xml找到Connector 標(biāo)簽項(xiàng),默認(rèn)配置如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />其中port代表服務(wù)接口;protocol代表協(xié)議類(lèi)型;connectionTimeout代表連接超時(shí)時(shí)間,單位為毫秒;redirectPort代表安全通信(https)轉(zhuǎn)發(fā)端口,一般配置成443。
? 可以看到除了這幾個(gè)基本配置外并無(wú)特殊功能,所以我們需要對(duì) Connector 進(jìn)行擴(kuò)展。
? 其中Connector 支持參數(shù)屬性可以參考Tomcat官方網(wǎng)站(https://tomcat.apache.org/tomcat-8.0-doc/config/http.html),非常多,所以本文就只介紹些常用的。
? 我們將 Connector 配置修改為如下:
<Connector port="8080" protocol="HTTP/1.1" maxThreads="1000" minSpareThreads="100" acceptCount="1000" maxConnections="1000" connectionTimeout="20000" maxHttpHeaderSize="8192" tcpNoDelay="true" compression="on" compressionMinSize="2048" disableUploadTimeout="true" redirectPort="8443" enableLookups="false" URIEncoding="UTF-8" />1、port:
代表Tomcat監(jiān)聽(tīng)端口,也就是網(wǎng)站的訪問(wèn)端口,默認(rèn)為8080,可以根據(jù)需要改成其他。
2、protocol:
協(xié)議類(lèi)型,可選類(lèi)型有四種,分別為BIO(阻塞型IO),NIO,NIO2和APR。
? **(1)BIO:BIO(Blocking I/O),**顧名思義,即阻塞式I/O操作,表示Tomcat使用的是傳統(tǒng)的Java I/O操作(即http://java.io包及其子包)。Tomcat在默認(rèn)情況下,是以bio模式運(yùn)行的。遺憾的是,就一般而言,bio模式是三種運(yùn)行模式中性能最低的一種。BIO配置采用默認(rèn)即可。
? (2)NIO:NIO(New I/O),是Java SE 1.4及后續(xù)版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個(gè)基于緩沖區(qū)、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫(xiě)。它擁有比傳統(tǒng)I/O操作(bio)更好的并發(fā)運(yùn)行性能。要讓Tomcat以nio模式來(lái)運(yùn)行也比較簡(jiǎn)單,我們只需要protocol類(lèi)型修改為:
//NIO protocol="org.apache.coyote.http11.Http11NioProtocol" //NIO2 protocol="org.apache.coyote.http11.Http11Nio2Protocol"? (3)APR:APR(Apache Portable Runtime/Apache可移植運(yùn)行時(shí)),是Apache HTTP服務(wù)器的支持庫(kù)。你可以簡(jiǎn)單地理解為:Tomcat將以JNI的形式調(diào)用 Apache HTTP服務(wù)器的核心動(dòng)態(tài)鏈接庫(kù)來(lái)處理文件讀取或網(wǎng)絡(luò)傳輸操作,從而大大地提高 Tomcat對(duì)靜態(tài)文件的處理性能。
? 與配置 NIO運(yùn)行模式一樣,也需要將對(duì)應(yīng)的 Connector節(jié)點(diǎn)的 protocol屬性值改為:
protocol="org.apache.coyote.http11.Http11AprProtocol"相關(guān)APR介紹及配置會(huì)在下面專(zhuān)門(mén)講。
3、maxThreads:
由該連接器創(chuàng)建的處理請(qǐng)求線程的最大數(shù)目,也就是可以處理的同時(shí)請(qǐng)求的最大數(shù)目。如果未配置默認(rèn)值為200。如果一個(gè)執(zhí)行器與此連接器關(guān)聯(lián),則忽略此屬性,因?yàn)樵搶傩詫⒈缓雎?#xff0c;所以該連接器將使用執(zhí)行器而不是一個(gè)內(nèi)部線程池來(lái)執(zhí)行任務(wù)。
? maxThreads是一個(gè)重要的配置屬性,maxThreads配置的合理直接影響了Tomcat的相關(guān)性能,所以這里我們重點(diǎn)討論下。
? maxThreads并不是配置的越大越好,事實(shí)上你即使配置成999999也是沒(méi)有用的,因?yàn)檫@個(gè)最大值是受操作系統(tǒng)及相關(guān)硬件所制約的,并且最大值并不一定是最優(yōu)值,所以我們追尋的應(yīng)該是最優(yōu)值而不是最大值。
? QPS(Query Per Second):每秒查詢(xún)率QPS是對(duì)一個(gè)特定的查詢(xún)服務(wù)器在規(guī)定時(shí)間內(nèi)所處理流量多少的衡量標(biāo)準(zhǔn)。我們常常使用 QPS值來(lái)衡量一個(gè)服務(wù)器的性能。
? QPS = 并發(fā)數(shù) / 平均響應(yīng)時(shí)間
? 或者
? 并發(fā)數(shù) = QPS * 平均響應(yīng)時(shí)間
? 一個(gè)系統(tǒng)吞吐量通常由QPS、并發(fā)數(shù)兩個(gè)因素決定,每套系統(tǒng)的這兩個(gè)值都有一個(gè)相對(duì)極限值,在應(yīng)用場(chǎng)景訪問(wèn)壓力下,只要某一項(xiàng)達(dá)到系統(tǒng)最高值,系統(tǒng)的吞吐量就上不去了,如果壓力繼續(xù)增大,系統(tǒng)的吞吐量反而會(huì)下降,原因是系統(tǒng)超負(fù)荷工作,上下文切換、內(nèi)存等等其它消耗導(dǎo)致系統(tǒng)性能下降。所謂吞吐量這里可以理解為每秒能處理請(qǐng)求的次數(shù)。
? 所以選擇一個(gè)合理的 maxThreads值,其實(shí)并不是那么容易的事。因?yàn)檫^(guò)多的線程只會(huì)造成,更多的內(nèi)存開(kāi)銷(xiāo),更多的CPU開(kāi)銷(xiāo),但是對(duì)提升QPS確毫無(wú)幫助;找到最佳線程數(shù)后通過(guò)簡(jiǎn)單的設(shè)置,可以讓web系統(tǒng)更加穩(wěn)定,得到最高,最穩(wěn)定的QPS輸出。
我們可以通過(guò)以下幾種方式來(lái)獲取 maxThreads的最佳值:
? (1)通過(guò)線上系統(tǒng)不斷使用和用戶的不斷增長(zhǎng)來(lái)進(jìn)行性能測(cè)試,觀察QPS,響應(yīng)時(shí)間,這種方式會(huì)在爆發(fā)式增長(zhǎng)時(shí)系統(tǒng)崩潰,如雙12等。
? (2)根據(jù)公式計(jì)算,服務(wù)器端最佳線程數(shù)量=((線程等待時(shí)間+線程cpu時(shí)間)/線程cpu時(shí)間) * cpu數(shù)量,這種方式有時(shí)會(huì)被誤導(dǎo),因?yàn)槟承┫到y(tǒng)處理環(huán)節(jié)可能會(huì)耗時(shí)比較長(zhǎng),從而影響公式的結(jié)果。
? (3)單、多用戶壓力測(cè)試,查看CPU的消耗,然后直接乘以百分比,再進(jìn)行壓測(cè),一般這個(gè)值的附近應(yīng)該就是最佳線程數(shù)量,這種方式理想場(chǎng)景比較適用,實(shí)際情況會(huì)比這個(gè)復(fù)雜的多。
? (4)根據(jù)系統(tǒng)的自身情況調(diào)整,如硬件限制,系統(tǒng)限制,程序處理能力限制等。
? (5)定期修改為不同的 maxThreads值,看服務(wù)器響應(yīng)結(jié)果及用戶反應(yīng)。
? QPS和線程數(shù)的關(guān)系
? (1)在最佳線程數(shù)量之前,QPS和線程是互相遞增的關(guān)系,線程數(shù)量到了最佳線程之后,QPS持平,不在上升,甚至略有下降,同時(shí)相應(yīng)時(shí)間持續(xù)上升。
? (2)同一個(gè)系統(tǒng)而言,支持的線程數(shù)越多(最佳線程數(shù)越多而不是配置的線程數(shù)越多),QPS越高。
? QPS和響應(yīng)時(shí)間的關(guān)系
? (1)對(duì)于一般的web系統(tǒng),響應(yīng)時(shí)間一般有CPU執(zhí)行時(shí)間+IO等待時(shí)間組成。
? (2)CPU的執(zhí)行時(shí)間減少,對(duì)QPS有實(shí)質(zhì)的提升,IO時(shí)間的減少,對(duì)QPS提升不明顯。如果要想明顯提升QPS,優(yōu)化系統(tǒng)的時(shí)候要著重優(yōu)化CPU消耗大戶。
? 所以想要找出 maxThreads的最優(yōu)值可并不容易,沒(méi)有最好只有更好,更好的值只能通過(guò)時(shí)間來(lái)顯現(xiàn),如果你不想考慮那么多,一般情況下設(shè)置成1000即可。
4、minSpareThreads:
線程的最小運(yùn)行數(shù)目,這些始終保持運(yùn)行。如果未指定,默認(rèn)值為10。
5、acceptCount:
當(dāng)所有可能的請(qǐng)求處理線程都在使用時(shí)傳入連接請(qǐng)求的最大隊(duì)列長(zhǎng)度。如果未指定,默認(rèn)值為100。一般是設(shè)置的跟 maxThreads一樣或一半,此值設(shè)置的過(guò)大會(huì)導(dǎo)致排隊(duì)的請(qǐng)求超時(shí)而未被處理。所以這個(gè)值應(yīng)該是主要根據(jù)應(yīng)用的訪問(wèn)峰值與平均值來(lái)權(quán)衡配置。
6、maxConnections:
在任何給定的時(shí)間內(nèi),服務(wù)器將接受和處理的最大連接數(shù)。當(dāng)這個(gè)數(shù)字已經(jīng)達(dá)到時(shí),服務(wù)器將接受但不處理,等待進(jìn)一步連接。NIO與NIO2的默認(rèn)值為10000,APR默認(rèn)值為8192。
7、connectionTimeout:
當(dāng)請(qǐng)求已經(jīng)被接受,但未被處理,也就是等待中的超時(shí)時(shí)間。單位為毫秒,默認(rèn)值為60000。通常情況下設(shè)置為30000。
8、maxHttpHeaderSize:
請(qǐng)求和響應(yīng)的HTTP頭的最大大小,以字節(jié)為單位指定。如果沒(méi)有指定,這個(gè)屬性被設(shè)置為8192(8 KB)。
9、tcpNoDelay:
如果為true,服務(wù)器socket會(huì)設(shè)置TCP_NO_DELAY選項(xiàng),在大多數(shù)情況下可以提高性能。缺省情況下設(shè)為true。
10、compression:
是否啟用gzip壓縮,默認(rèn)為關(guān)閉狀態(tài)。這個(gè)參數(shù)的可接受值為“off”(不使用壓縮),“on”(壓縮文本數(shù)據(jù)),“force”(在所有的情況下強(qiáng)制壓縮)。
11、compressionMinSize:
如果compression=“on”,則啟用此項(xiàng)。被壓縮前數(shù)據(jù)的最小值,也就是超過(guò)這個(gè)值后才被壓縮。如果沒(méi)有指定,這個(gè)屬性默認(rèn)為“2048”(2K),單位為byte。
12、disableUploadTimeout:
這個(gè)標(biāo)志允許servlet Container在一個(gè)servlet執(zhí)行的時(shí)候,使用一個(gè)不同的,更長(zhǎng)的連接超時(shí)。最終的結(jié)果是給servlet更長(zhǎng)的時(shí)間以便完成其執(zhí)行,或者在數(shù)據(jù)上載的時(shí)候更長(zhǎng)的超時(shí)時(shí)間。如果沒(méi)有指定,設(shè)為false。
13、enableLookups:
關(guān)閉DNS反向查詢(xún)。
14、URIEncoding:
URL編碼字符集。
? Connector 還有很多其他參數(shù),可以參考Tomcat官網(wǎng),這里只介紹與性能相關(guān)的部分。
2、BIO、NIO、APR
? 通過(guò)配置 protocol的類(lèi)型可以使用不同的 Connector處理請(qǐng)求。
//BIO protocol="HTTP/1.1" //NIO protocol="org.apache.coyote.http11.Http11NioProtocol" //NIO2 protocol="org.apache.coyote.http11.Http11Nio2Protocol" //APR protocol="org.apache.coyote.http11.Http11AprProtocol"以下是幾種類(lèi)型 Connector的參數(shù)對(duì)比:
并不是說(shuō) BIO的性能就一定不如 NIO,這幾種類(lèi)型 Connector之間并沒(méi)有明顯的性能區(qū)別,它們之間實(shí)現(xiàn)流程和原理不同,所以它們的選擇是需要根據(jù)應(yīng)用的類(lèi)型來(lái)決定的。
? BIO更適合處理簡(jiǎn)單流程,如程序處理較快可以立即返回結(jié)果。簡(jiǎn)單項(xiàng)目及應(yīng)用可以采用BIO。
? NIO更適合后臺(tái)需要耗時(shí)完成請(qǐng)求的操作,如程序接到了請(qǐng)求后需要比較耗時(shí)的處理這已請(qǐng)求,所以無(wú)法立即返回結(jié)果,這樣如果采用BIO就會(huì)占用一個(gè)連接,而使用NIO后就可以將此連接轉(zhuǎn)讓給其他請(qǐng)求,直至程序處理完成返回為止。
? APR可以大大提升Tomcat對(duì)靜態(tài)文件的處理性能,同時(shí)如果你使用了HTTPS方式傳輸?shù)脑?#xff0c;也可以提升SSL的處理性能。
? 本文的最后會(huì)對(duì)幾種 Connector進(jìn)行對(duì)比測(cè)試。
3、線程池
Executor代表了一個(gè)線程池,可以在Tomcat組件之間共享。使用線程池的好處在于減少了創(chuàng)建銷(xiāo)毀線程的相關(guān)消耗,而且可以提高線程的使用效率。
1、要想使用線程池,首先需要在 Service標(biāo)簽中配置 Executor如下:
<Service name="Catalina"> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="100" maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/> ....2、參數(shù)詳解
1 name:線程池名稱(chēng),用于 Connector中指定。2 namePrefix:所創(chuàng)建的每個(gè)線程的名稱(chēng)前綴,一個(gè)單獨(dú)的線程名稱(chēng)為 namePrefix+threadNumber。3 maxThreads:池中最大線程數(shù)。4 minSpareThreads:活躍線程數(shù),也就是核心池線程數(shù),這些線程不會(huì)被銷(xiāo)毀,會(huì)一直存在。5 maxIdleTime:線程空閑時(shí)間,超過(guò)該時(shí)間后,空閑線程會(huì)被銷(xiāo)毀,默認(rèn)值為6000(1分鐘),單位毫秒。6 maxQueueSize:在被執(zhí)行前最大線程排隊(duì)數(shù)目,默認(rèn)為Int的最大值,也就是廣義的無(wú)限。除非特殊情況,這個(gè)值不需要更改,否則會(huì)有請(qǐng)求不會(huì)被處理的情況發(fā)生。7 prestartminSpareThreads:啟動(dòng)線程池時(shí)是否啟動(dòng) 8 minSpareThreads部分線程。默認(rèn)值為false,即不啟動(dòng)。9 threadPriority:線程池中線程優(yōu)先級(jí),默認(rèn)值為5,值從1到10。 10 className:線程池實(shí)現(xiàn)類(lèi),未指定情況下,默認(rèn)實(shí)現(xiàn)類(lèi)為org.apache.catalina.core.StandardThreadExecutor。如果想使用自定義線程池首先需要實(shí)現(xiàn) org.apache.catalina.Executor接口。3、線程池配置完成后需要在 Connector中指定:
<Connector executor="tomcatThreadPool" ...4、Listener
另一個(gè)影響Tomcat 性能的因素是內(nèi)存泄露。Server標(biāo)簽中可以配置多個(gè)Listener,其中 JreMemoryLeakPreventionListener是用來(lái)預(yù)防JRE內(nèi)存泄漏。此Listener只需在Server標(biāo)簽中配置即可,默認(rèn)情況下無(wú)需配置,已經(jīng)添加在 Server中。
Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />三、組件優(yōu)化
1、APR
APR到底能給我們帶來(lái)什么?
1、APR的簡(jiǎn)介
? **APR(Apache Portable Runtime)**是一個(gè)高可移植庫(kù),它是Apache HTTP Server 2.x的核心。APR有很多用途,包括訪問(wèn)高級(jí) IO功能(例如sendfile,epoll和OpenSSL),OS級(jí)別功能(隨機(jī)數(shù)生成,系統(tǒng)狀態(tài)等等),本地進(jìn)程管理(共享內(nèi)存,NT管道和UNIX sockets)。這些功能可以使Tomcat作為一個(gè)通常的前臺(tái)WEB服務(wù)器,能更好地和其它本地web技術(shù)集成,總體上讓Java更有效率作為一個(gè)高性能web服務(wù)器平臺(tái)而不是簡(jiǎn)單作為后臺(tái)容器。
? APR的目的如其名稱(chēng)一樣,主要為上層的應(yīng)用程序提供一個(gè)可以跨越多操作系統(tǒng)平臺(tái)使用的底層支持接口庫(kù)。在早期的Apache版本中,應(yīng)用程序本身必須能夠處理各種具體操作系統(tǒng)平臺(tái)的細(xì)節(jié),并針對(duì)不同的平臺(tái)調(diào)用不同的處理函數(shù)。隨著Apache的進(jìn)一步開(kāi)發(fā),Apache組織決定將這些通用的函數(shù)獨(dú)立出來(lái)并發(fā)展成為一個(gè)新的項(xiàng)目。這樣,APR的開(kāi)發(fā)就從Apache中獨(dú)立出來(lái),Apache僅僅是使用APR而已。目前APR主要還是由Apache使用,不過(guò)由于APR的較好的移植性,因此一些需要進(jìn)行移植的C程序也開(kāi)始使用APR。
? **APR使得平臺(tái)細(xì)節(jié)的處理進(jìn)行下移。**對(duì)于應(yīng)用程序而言,它們根本就不需要考慮具體的平臺(tái),不管是Unix、Linux還是Window,應(yīng)用程序執(zhí)行的接口基本都是統(tǒng)一一致的。
因此對(duì)于APR而言,可移植性和統(tǒng)一的上層接口是其考慮的一個(gè)重點(diǎn)。而APR最早的目的并不是如此,它最早只是希望將Apache中用到的所有代碼合并為一個(gè)通用的代碼庫(kù),然而這不是一個(gè)正確的策略,因此后來(lái)APR改變了其目標(biāo)。有的時(shí)候使用公共代碼并不是一件好事,比如如何將一個(gè)請(qǐng)求映射到線程或者進(jìn)程是平臺(tái)相關(guān)的,因此僅僅一個(gè)公共的代碼庫(kù)并不能完成這種區(qū)分。
APR的目標(biāo)則是希望安全合并所有的能夠合并的代碼而不需要犧牲性能。
2、APR的配置
1)下載
? APR沒(méi)有二進(jìn)制包可以下載,所以只能下載源代碼版,下載后需要構(gòu)建,需要下載的文件有:apr-1.5.2.tar.gz、apr-iconv-1.2.1.tar.gz、apr-util-1.5.4.tar.gz(Linux版為例)這三個(gè)。
? APR的官網(wǎng)為:http://apr.apache.org/
2)安裝
? windows下構(gòu)建源代碼比較麻煩,需要Visual Studio支持。
? Linux下構(gòu)建就相對(duì)簡(jiǎn)單和熟悉了,只需要執(zhí)行常規(guī)構(gòu)建命令即可:
./configure --prefix=/usr/local/apr make make install? 安裝成功后,APR會(huì)默認(rèn)安裝在 /usr/local/apr目錄下,也可以指定安裝目錄。
? apr-iconv安裝時(shí)需要指定apr的安裝位置:
./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr make make installapr-util安裝時(shí)需要指定apr的安裝位置:
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv make make install3、安裝完成后目錄結(jié)構(gòu)
安裝完成后其實(shí)是無(wú)法直接使用APR的,想使用APR還需要安裝Tomcat Native,否則Tomcat啟動(dòng)時(shí)會(huì)報(bào)以下錯(cuò)誤:
16-May-2016 02:52:42.992 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/local/apr/lib:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib2、Tomcat Native
Tomcat Native是 Tomcat可選組件,它可以讓 Tomcat使用 Apache 的 APR包來(lái)處理包括文件和網(wǎng)絡(luò)IO操作,從而提升性能及兼容性。
1、下載
? Tomcat Native可以選擇Windows與Linux版本下載。
? Tomcat Native下載地址為:http://tomcat.apache.org/download-native.cgi
2、安裝
? (1)Linux/Unix下
安裝Tomcat Native前需要安裝以下組件:
? ? APR library(我們已安裝)
? ? OpenSSL libraries
? ? Java SE Development Kit (JDK)(也已安裝)
? OpenSSL libraries安裝通過(guò)以下命令:
yum install apr-devel openssl-devel安裝成功后就可以安裝Tomcat Native了,運(yùn)行以下命令
下載地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/native/
./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-java-home=/usr/java/jdk1.7.0_79 --with-ssl=yes --prefix=/usr/local/tomcat? 注意,–prefix指向的是 Tomcat目錄。
? 注意,下載后的 Tomcat Native解壓后目錄結(jié)構(gòu)如下:
? 安裝時(shí)需要進(jìn)入native目錄。
? 安裝過(guò)程中還有可能產(chǎn)生依賴(lài)包版本不兼容的問(wèn)題(一般為openssl版本過(guò)低),這時(shí)需要卸載舊的依賴(lài),并安裝最新版本
? 當(dāng)安裝完成后出現(xiàn)以下類(lèi)似輸出時(shí),說(shuō)明安裝已經(jīng)成功:
Libraries have been installed in: /usr/local/tomcat/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. ----------------------------------------------------------------------? (2)Windows下
Windows下安裝就異常簡(jiǎn)單了,只需要把bin目錄下文件復(fù)制到tomcat/bin下即可,如果為64位
3、使用
? (1)環(huán)境變量配置
? 使用前需要配置環(huán)境變量:
echo "export LD_LIBRARY_PATH=/usr/local/apr/lib">>/etc/profile source /etc/profile? (2)修改Tomcat配置文件
? 打開(kāi)conf/server.xml文件,修改Connector 標(biāo)志的protocol屬性:
protocol="org.apache.coyote.http11.Http11AprProtocol"? 然后添加Listener:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />保存配置文件后,啟動(dòng)Tomcat,從日志中看到以下輸出時(shí),說(shuō)明全部功能都已配置成功:
16-May-2016 04:28:54.734 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Native library 1.1.34 using APR version 1.5.2. 16-May-2016 04:28:54.734 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true]. 16-May-2016 04:28:54.739 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized (OpenSSL 1.0.2h 3 May 2016)至此,APR與 Native都已安裝完成,可以使用,對(duì)于 APR與 Native還有很多知識(shí)要學(xué)習(xí),但不是本文的重點(diǎn),所以以后有機(jī)會(huì)還會(huì)深入學(xué)習(xí)。
四、性能測(cè)試
Tomcat優(yōu)化部分我們已經(jīng)完成,接下來(lái)就需要比較一下優(yōu)化前與優(yōu)化后的性能對(duì)比。
1、Jmeter
? Apache JMeter是Apache組織開(kāi)發(fā)的基于Java的壓力測(cè)試工具。用于對(duì)軟件做壓力測(cè)試,它最初被設(shè)計(jì)用于Web應(yīng)用測(cè)試,但后來(lái)擴(kuò)展到其他測(cè)試領(lǐng)域。 它可以用于測(cè)試靜態(tài)和動(dòng)態(tài)資源,例如靜態(tài)文件、Java 小服務(wù)程序、CGI 腳本、Java 對(duì)象、數(shù)據(jù)庫(kù)、FTP 服務(wù)器, 等等。JMeter 可以用于對(duì)服務(wù)器、網(wǎng)絡(luò)或?qū)ο竽M巨大的負(fù)載,來(lái)自不同壓力類(lèi)別下測(cè)試它們的強(qiáng)度和分析整體性能。另外,JMeter能夠?qū)?yīng)用程序做功能/回歸測(cè)試,通過(guò)創(chuàng)建帶有斷言的腳本來(lái)驗(yàn)證你的程序返回了你期望的結(jié)果。為了最大限度的靈活性,JMeter允許使用正則表達(dá)式創(chuàng)建斷言。
? Apache jmeter 可以用于對(duì)靜態(tài)的和動(dòng)態(tài)的資源(文件,Servlet,Perl腳本,java 對(duì)象,數(shù)據(jù)庫(kù)和查詢(xún),FTP服務(wù)器等等)的性能進(jìn)行測(cè)試。它可以用于對(duì)服務(wù)器、網(wǎng)絡(luò)或?qū)ο竽M繁重的負(fù)載來(lái)測(cè)試它們的強(qiáng)度或分析不同壓力類(lèi)型下的整體性能。你可以使用它做性能的圖形分析或在大并發(fā)負(fù)載測(cè)試你的服務(wù)器/腳本/對(duì)象。
Jmeter官網(wǎng):http://jmeter.apache.org/
1、JMeter的作用
? (1)能夠?qū)TTP和FTP服務(wù)器進(jìn)行壓力和性能測(cè)試, 也可以對(duì)任何數(shù)據(jù)庫(kù)進(jìn)行同樣的測(cè)試(通過(guò)JDBC),Jmeter支持以下服務(wù)器協(xié)議類(lèi)型測(cè)試:
? ? Web - HTTP, HTTPS
? ? SOAP / REST
? ? FTP
? ? Database via JDBC
? ? LDAP
? ? Message-oriented middleware (MOM) via JMS
? ? Mail - SMTP(S), POP3(S) and IMAP(S)
? ? MongoDB (NoSQL)
? ? Native commands or shell scripts
? ? TCP
? (2)完全的可移植性和100% 純java。
? (3)完全 Swing 和輕量組件支持(預(yù)編譯的JAR使用 javax.swing.*)包。
? (4)完全多線程 框架允許通過(guò)多個(gè)線程并發(fā)取樣和 通過(guò)單獨(dú)的線程組對(duì)不同的功能同時(shí)取樣。
? (5)精心的GUI設(shè)計(jì)允許快速操作和更精確的計(jì)時(shí)。
? (6)緩存和離線分析/回放測(cè)試結(jié)果。
2、JMeter特性
? (1)可鏈接的取樣器允許無(wú)限制的測(cè)試能力。
? (2)各種負(fù)載統(tǒng)計(jì)表和可鏈接的計(jì)時(shí)器可供選擇。
? (3)數(shù)據(jù)分析和可視化插件提供了很好的可擴(kuò)展性以及個(gè)性化。
? (4)具有提供動(dòng)態(tài)輸入到測(cè)試的功能(包括JavaScript)。
? (5)支持腳本編程的取樣器(在1.9.2及以上版本支持BeanShell)。
? 在設(shè)計(jì)階段,JMeter能夠充當(dāng)HTTP PROXY(代理)來(lái)記錄IE/NETSCAPE的HTTP請(qǐng)求,也可以記錄apache等WebServer的log文件來(lái)重現(xiàn)HTTP流量。當(dāng)這些HTTP客戶端請(qǐng)求被記錄以后,測(cè)試運(yùn)行時(shí)可以方便的設(shè)置重復(fù)次數(shù)和并發(fā)度(線程數(shù))來(lái)產(chǎn)生巨大的流量。JMeter還提供可視化組件以及報(bào)表工具把量服務(wù)器在不同壓力下的性能展現(xiàn)出來(lái)。
? 相比其他HTTP測(cè)試工具,JMeter最主要的特點(diǎn)在于擴(kuò)展性強(qiáng)。JMeter能夠自動(dòng)掃描其lib/ext子目錄下.jar文件中的插件,并且將其裝載到內(nèi)存,讓用戶通過(guò)不同的菜單調(diào)用。
3、JMeter使用
? 使用Jmeter非常簡(jiǎn)單,windows下進(jìn)入bin目錄直接雙擊jmeter.bat文件即可,Linux下類(lèi)似,需要運(yùn)行jmeter.sh文件,Jmeter運(yùn)行后顯示以下界面:
Jmeter使用起來(lái)比較簡(jiǎn)單,附件是一個(gè)簡(jiǎn)單的配置,直接導(dǎo)入即可使用。
2、測(cè)試條件
? Tomcat版本:8.0.33
? 測(cè)試項(xiàng)目:新創(chuàng)建一個(gè)web項(xiàng)目也不用實(shí)現(xiàn)任何代碼,只需要部署即可以使用,只有一個(gè)index.jsp文件。
? JDK版本:jdk1.7.0.67
? 請(qǐng)求方式:POST
? 循環(huán)次數(shù):100,1000
? 線程數(shù):10,100,1000
? 總次數(shù):總次數(shù) = 線程數(shù) * 循環(huán)次數(shù)
? CPU:英特爾 第二代酷睿 i5-2450M(雙核)
? 內(nèi)存:8GB
? 附件時(shí)Jmeter的配置文件,可以直接導(dǎo)入使用。
3、測(cè)試結(jié)果
? 從部分結(jié)果來(lái)看優(yōu)化過(guò)的Tomcat會(huì)比默認(rèn)性能及并發(fā)處理能力上有提高,但至于參數(shù)的配置需要結(jié)合硬件及操作系統(tǒng)來(lái)不斷調(diào)整,所以并不會(huì)有一個(gè)萬(wàn)能的參數(shù)來(lái)使用,需要各位不斷的測(cè)試不斷更改。
? 以下是一個(gè)簡(jiǎn)單的測(cè)試結(jié)果,循環(huán)100次,線程數(shù)分別為10,100,1000:
? 各位估計(jì)已經(jīng)發(fā)現(xiàn)了相同的應(yīng)用下并不一定某種protocol就一定性能出色,因?yàn)門(mén)omcat中的這個(gè)測(cè)試項(xiàng)目只有一個(gè)index.jsp頁(yè)面,在較少線程數(shù)訪問(wèn)情況下BIO反應(yīng)最快,而當(dāng)線程數(shù)達(dá)到1000時(shí)NIO2性能最出色,而APR中規(guī)中矩,雖然這種測(cè)試的局限性很大,但也可以反映出:想要找出適合的配置及最佳性能需要結(jié)合實(shí)際,不斷的測(cè)試與改進(jìn),最終才能達(dá)到一個(gè)相對(duì)穩(wěn)定的性能,雖然此時(shí)的性能未必是最佳的,但卻是能應(yīng)對(duì)絕大多數(shù)情況的。
? 總結(jié):Tomcat相關(guān)優(yōu)化也只是一個(gè)入門(mén)介紹,每一種技術(shù)之中還是有很多很深?yuàn)W的知識(shí)要去學(xué)習(xí),只有不斷的去學(xué)習(xí)才能不斷的提高。
總結(jié)
以上是生活随笔為你收集整理的cent 8.0 安装tomcat 9.0_Tomcat部署及优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 剧版《银河英雄传说》版权成谜 原作方:第
- 下一篇: eclipse从入门到精通_JAVA成长