問題範圍:平臺典型後端問題,如宕機、服務響應慢、節點丟失、CPU高、內存高、數據庫響應慢等。分析這類問題雖然沒有固定套路,但是有大概方向。
工具範圍:平臺自帶服務質量監控、堆分析工具、線程分析工具、arthas、visualvm、zabbix監控等。分析內存問題(OOM、GC)首先要建立JVM內存知識結構。
以下以JDK8和CMS GC爲標準
問題
宕機
分析jvm crash文件
OOM
平臺常遇到的2類OOM,可能引起宕機,也可能不會。
集羣節點不可用/集羣節點丟失
此類未造成OOM但服務不可用問題相對宕機來講,更難定位,因爲宕機後有明顯線索。
-
線索來源
-
後臺切換節點切換不過去
-
集羣節點反覆丟失/加入
-
頁面提示xx節點不可用
-
或者提示:同步出錯,請重試
-
原因
-
絕大部分原因是由於GC停頓時間過長導致,解決方式見「問題-服務響應慢-GC時間過長」章節
-
極少情況是網絡抖動導致
-
確定問題
-
在系統響應慢時,執行命令導出heap dump,分析內存中有哪些對象導致GC慢
-
分析heap dump見「工具-MAT」章節
服務響應慢
觀察SLA >3秒的線程,如果:
-
單個請求慢,查看堆棧確定問題原因
-
等待數據庫返回
-
優化SQL,添加索引等
-
如果是流程表/任務表數據量很大(千萬以上)可以考慮分庫分表(SAD應用)
-
其他如等待網絡返回,需要具體情況具體分析
-
整個平臺響應慢
-
優先考慮大量對象進入內存導致或其他代碼漏洞導致GC時間過長
-
實時查看GC時間是否過長,見「工具-jstat」章節
-
統計查看GC時間是否過長
-
開啓jvm的GC參數,會在相應目錄下產生gc文件
-
用工具分析GC時間,見「工具-gc日誌分析」章節
CPU使用率高
需要安裝監控工具監控CPU使用情況,持續>80%時,就要分析是正常業務還是代碼Bug。
無法創建線程
報錯java.lang.OutOfMemoryError: unable to create new native thread
工具
Memory Analyzer (MAT)
-
關注點1(重點):Leak Suspects部分
-
大多數時候,是由於查詢大量數據庫數據進入內存導致,可能是平臺Bug,也可能是二開代碼。此部分如何在日常運維中預防,見「運維監控-數據庫」章節
-
關注點2:對象直方圖,按照Retained Heap(該類對象hold住的內存大小)排序,可以分析對象是合理的cache還是bug產生的大量對象
-
關注點3:線程情況,按照Retained Heap(該線程hold住的內存大小)排序,關注前幾個hold住大對象的線程
-
MAT能展示的信息非常多,可以以各種角度分析對象情況,甚至可以用OQL語句(類似SQL)過濾查詢每個對象的數量
該網站主要用來分析線程情況,會以各種視角展示線程。也可以分析crash日誌(見「問題-宕機」部分)
-
關注點1:總的線程數(1500以上就值得警惕,如果是>2000,基本可以斷定有問題)
-
線程絕對不是越多越好,尤其注意server.xml裏的maxClient配置,一般出廠默認的800就足夠大了。
-
關注點2:線程分組後的線程數,某類線程過多,需要根據實際情況排查
-
關注點3:相同堆棧的線程
-
關注點4:死鎖。二開多線程編程較少,此類情況不常見。
jstat
使用jstat命令,可以分析內存各區域的變化情況以及GC的時間,如圖中可以得到一下信息
jvisualvm
jvisualvm是windows或mac版jdk自帶的圖形分析工具
GC日誌分析
-
優先:https://gceasy.io/
-
重點關注GC停頓時間,集羣節點通信timeout時長3秒,GC超過這個時間就會節點丟失
-
其次:客戶端軟件:GC Viewer
日誌鏈路追蹤
平臺的鏈路非常短,默認只有web -> app
運維監控
系統交付客戶使用時,需要給客戶同步相關運維知識,尤其是監控和告警機制。隨着時間推移,數據庫數量增大、業務應用增多後,可能出現意想不到的問題。需要相應的監控巡檢和告警機制,提前對系統進行人工干預或者排查問題。
IaaS資源
服務質量監控(SLA)
SLA是用同進程Java統計運行情況,當JVM運行壓力小時,可有效統計,運行壓力大時,可供參考。
-
巡檢關注1:>3秒的線程,此處太慢輕則影響用戶體驗,嚴重累積則導致系統不可用/宕機。
-
點擊時間按鈕打開堆棧,分析慢的原因。可能是慢sql、請求外部接口、處理大量數據等。
-
線程卡住之後,只能重啓平臺解決,無法kill掉線程。(強行kill可能導致資源泄露或其他不可控問題,java已廢棄線程的stop方法)
-
巡檢關注2:Top5線程,系統啓動以來最慢的5個線程,可能線程已經運行結束,所以無法查看堆棧,所以只能提供線索。
-
巡檢關注3:SQL返回條數告警(6.4.3以後),默認>1W告警。返回行數太多時,容易造成GC停頓時間過長甚至是OOM錯誤。同數據庫返回條數監控,需要配合使用,區別:
-
優點:AWS平臺可以記錄下調用SQL的位置(有詳細堆棧)
-
缺點:一次性返回超出JVM heap承受的數據時,會造成JVM宕機,從而無法記錄該事故。
Java
JVM監控工具有多種,藍鯨或zabbix使用居多。
數據庫
數據庫監控工具有多種,藍鯨或zabbix使用居多,或者用自帶命令分析log文件,每家客戶的手段不太一樣。
結束語
-
對於系統性問題的思考、理解,以上只是拋磚引玉,需要不斷學習實踐總結。比如MAT的各種對象信息、zabbix的各種jvm監控指標含義等。
-
尋找解決方案時,強烈建議google,效率n倍加(可以用翻譯軟件)
-
平時解決問題時積攢的零散知識,感覺缺乏底層理解時,可以先記錄,然後找“系統性”學習的機會。(首推
極客時間,其次
慕課網)