一篇關於Tomcat性能監控及調優教程超詳細的文章

java架構進階師 發佈 2020-06-13T18:16:49+00:00

右側的 Server Status Manager APP 和 Host Manager代表tomcat的管理頁面,想要進入這三個頁面首先需要配置伺服器上tomcat安裝目錄下的conf/tomcat-users.xml文件,如果不做配置則會返回403頁面,如下:

一、下載地址

https://tomcat.apache.org/download-80.cgi

二、安裝步驟

將安裝包 apache-tomcat-8.5.39.tar.gz 上傳至伺服器 /usr/local 目錄下,再執行如下步驟:

[root@admin local]# cd /usr/local
[root@admin local]# tar -zxvf apache-tomcat-8.5.39.tar.gz // 解壓壓縮包
[root@admin local]# mv apache-tomcat-8.5.39 tomcat-8.5.39 // 重命名tomcat目錄

啟動tomcat(JDK已經安裝好並配置了環境變量):

[root@admin local]# cd ./tomcat-8.5.39/bin
[root@admin bin]# ./startup.sh // 啟動tomcat

啟動成功,如下圖:

三、監控

通過以下網址打開tomcat管理頁面,默認埠為8080(如果不能打開則關閉伺服器防火牆或者開放8080埠)

右側的 Server Status Manager APP 和 Host Manager代表tomcat的管理頁面,想要進入這三個頁面首先需要配置伺服器上tomcat安裝目錄下的conf/tomcat-users.xml文件,如果不做配置則會返回403頁面,如下:

在conf/tomcat-users.xml添加如下配置,再重啟tomcat

Tomcat8如果在上面配置的基礎上,訪問時會報403錯誤,所以需要修改conf/Catalina/localhost/manager.xml 文件(如果沒有的話新建)。配置內容如下:

docBase="${catalina.home}/webapps/manager">

再次重啟tomcat後,就能進入Server Status Manager APP 和 Host Manager這三個頁面了。

Server Status

Status-JVM

Free memory:剩餘內存;

Total menory:總內存;

Max menory:最大內存;

Status-HTTP

Max threads:最大線程數;

Current thread count:當前線程數;

Current thread busy:當前忙碌線程數;

Max processing time:最大處理時間;

ms Processing time:最短處理時間;

Request count:請求數;

Error count:錯誤數;

Bytes received:接受字節;

Bytes sent:發送字節;

Manager APP

該頁面用來管理Web項目,部署在Tomcat下的項目可以通過該頁面來管理,如下:

Host Manager

該頁面用於管理主機

四、調優

1、Tomcat的運行模式有三種:

BIO

性能比較低下,沒有經過任何優化處理和支持。一個線程處理一個請求。缺點:並發量高時,線程數較多,浪費資源。Tomcat7或以下,在Linux系統中默認使用這種方式。

NIO

nio(new I/O),是Java SE 1.4及後續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個基於緩衝區、並能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的並發運行性能。

利用Java的異步IO處理,可以通過少量的線程處理大量的請求。

Tomcat8在Linux系統中默認使用這種方式。

Tomcat7必須修改Connector配置來啟動:

connectionTimeout="20000"redirectPort="8443"/>

APR

安裝起來最困難,但是從作業系統級別來解決異步的IO問題,能夠大幅度的提高性能。即Apache PortableRuntime,從作業系統層面解決IO阻塞問題。

Tomcat7或Tomcat8在Win7或以上的系統中啟動默認使用這種方式。

Linux如果安裝了apr和native,Tomcat直接啟動就支持apr。

具體安裝辦法 參見這個地址:https://my.oschina.net/lsw90/blog/181161

Tomcat啟動的時候,可以通過log看到Connector使用的是哪一種運行模式:

StartingProtocolHandler["http-bio-8080"]
StartingProtocolHandler ["http-nio-8080"]
StartingProtocolHandler ["http-apr-8080"]

Tomcat7及以下版本啟動啟動NIO模式:

修改server.xml里的Connector節點,修改protocol為:org.apache.coyote.http11.Http11NioProtocol,如下:

修改前:

修改後:

為什麼它不直接改成NIO的形式呢?

這個方式是利用了jdk 1.4及後續版本提供的一種新的I/O操作方式(即java.nio包及其子包)為橋樑實現的,不改成這種優化方式就是為了兼容1.4之前的JAVA項目也能跑起來。

2、線程池(執行器)

Connector節點:

官方文檔:https://tomcat.apache.org/tomcat-8.5-doc/config/http.html

默認的tomcat沒有啟用線程池,在tomcat中每一個用戶請求都是一個線程,所以可以使用線程池提高性能。這裡前台其實有一個調度線程,然後調度線程會放入線程池內,然後到到一定的時候線程池的任務變成工作線程。

開啟線程池:

maxThreads配置為500,但顯示為-1,查詢官方文檔發現:

意思是該屬性配置處理並發請求的最大線程數,如果不配置默認值是200。如果配置了executor屬性,這個屬性會被忽略。注意斜體部分提到:如果executor設置了值,使用JMX查看的時候這個值會是-1,這是正常的。

詳細參數解釋如下:

將原有的Executor標籤內容替換成如下內容

namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="30"
maxIdleTime="60000"
prestartminSpareThreads="true"
maxQueueSize="100"/>

maxThreads:最大並發數,默認設置 200,一般建議在 500 ~ 800,根據硬體設施和業務來判斷

minSpareThreads:Tomcat 初始化時創建的線程數,默認設置 25

maxIdleTime:如果當前線程大於初始化線程,那空閒線程存活的時間,單位毫秒,默認60000=60秒=1分鐘。

prestartminSpareThreads:在 Tomcat 初始化的時候就初始化 minSpareThreads 的參數值,如果不等於 true,minSpareThreads 的值就沒啥效果了

maxQueueSize:最大的等待隊列數,超過則拒絕請求

將原有的Connector標籤內容替換成如下內容

port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="60000"
maxConnections="10000"
redirectPort="8443"
enableLookups="false"
acceptCount="100"
maxPostSize="10485760"
maxHttpHeaderSize="8192"
compression="on"
disableUploadTimeout="true"
compressionMinSize="2048"
acceptorThreadCount="2"
compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4"
URIEncoding="utf-8"
processorCache="20000"
tcpNoDelay="true"
connectionLinger="5"
server="Server Version 11.0"/>

替換後訪問速度肯定會比以前快

protocol:Tomcat 8 設置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol

protocol:Tomcat 6 設置 nio 更好:org.apache.coyote.http11.Http11NioProtocol

protocol:Tomcat 8 設置 APR 性能飛快:org.apache.coyote.http11.Http11AprProtocol

connectionTimeout:Connector接受一個連接後等待的時間(milliseconds),默認值是60000。

maxConnections:這個值表示最多可以有多少個socket連接到tomcat上

enableLookups:禁用DNS查詢

acceptCount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值為100。

maxPostSize:設置由容器解析的URL參數的最大長度,-1(小於0)為禁用這個屬性,默認為2097152(2M) 請注意, FailedRequestFilter 過濾器可以用來拒絕達到了極限值的請求。

maxHttpHeaderSize:http請求頭信息的最大程度,超過此長度的部分不予處理。一般8K。

compression:是否啟用GZIP壓縮 on為啟用(文本數據壓縮) off為不啟用, force 壓縮所有數據

disableUploadTimeout:這個標誌允許servlet容器使用一個不同的,通常長在數據上傳連接超時。 如果不指定,這個屬性被設置為true,表示禁用該時間超時。

compressionMinSize:當超過最小數據大小才進行壓縮

acceptorThreadCount:用於接受連接的線程數量。增加這個值在多CPU的機器上,儘管你永遠不會真正需要超過2。 也有很多非維持連接,您可能希望增加這個值。默認值是1。

compressableMimeType:配置想壓縮的數據類型

URIEncoding:網站一般採用UTF-8作為默認編碼。

processorCache:協議處理器緩存的處理器對象來提高性能。 該設置決定多少這些對象的緩存。-1意味著無限的,默認是200。 如果不使用Servlet 3.0異步處理,默認是使用一樣的maxThreads設置。 如果使用Servlet 3.0異步處理,默認是使用大maxThreads和預期的並發請求的最大數量(同步和異步)。

tcpNoDelay:如果設置為true,TCP_NO_DELAY選項將被設置在伺服器套接字,而在大多數情況下提高性能。這是默認設置為true。

connectionLinger:秒數在這個連接器將持續使用的套接字時關閉。默認值是 -1,禁用socket 延遲時間。

server:隱藏Tomcat版本信息,首先隱藏HTTP頭中的版本信息

Executor節點:

官方文檔:https://tomcat.apache.org/tomcat-8.5-doc/config/executor.html

五、AJP協議

Tomcat最主要的功能是提供Servlet/JSP容器,儘管它也可以作為獨立的Java Web伺服器,但它對靜態資源(如HTML文件或圖像文件)的處理速度,以及提供的Web伺服器管理功能方面都不如其他專業的HTTP伺服器,如IIS和Apache伺服器。因此在實際應用中,常常把Tomcat與其他HTTP伺服器集成。對於不支持Servlet/JSP的HTTP伺服器,可以通過Tomcat伺服器來運行Servlet/JSP組件。

Tomcat伺服器通過Connector連接器組件與客戶程序建立連接,Connector組件負責接收客戶的請求,以及把Tomcat伺服器的響應結果發送給客戶。默認情況下,Tomcat在server.xml中配置了兩種連接器:

第一個連接器監聽8080埠,負責建立HTTP連接。在通過瀏覽器訪問Tomcat伺服器的Web應用時,使用的就是這個連接器。

第二個連接器監聽8009埠,負責和其他的HTTP伺服器建立連接。在把Tomcat與其他HTTP伺服器集成時,就需要用到這個連接器。

在實際應用中,如果網站的訪問量非常大,為了提高訪問速度,可以將多個Tomcat伺服器與Apache集成,讓它們共同分擔運行Servlet/JSP組件的任務。JK插件的loadbalancer(負載平衡器)負責根據在workers.properties文件中預先配置的lbfactor(負載平衡因數)為這些Tomcat伺服器分配工作負荷,實現負載平衡。那麼,Apache和Tomcat結合的時候,會有如下現象:

Apache會攔截所有請求,將servlet和JSP(.jsp結尾)請求通過AJP交給Tomcat處理,然後再把結果拿到Apache然後返回;

Apache將靜態資源的訪問,(類似html/css/jpg等類型的文件)自己直接處理不交給Tomcat,直接返回;

Apache和Tomcat結合之後,Tomcat的HTTP Connector永遠不會被用到了,而是用AJP Connector;


原文連結:https://www.tuicool.com/articles/reU7N3m

關鍵字: