日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

cent 8.0 安装tomcat 9.0_Tomcat部署及优化

發(fā)布時(shí)間:2023/12/19 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cent 8.0 安装tomcat 9.0_Tomcat部署及优化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文章地址: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.gz

2、解壓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/tomcat

3、設(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.FileHandler

2、修改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 -Xmx

3、JVM參數(shù)詳解

  • -Xms:初始堆內(nèi)存Heap大小,使用的最小內(nèi)存,cpu性能高時(shí)此值應(yīng)設(shè)的大一些
  • -Xmx:初始堆內(nèi)存heap最大值,使用的最大內(nèi)存
  • 上面兩個(gè)值是分配JVM的最小和最大內(nèi)存,取決于硬件物理內(nèi)存的大小,建議均設(shè)為物理內(nèi)存的一半。
  • -XX:PermSize:設(shè)定內(nèi)存的永久保存區(qū)域
  • -XX:MaxPermSize:設(shè)定最大內(nèi)存的永久保存區(qū)域
  • -XX:MaxNewSize:
  • -Xss 15120 這使得JBoss每增加一個(gè)線程(thread)就會(huì)立即消耗15M內(nèi)存,而最佳值應(yīng)該是128K,默認(rèn)值好像是512k.
  • +XX:AggressiveHeap 會(huì)使得 Xms沒(méi)有意義。這個(gè)參數(shù)讓jvm忽略Xmx參數(shù),瘋狂地吃完一個(gè)G物理內(nèi)存,再吃盡一個(gè)G的swap。
  • -Xss:每個(gè)線程的Stack大小
  • -verbose:gc 現(xiàn)實(shí)垃圾收集信息
  • -Xloggc:gc.log 指定垃圾收集日志文件
  • -Xmn:young generation的heap大小,一般設(shè)置為Xmx的3、4分之一
  • -XX:+UseParNewGC :縮短minor收集的時(shí)間
  • -XX:+UseConcMarkSweepGC :縮短major收集的時(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 Bootstrap

    3、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 install

    apr-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 install

    3、安裝完成后目錄結(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/lib

    2、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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。