最受歡迎的Java web應用伺服器之一——Tomcat監控選型及實踐
監控選型
Tomcat Manager和Psi-probe是不錯的視覺化監控工具,能夠很好地檢視Tomcat狀態資訊(比如單位時間請求數,執行緒狀態等)。在生產環境中,隨著Tomcat例項的不斷增加,維護不同例項上的Manager控制檯會顯得有些繁瑣,同時,為了與企業監控系統、運維儀表盤等結合,有必要選擇相容性和適配性更好的監控工具。
如今,企業微服務的流行和CI/CD的強需求性,要求我們的服務在易於開發和維護的同時,具有伸縮性強、快速交付等特點。在此環境下,Tomcat+Prometheus+Grafana能夠很好的與企業已有架構適配,並能夠很好的與其他中介軟體服務監控整合到一起。Prometheus作為新一代的雲原生監控系統,鼓勵使用者監控服務的內部狀態,讓使用者可以獲取服務和應用內部真正的執行狀態。
容器環境下Tomcat+Prometheus+Grafana簡圖如下:
在實際部署中,可以簡單分為如下幾個步驟:
1、下載jmx_prometheus_javaagent (https://github.com/prometheus/jmx_exporter),若為容器環境,可將jmx_prometheus_javaagent與Tomcat一起打進執行映象。
2、Tomcat啟動時,JAVA_OPTS增加Javaagent和Tomcat config.yaml (https://github.com/prometheus/jmx_exporter/blob/master/example_configs/Tomcat.yml )配置,例如:JAVA_OPTS=”-javaagent:/var/tomcat/jmx_prometheus_javaagent-0.3.1.jar=port:/vat/tomcat/conf/config.xml”(port為實際埠)。
3、Prometheus新增Tomcat的job_name。
監控指標梳理
在《SRE: Google運維解密》一書中指出,監控系統需要能夠有效的支援白盒監控和黑盒監控。通過白盒監控能夠了解其內部的實際執行狀態,通過對監控指標的觀察能夠預判可能出現的問題,從而對潛在的不確定因素進行優化。而黑盒監控,常見的如HTTP探針,TCP探針等,可以在系統或者服務在發生故障時能夠快速通知相關的人員進行處理。
監控的四個黃金指標可以在服務級別幫助我們更好地衡量終端使用者體驗、服務中斷、業務影響等層面的問題。主要關注以下四種類型的指標:錯誤,延遲,流量以及飽和度。
通過對黑盒、白盒監控的理解,結合監控的四個黃金指標,針對Tomcat的重要監控指標,可以從以下幾個方面進行考慮:
監控分類 |
重要監控指標 |
指標說明 |
錯誤 |
Tomcat requestcount and errorcount |
Tomcat例項總請求數和錯誤請求數 |
延遲 |
Tomcat response time |
Tomcat例項的Response time |
流量 |
Tomcat bytessent and bytesreceived |
Tomcat例項傳送和接受的流量 |
飽和度 |
heap memory |
堆記憶體的使用情況 |
jvm gc |
GC次數和耗時 |
|
jvm_threads |
執行緒數 |
監控實踐
錯誤
錯誤監控關注的是當前應用或系統發生的錯誤請求。針對Tomcat錯誤監控,主要監控指標為Tomcat錯誤請求數及與請求總數之間的比例,這些多為顯式的錯誤。關於隱式的錯誤(比如狀態碼響應200,實際業務流程卻是失敗的),通常需要根據業務場景的不同,在服務中新增鉤子及業務邏輯監控來實現。
圖1:某Tomcat例項在1000+qps下請求數和錯誤數的比例
當然,我們也可以藉助ELK等工具,對Tomcat上游代理或LB進行整體的錯誤狀態碼統計,方便我們更好的定位錯誤,以及在發生5xx錯誤時考慮如何“快速失敗”,來減少錯誤對系統性能帶來的影響。
圖2:通過Tomcat上游代理採集的狀態碼統計
延遲
延遲監控關注的是服務請求所需時間。針對Tomcat延遲監控,主要監控指標為Tomcat例項的Response time。同時,我們也可以採用黑盒監控中的HTTP語義探測來採集Tomcat對應域名的全鏈路延遲,傳送指定GET、POST、HEAD等請求,來匹配狀態碼及伺服器的返回內容。
圖3:某產品線下多個Tomcat例項整體的response time彙總
圖4:通過Tomcat上游代理採集的平均請求時間和Tomcat平均響應時間
流量
流量監控關注的是當前系統或應用的流量,以便更好地衡量服務的承載能力。針對Tomcat流量監控,我們需要關注Tomcat例項傳送和接收的流量。
圖5:某Tomcat例項傳送和接收的流量
飽和度
飽和度監控關注的是系統或應用對資源的利用率,強調最能影響服務狀態的受限制的資源。
不同的系統或應用對飽和度監控的需求各不相同,但共性是在服務效能明顯下降時,起決定性的狀態指標。針對Tomcat飽和度監控,可以從堆記憶體、執行緒數、GC次數及耗時等方面出發,在告警發生前後,通過檢視各個指標的變化曲線,快速定位問題原因。
Tomcat執行緒池
對於Tomcat執行緒池初始配置的採集,可以根據不同業務場景,不同例項的壓力,來進行調整,比如maxThreads、acceptCount等。
圖6:某Tomcat例項執行緒池相關的預設配置
JVM監控
對於Tomcat JVM的監控,通常我們需要關注堆記憶體的使用情況、GC的次數和耗時、以及對JVM執行緒數的監控。
-
JVM堆記憶體監控
Java Heap是JVM所管理的記憶體中最大的一塊,被所有執行緒所共享,用來存放物件例項。因此,堆記憶體的使用情況至關重要。
圖7:某Tomcat例項堆記憶體的使用情況
-
GC次數和耗時
通過檢視單位時間內GC次數和耗時,能夠讓我們針對不同的業務場景,選擇不同的垃圾回收器,從而進一步提高效能。
圖8:某Tomcat例項預設垃圾回收器總GC次數曲線
圖9:某Tomcat例項預設垃圾回收器總GC時間曲線
-
JVM執行緒數監控
JVM執行緒數的曲線統計,能夠讓我們更直觀的看到JVM執行緒當前的執行情況。
圖10:某Tomcat例項JVM執行緒相關的統計
寫在最後
通過對Tomcat重要監控指標的採集以及監控,幫助我們更方便地完成日常巡檢,提高先於故障發現問題的能力,提高故障發生時的定位效率,從而更好地提高穩定性。
附:
jmx_prometheus_javaagent:
https://github.com/prometheus/jmx_exporter
Tomcat jmx_exporter:
https://github.com/prometheus/jmx_exporter/blob/master/example_configs/Tomcat.yml