1. 程式人生 > >Tomcat-8.5.39性能監控及調優

Tomcat-8.5.39性能監控及調優

led 機器 功能 返回 新的 異步處理 conn 大量 進行

一、下載地址

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

<role rolename="admin"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="admin" roles="admin,admin-gui,admin-script,manager-gui,manager-script,manager-jmx,manager-status"/>

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

<Context privileged="true" antiResourceLocking="false"
         docBase="${catalina.home}/webapps/manager">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>

再次重啟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配置來啟動:

 <Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"
        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標簽內容替換成如下內容
<Executor name="tomcatThreadPool" --線程池名
     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標簽內容替換成如下內容
<Connector executor="tomcatThreadPool"
     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;

Tomcat-8.5.39性能監控及調優