Tomcat-8.5.39性能監控及調優

1、下載地址javascript

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

2、安裝步驟html

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

[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已經安裝好並配置了環境變量):web

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

啓動成功,以下圖:apache

3、監控json

經過如下網址打開tomcat管理頁面,默認端口爲8080(若是不能打開則關閉服務器防火牆或者開放8080端口)瀏覽器

右側的 Server Status  Manager APP 和 Host Manager表明tomcat的管理頁面,想要進入這三個頁面首先須要配置服務器上tomcat安裝目錄下的conf/tomcat-users.xml文件,若是不作配置則會返回403頁面,以下:緩存

在conf/tomcat-users.xml添加以下配置,再重啓tomcattomcat

<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

該頁面用於管理主機 

4、調優

一、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項目也能跑起來。

二、線程池(執行器)

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

5、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;
相關文章
相關標籤/搜索