1、目錄:
a、基礎(chǔ)調(diào)優(yōu)
b、JVM 優(yōu)化
c、高級調(diào)優(yōu)
2、基礎(chǔ)調(diào)優(yōu):
2.1、tomcat的各版本的優(yōu)化參數(shù)有點(diǎn)不一樣,可以啟動tomcat之后訪問[http://127.0.0.1:8080/docs/config]查看說明
2.2、配置tomcat管理員賬戶(查看 Tomcat 的運(yùn)行狀態(tài)),編輯 /opt/tomcat7/bin/conf/tomcat-users.xml 文件,在里面添加下面信息:
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>
配置好之后登錄http://127.0.0.1:8080/進(jìn)入到主界面:
如圖所示有標(biāo)記的三個按鈕,點(diǎn)擊登錄之后,分別進(jìn)入到服務(wù)狀態(tài)查看界面,Tomcat Web應(yīng)用管理界面,主機(jī)管理界面。我們接下來會提到前兩個的部分功能,第三個就是配置虛擬機(jī),跟直接在server.xml配置效果一樣
2.3、配置
先登錄上面配置的管理員賬號進(jìn)入Server Status界面
界面可以看到 "ajp-nio-8009"和"http-nio-8081",由于我是用的最新的tomcat9做的演示,所以我們看到的IO類型直接就是非阻塞的同步IO(nio),Tomcat6/7/8默認(rèn)的都是阻塞式的同步IO(bio),因?yàn)閚io效果要遠(yuǎn)大于bio,所以我們要改為nio,之所以之前默認(rèn)為bio,知識為了兼容jdk1.4以下版本。
2.3.1修改bio為nio,只需要修改/conf/server.xml中的
<Connector
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
/>
變?yōu)?/p>
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
<!-- 或者protocol="org.apache.coyote.http11.Http11Nio2Protocol" -->
<!--或者protocol="org.apache.coyote.http11.Http11AprProtocol"-->
connectionTimeout="20000"
redirectPort="8443"
/>
注意:Tomcat 8 設(shè)置 nio2 更好:(如果這個用不了,就用nio)Tomcat 6、7 設(shè)置 nio 更好,nio2也就是非阻塞的異步IO,性能比nio更好一點(diǎn),APR(ApachePortable Runtime/Apache可移植運(yùn)行時),是ApacheHTTP服務(wù)器的支持庫。你可以簡單地理解為:Tomcat將以JNI的形式調(diào)用Apache HTTP服務(wù)器的核心動態(tài)鏈接庫來處理文件讀取或網(wǎng)絡(luò)傳輸操作,從而大大地提高Tomcat對靜態(tài)文件的處理性能。
2.3.2 enableLookups,禁用DNS查詢
2.3.3 acceptorThreadCount,用于接收連接的線程的數(shù)量,默認(rèn)值是1。一般這個指需要改動的時候是因?yàn)樵摲?wù)器是一個多核CPU,如果是多核 CPU 一般配置為 2
2.3.4 acceptCount,指定當(dāng)所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊(duì)列中的請求數(shù),超過這個數(shù)的請求將不予處理,默認(rèn)設(shè)置 100
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
enableLookups="false"
acceptCount="100"
acceptorThreadCount="2"
connectionTimeout="20000"
redirectPort="8443"
/>
2.3.5 Tomcat緩存優(yōu)化
compression打開壓縮功能
compressionMinSize啟用壓縮的輸出內(nèi)容大小,這里面默認(rèn)為2KB
compressableMimeType壓縮類型
connectionTimeout定義建立客戶連接超時的時間.如果為-1,表示不限制建立客戶連接的時間
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
2.3.6配置最大線程數(shù)量(默認(rèn)200)
maxThreads:由該連接器創(chuàng)建的處理請求線程的最大數(shù)目,也就是可以處理的同時請求的最大數(shù)目。如果未配置默認(rèn)值為200。如果一個執(zhí)行器與此連接器關(guān)聯(lián),則忽略此屬性,因?yàn)樵搶傩詫⒈缓雎裕栽撨B接器將使用執(zhí)行器而不是一個內(nèi)部線程池來執(zhí)行任務(wù)。maxThreads是一個重要的配置屬性,maxThreads配置的合理直接影響了Tomcat的相關(guān)性能,所以這里我們重點(diǎn)討論下。
maxThreads并不是配置的越大越好,事實(shí)上你即使配置成999999也是沒有用的,因?yàn)檫@個最大值是受操作系統(tǒng)及相關(guān)硬件所制約的,并且最大值并不一定是最優(yōu)值,所以我們追尋的應(yīng)該是最優(yōu)值而不是最大值。
2.3.7禁用 AJP(如果你服務(wù)器沒有使用 Apache)
AJP是為了配合Apache處理靜態(tài)文件服務(wù)器,進(jìn)行服務(wù)器間文件傳輸?shù)膮f(xié)議,用不上的話就注銷它,后面我會講述Tomcat配合Nginx處理靜態(tài)文件(動靜分離和負(fù)載均衡)
把下面這一行注釋掉,默認(rèn) Tomcat 是開啟的。
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
禁用之后我們可以看一下服務(wù)狀態(tài)頁面:
發(fā)現(xiàn)AJP協(xié)議已經(jīng)沒有了,nio轉(zhuǎn)換為nio2了
2.3.8整合:
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000" //最大線程數(shù),默認(rèn)200
minSpareThreads="100" //Tomcat初始化時創(chuàng)建的socket線程數(shù),線程的最小運(yùn)行數(shù)目,這些始終保持運(yùn)行,如果未指定,默認(rèn)值為10
maxSpareThreads="1000"http://Tomcat連接器的最大空閑socket線程數(shù)
minProcessors="100"http://服務(wù)器創(chuàng)建時的最小處理線程數(shù)
maxProcessors="1000"http://服務(wù)器同時最大處理線程數(shù)
enableLookups="false"http://關(guān)閉DNS反向查詢,若設(shè)為true,則支持域名解析,可把ip地址解析為主機(jī)名
compression="on"http://打開壓縮功能
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"http://代表連接超時時間,單位為毫秒,默認(rèn)值為60000。通常情況下設(shè)置為30000
URIEncoding="utf-8"http://URL統(tǒng)一編碼
acceptCount="1000"http://監(jiān)聽端口隊(duì)列最大數(shù),滿了之后客戶請求會被拒絕(不能小于maxSpareThreads),如果未指定,默認(rèn)值為100
redirectPort="8443"http://在需要基于安全通道的場合,把客戶請求轉(zhuǎn)發(fā)到基于SSL的redirectPort端口
disableUploadTimeout="true"/>//這個標(biāo)志允許servlet[Container](http://lib.csdn.net/base/4)在一個servlet執(zhí)行的時候,使用一個不同的,更長的連接超時。最終的結(jié)果是給servlet更長的時間以便完成其執(zhí)行,或者在數(shù)據(jù)上載的時候更長的超時時間。如果沒有指定,設(shè)為false
2.3.9 Web應(yīng)用管理
用管理員賬號進(jìn)入web應(yīng)用管理界面:
如圖所示,我們可以看到Applications模塊,在這個里面可以對tomcat中部署的應(yīng)用的啟動狀態(tài)做修改,把不需要的應(yīng)用可以暫時關(guān)閉,同時也可以對session緩存時間進(jìn)行配置
3、JVM 優(yōu)化
修改/bin/catalina.bat 文件,如:
如果服務(wù)器只運(yùn)行一個 Tomcat
機(jī)子內(nèi)存如果是 8G,一般 PermSize 配置是主要保證系統(tǒng)能穩(wěn)定起來就行(如果是Linux系統(tǒng),等號后的值要用引號引起來)
set JAVA_OPTS=-Dfile.encoding=UTF-8 -server -Xms6144m -Xmx6144m -XX:NewSize=1024m -XX:MaxNewSize=2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC
機(jī)子內(nèi)存如果是 16G,一般 PermSize 配置是主要保證系統(tǒng)能穩(wěn)定起來就行:
set JAVA_OPTS=-Dfile.encoding=UTF-8 -server -Xms13312m -Xmx13312m -XX:NewSize=3072m -XX:MaxNewSize=4096m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC
機(jī)子內(nèi)存如果是 32G,一般 PermSize 配置是主要保證系統(tǒng)能穩(wěn)定起來就行:
set JAVA_OPTS=-Dfile.encoding=UTF-8 -server -Xms29696m -Xmx29696m -XX:NewSize=6144m -XX:MaxNewSize=9216m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC
如果是開發(fā)機(jī)
set JAVA_OPTS=-Xms550m -Xmx1250m -XX:PermSize=550m -XX:MaxPermSize=1250m
參數(shù)說明:
-Dfile.encoding:默認(rèn)文件編碼
-server:表示這是應(yīng)用于服務(wù)器的配置,JVM 內(nèi)部會有特殊處理的
-Xmx1024m:設(shè)置JVM最大可用內(nèi)存為1024MB
-Xms1024m:設(shè)置JVM最小內(nèi)存為1024m。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
-XX:NewSize:設(shè)置年輕代大小
-XX:MaxNewSize:設(shè)置最大的年輕代大小
-XX:PermSize:設(shè)置永久代大小
-XX:MaxPermSize:設(shè)置最大永久代大小
-XX:NewRatio=4:設(shè)置年輕代(包括 Eden 和兩個 Survivor 區(qū))與終身代的比值(除去永久代)。設(shè)置為 4,則年輕代與終身代所占比值為 1:4,年輕代占整個堆棧的 1/5
-XX:MaxTenuringThreshold=10:設(shè)置垃圾最大年齡,默認(rèn)為:15。如果設(shè)置為 0 的話,則年輕代對象不經(jīng)過 Survivor 區(qū),直接進(jìn)入年老代。對于年老代比較多的應(yīng)用,可以提高效率。如果將此值設(shè)置為一個較大值,則年輕代對象會在 Survivor 區(qū)進(jìn)行多次復(fù)制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
-XX:+DisableExplicitGC:這個將會忽略手動調(diào)用 GC 的代碼使得 System.gc() 的調(diào)用就會變成一個空調(diào)用,完全不會觸發(fā)任何 GC
4、高級調(diào)優(yōu)
以上內(nèi)容足以應(yīng)付絕大多數(shù)情景,熟悉以上內(nèi)容,你也就步入了服務(wù)器優(yōu)化的大門了,且水平會遠(yuǎn)強(qiáng)于其他菜鳥,但要進(jìn)一步提升,則需繼續(xù)學(xué)習(xí)以下內(nèi)容
4.1、Tomcat配合Nginx做負(fù)載均衡
4.2、Tomcat配合Nginx做動靜分離
4.3、Tomcat配合Nginx和Redis做tomcat集群和session共享
4.4、Jmeter做壓力測試
如需交流學(xué)習(xí),請留言看我私文:
如有問題或有想相互學(xué)習(xí)交流的,可以聯(lián)系本人(郵箱:18986837482@163.com,微信:18986837482,QQ:785553790)
文檔參考:http://www.lxweimin.com/p/c8613d17e5fe