前言
在日常工作中,有時會遇到意想不到的線上故障,可能是伺服器CPU突然飆升,IO異常,記憶體溢位等等。一般線上故障的處理方式為:
- 先回滾版本
- 在測試環境定位問題,優化程式
- 打補丁解決
那麼在定位問題階段,除了檢視應用的日誌外,一些棘手的問題往往需要我們通盤排查伺服器,JVM的狀態和效能,工欲善其事必先利其器,效能監控工具往往可以幫到大忙。
最近遇到一個IO阻塞的問題,起因是發現線上某個服務6個例項其中一個有異常,該伺服器所有入方向連線都報超時,出方向正常。那麼檢視伺服器狀態後,找到了問題根因是一個websocket在特定的異常情況下造成記憶體洩漏,程式碼靜態檢查又沒有檢查到這個問題。最終通過檢視jvm堆疊定位到相應的類,修復了問題。
這裡就分享一下我平時一般使用的幾個監控工具。
linux伺服器狀態監控
如果在測試環境復現了問題。那麼這時候定位和監控工作就開始了。
一般先檢視伺服器基本狀態,例如CPU,記憶體,io,磁碟。 再用jvm相關的工具定位到jvm內的問題
uptime命令與top命令
uptime命令用來顯示最近1,5,15分鐘的負載情況,這個負載可以理解為CPU佔用情況,多核伺服器每一個CPU負載滿額為1 ,當然也存在超過的情況,正常情況下希望伺服器負載再70%以下。例如4核伺服器期望負載再2.8以內。 同時uptime還會顯示系統執行時間。時間越長表示越穩定。
top命令會顯示更詳細的資訊
顯示的內容詳解:- 第一行與uptime一致。
- 第二行為所有的程式數,1個再執行,200個sleep,0個停止,0個殭屍程式
- 第三行為cpu情況,分別為使用者空間佔用CPU百分比0.0% ,系統核心佔用0%,使用者程式空間內改變過優先順序的程式佔用CPU0%,空閒CPU佔99.9%,,等待輸入輸出的CPU佔0%,服務於硬中斷所耗費的CPU佔用0%,服務於軟中斷所耗費的CPU佔用0%。
- 第四行為實體記憶體總量,使用實體記憶體總量,空閒記憶體總量,用作核心快取的記憶體量。
- 第五行為swap交換分割槽 情況
- 下面的表格中主要有 S表示程式狀態(D=不可中斷的睡眠狀態,R=執行,S=睡眠,T=跟蹤/停止,Z=殭屍程式),CPU佔用情況,MEN記憶體佔用情況。
使用top可以簡單瞭解到cpu和men的資訊,如果出現了與我們期望值不匹配的情況,就是我們的程式出現了異常情況。
netstat命令檢視網路狀態
netstat命令主要是用來檢視linux系統的整個網路狀態
網路狀態會顯示本地埠與遠端埠,也有利於我們定位具體的服務。在我所遇到的一個案例中,用netstat -anp | grep 8080 |wc -l 查出有幾千個websocket連線,且檢視其狀態都是close_wait,websocket是基於http的長連線協議,那麼closewait表示http協議關閉時未正常關閉。
jvm狀態監控
jvm監控可以幫助我們定位到問題根因。
jstat命令
jstat命令用於檢視jvm記憶體各個區域佔用情況,和gc情況。
先用jps檢視到需要監控的java程式的pid,使用
jstat -gcutil pid 1000 20
每一秒採集一次,共採集20次
s0區 | s1 區 |eden區|old區|後設資料區|壓縮空間|YGC次數|YGC時間|FGC次數|FGC時間|總GC時間
後設資料區在jdk8之前,是permanent區 可以看到這個程式每隔幾秒鐘有一次YGC,在沒有使用者訪問的情況下,是什麼東西在頻繁建立缺沒有使用,可能就會產生問題。使用jvisualVM監控JVM
jvisualvm可以視覺化的觀察到jvm 的各類情況,而且這個工具越來越強大,在jdk9中已經脫離jdk獨立分發,需要單獨下載。在jdk8及以下,在jdk 的bin中可以找到這個工具。
左側可以看到本機正在執行的java程式,開啟之後在右邊可以視覺化的觀察到各類jvm資訊。