面試刷題32:你對tomcat做了哪些性能調優?

image.png

背景

java程式設計師的開發的java應用程式,一般都會選擇使用tomcat發布,但是:
如何充分的掌控tomcat,並讓它發揮最優性能呢?

這也是面試的熱點問題,結合多年的工作實踐,我是李福春,今天總結一下。

tomcat的使用

下載

現在最新的穩定版本是tomcat9, 下載頁面:https://tomcat.apache.org/download-90.cgi

5種下載包的區別

file

一般我們選擇的是 core包運行tomcat,或者直接選擇docker的鏡像來運行;

tomcat的目錄說明:

file

安裝

直接解壓即可,解壓指令:tar -zxvf tomcat-xxx.tar.gz

啟動和停止

按照running.txt中的說明指導, 兩種方式啟動:

1, sh ${catalina.home}/bin/startup.sh 
2,  sh ${catalina.home}/bin/catalina.sh start

對應的兩種方式停止tomcat:

1, sh ${catalina.home}/bin/shutdown.sh
2,  sh ${catalina.home}/bin/catalina.sh stop 

日誌

tomcat產生的日誌分成4類

1, catalina.date.out 最近的所有級別的日誌;
2,localhost-date.log 錯誤日誌

實時查看日誌指令: tail -f catalina.out

AJP協議

一般用在tomcat跟其它HTTP伺服器建立連接。

比如Apache+Tomcat做動靜態分離:

apache處理所有的靜態資源;

apache通過JK(負載均衡組件)轉發動態資源請求到Tomcat,通過AJP協議。

tomcat的監控

保留默認tomcat下的webapps的 ROOT, host-manager , manager 應用,就可以監控單個tomcat節點的狀態。

默認是不可以訪問的,需要增加用戶和許可權才能看到,否則會報403;

增加方法: conf/tomcat-user.xml

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

監控頁面如下圖:

image.png
server status: 可以看到tomcat和jvm的版本資訊,jvm的分區資訊,tomcat內部執行緒池狀態;
image.png

manager-app: 管理tomcat下運行的應用,提供控制按鈕,啟動,停止,重啟,卸載,以及不停服安裝新的應用;
image.png

host-manger:提供了虛擬主機的管理,即配置別名和二級路徑到tomcat的應用。
image.png

tomcat的IO調優

tomcat9中默認使用的nio處理java的io.
可以從日誌中和配置文件中看到。

09-Apr-2020 07:46:27.606 資訊 [main] org.apache.coyote.AbstractProtocol.start  開始協議處理句柄["http-nio-8080"]  

APR優化IO

使用apr(Apache Portable Runtime),從作業系統層面解決了非同步io的問題,可以大幅度提高性能。
如果linux安裝了apr和tomcat-native,則tomcat啟動就支援了apr;

NIO優化老版本的BIO

老版本的tomcat如果採用了BIO(通過日誌可以看出),可以調整為NIO,調整方法:
conf/server.xml

老的配置:

<connector protocol="HTTP/1.1" />  

新的配置:

//tomcat6選擇nio1  <connector protocol="org.apache.coyote.http11.Http11NioProtocol" />  //tomcat8選擇nio2,apr性能更好  <connector protocol="org.apache.coyote.http11.Http11Nio2Protocol" />    <connector protocol="org.apache.coyote.http11.Http11AprProtocol" />  

tomcat的執行緒池調優

tomcat默認不啟用執行緒池,可以啟用執行緒池提高執行緒的利用率

執行緒池參數:

file

定義執行緒池

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"          maxThreads="150" minSpareThreads="4"/>  

配置Connector啟用

<connector executor="tomcatThreadPool">  

connector參數

file

tomcat的jvm參數調優

GC優化

#gc優化  JAVA_GC="-XX:SurvivorRatio=10  -XX:MaxTenuringThreshold=15  -XX:NewRatio=2  -XX:+DisableExplicitGC  -Djava.security.egd=file:/dev/./urandom"    

file

jvm和執行緒池優化

JVM_LEVEL="info"  JVM_Xms="100m"  JVM_Xmx="2048m"  JVM_Xmn="600m"  JVM_Xss="256k"  TOMCAT_acceptCount=4096 執行緒可以接受的請求數量  TOMCAT_maxThreads=512 最大執行緒數  TOMCAT_minSpareThreads=512 初始執行緒數  

file

小結

本篇回顧了tomcat的基礎知識。

以及使用tomcat內置的監控程式對java應用進行監控的一些基礎知識點。

然後結合工作經驗,從io,執行緒池,jvm三個方面對tomcat進行調優

原創不易,點贊關注支援一下吧!轉載請註明出處,讓我們互通有無,共同進步,歡迎溝通交流。
我會持續分享Java軟體編程知識和程式設計師發展職業之路,歡迎關注,我整理了這些年編程學習的各種資源,關注公眾號『李福春持續輸出』,發送’學習資料’分享給你!