Tomcat可以從內存、并發、緩存等方面進行優化
1、Tomcat內存優化:
在tomcat的啟動腳本catalina.sh中設置java_OPTS參數
JAVA_OPTS=’-Xms2048m-Xmx2048m -XX:PermSize=512M -XX:MaxPermSize=1024m’
參數說明:
-server啟用jdk的server版;
-XmsJava虛擬機初始化時的最小內存;
-Xmx ???????????????????????????????????????????????????? Java虛擬機可使用的最大內存;
-XX:PermSize內存永久保留區域
-XX:MaxPermSize內存最大永久保留區域
驗證:
設置成功后我們可以利用JDK自帶的工具進行驗證,這些工具都在JAVA_HOME/bin目錄下:
1)jps:用來顯示本地的java進程,以及進程號,進程啟動的路徑等。
2)jmap:觀察運行中的JVM物理內存的占用情況,包括Heapsize , Perm size下載地址等。
進入JAVA_HOME/bin目錄下或者使用軟鏈接等方式,然后輸入jps和jmap命令。
2、Tomcat并發優化:
Connector優化
Connector是連接器,負責接收客戶的請求,以及向客戶端回送響應的消息。所以Connector的優化是重要部分。默認情況下Tomcat只支持200線程訪問,超過這個數量的連接將被等待甚至超時放棄,所以我們需要提高這方面的處理能力。
Tomcat官網Connector參數屬性:https://tomcat.apache.org/tomcat-8.0-doc/config/http.html,參數非常多,我們這里只介紹一些常用的
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
connectionTimeout="20000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>
參數說明:
port代表Tomcat監聽端口,也就是網站的訪問端口,默認為8080,可以根據需要改成其他
protocol代表協議類型,可選類型有四種,分別為BIO(阻塞型IO),NIO,NIO2和APR
maxHttpHeaderSize請求和響應的HTTP頭的最大大小,以字節為單位指定。如果沒有指定,這個屬性被設置為8192(8 KB)。
maxThreads客戶請求最大線程數,也就是可以處理的同時請求的最大數目,如果未指定,默認為200
minSpareThreads ?????????????????? ????????????? Tomcat初始化時創建的socket線程數,線程的最小運行數目,這些始終保持運行,如果未指定,默認值為10
maxSpareThreads ??????????????????????????????? Tomcat連接器的最大空閑socket線程數
connectionTimeout代表連接超時時間,單位為毫秒,默認值為60000。通常情況下設置為30000
minProcessors服務器創建時的最小處理線程數
maxProcessors服務器同時最大處理線程數
enableLookups關閉DNS反向查詢,若設為true,則支持域名解析,可把ip地址解析為主機名
URIEncoding ??????????????????????????????????????? URL統一編碼
acceptCount監聽端口隊列最大數,滿了之后客戶請求會被拒絕(不能小于maxSpareThreads),如果未指定,默認值為100
redirectPort在需要基于安全通道的場合,把客戶請求轉發到基于SSL的redirectPort端口
disableUploadTimeout這個標志允許servletContainer在一個servlet執行的時候,使用一個不同的,更長的連接超時。最終的結果是給servlet更長的時間以便完成其執行,或者在數據上載的時候更長的超時時間。如果沒有指定,設為false。
參數詳解:
1)protocol
a)BIO:BIO(BlockingI/O),顧名思義,即阻塞式I/O操作,表示Tomcat使用的是傳統的JavaI/O操作(即java.io包及其子包)。Tomcat在默認情況下,是以bio模式運行的。遺憾的是,就一般而言,bio模式是三種運行模式中性能最低的一種。BIO配置采用默認即可。
b)NIO:NIO(NewI/O),是Java SE1.4及后續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Javanio是一個基于緩沖區、并能提供非阻塞I/O操作的JavaAPI,因此nio也被看成是non-blockingI/O的縮寫。它擁有比傳統I/O操作(bio)更好的并發運行性能。要讓Tomcat以nio模式來運行也比較簡單,我們只需要protocol類型修改為:
//NIO
protocol="org.apache.coyote.http11.Http11NioProtocol"
//NIO2
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
c)APR:APR(ApachePortable Runtime/Apache可移植運行時),是ApacheHTTP服務器的支持庫。你可以簡單地理解為:Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態鏈接庫來處理文件讀取或網絡傳輸操作,從而大大地提高Tomcat對靜態文件的處理性能。與配置NIO運行模式一樣,也需要將對應的Connector節點的protocol屬性值改為:
protocol="org.apache.coyote.http11.Http11AprProtocol"
2)maxThreads:由該連接器創建的處理請求線程的最大數目,也就是可以處理的同時請求的最大數目。如果未配置默認值為200。如果一個執行器與此連接器關聯,則忽略此屬性,因為該屬性將被忽略,所以該連接器將使用執行器而不是一個內部線程池來執行任務。maxThreads是一個重要的配置屬性,maxThreads配置的合理直接影響了Tomcat的相關性能,所以這里我們重點討論下。
maxThreads并不是配置的越大越好,事實上你即使配置成999999也是沒有用的,因為這個最大值是受操作系統及相關硬件所制約的,并且最大值并不一定是最優值,所以我們追尋的應該是最優值而不是最大值。
QPS(Query Per Second):每秒查詢率QPS是對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準。我們常常使用QPS值來衡量一個服務器的性能。
QPS =并發數/平均響應時間
或者
并發數= QPS *平均響應時間
一個系統吞吐量通常由QPS、并發數兩個因素決定,每套系統的這兩個值都有一個相對極限值,在應用場景訪問壓力下,只要某一項達到系統最高值,系統的吞吐量就上不去了,如果壓力繼續增大,系統的吞吐量反而會下降,原因是系統超負荷工作,上下文切換、內存等等其它消耗導致系統性能下降。所謂吞吐量這里可以理解為每秒能處理請求的次數。
所以選擇一個合理的maxThreads值,其實并不是那么容易的事。因為過多的線程只會造成,更多的內存開銷,更多的CPU開銷,但是對提升QPS確毫無幫助;找到最佳線程數后通過簡單的設置,可以讓web系統更加穩定,得到最高,最穩定的QPS輸出。
我們可以通過以下幾種方式來獲取maxThreads的最佳值:
(1)通過線上系統不斷使用和用戶的不斷增長來進行性能測試,觀察QPS,響應時間,這種方式會在爆發式增長時系統崩潰,如雙12等。
(2)根據公式計算,服務器端最佳線程數量=((線程等待時間+線程cpu時間)/線程cpu時間) *cpu數量,這種方式有時會被誤導,因為某些系統處理環節可能會耗時比較長,從而影響公式的結果。
(3)單、多用戶壓力測試,查看CPU的消耗,然后直接乘以百分比,再進行壓測,一般這個值的附近應該就是最佳線程數量,這種方式理想場景比較適用,實際情況會比這個復雜的多。
(4)根據系統的自身情況調整,如硬件限制,系統限制,程序處理能力限制等。
(5)定期修改為不同的maxThreads值,看服務器響應結果及用戶反應。
QPS和線程數的關系
(1)在最佳線程數量之前,QPS和線程是互相遞增的關系,線程數量到了最佳線程之后,QPS持平,不在上升,甚至略有下降,同時相應時間持續上升。
(2)同一個系統而言,支持的線程數越多(最佳線程數越多而不是配置的線程數越多),QPS越高。
QPS和響應時間的關系
(1)對于一般的web系統,響應時間一般有CPU執行時間+IO等待時間組成。
(2)CPU的執行時間減少,對QPS有實質的提升,IO時間的減少,對QPS提升不明顯。如果要想明顯提升QPS,優化系統的時候要著重優化CPU消耗大戶。
所以想要找出maxThreads的最優值可并不容易,沒有最好只有更好,更好的值只能通過時間來顯現,如果你不想考慮那么多,一般情況下設置成1000即可。
3)acceptCount:當所有可能的請求處理線程都在使用時傳入連接請求的最大隊列長度。如果未指定,默認值為100。一般是設置的跟maxThreads一樣或一半,此值設置的過大會導致排隊的請求超時而未被處理。所以這個值應該是主要根據應用的訪問峰值與平均值來權衡配置。
4)maxConnections:在任何給定的時間內,服務器將接受和處理的最大連接數。當這個數字已經達到時,服務器將接受但不處理,等待進一步連接。NIO與NIO2的默認值為10000,APR默認值為8192。
3、Tomcat緩存優化:
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
參數說明:
compression打開壓縮功能
compressionMinSize啟用壓縮的輸出內容大小,這里面默認為2KB
compressableMimeType壓縮類型
connectionTimeout定義建立客戶連接超時的時間.如果為-1,表示不限制建立客戶連接的時間
整合的配置:
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>