JVM學習筆記---伺服器,JVM效能監控工具

紅燒鯉魚發表於2018-09-24

前言

在日常工作中,有時會遇到意想不到的線上故障,可能是伺服器CPU突然飆升,IO異常,記憶體溢位等等。一般線上故障的處理方式為:

  1. 先回滾版本
  2. 在測試環境定位問題,優化程式
  3. 打補丁解決

那麼在定位問題階段,除了檢視應用的日誌外,一些棘手的問題往往需要我們通盤排查伺服器,JVM的狀態和效能,工欲善其事必先利其器,效能監控工具往往可以幫到大忙。

最近遇到一個IO阻塞的問題,起因是發現線上某個服務6個例項其中一個有異常,該伺服器所有入方向連線都報超時,出方向正常。那麼檢視伺服器狀態後,找到了問題根因是一個websocket在特定的異常情況下造成記憶體洩漏,程式碼靜態檢查又沒有檢查到這個問題。最終通過檢視jvm堆疊定位到相應的類,修復了問題。

這裡就分享一下我平時一般使用的幾個監控工具。

linux伺服器狀態監控

如果在測試環境復現了問題。那麼這時候定位和監控工作就開始了。

一般先檢視伺服器基本狀態,例如CPU,記憶體,io,磁碟。 再用jvm相關的工具定位到jvm內的問題

uptime命令與top命令

uptime命令用來顯示最近1,5,15分鐘的負載情況,這個負載可以理解為CPU佔用情況,多核伺服器每一個CPU負載滿額為1 ,當然也存在超過的情況,正常情況下希望伺服器負載再70%以下。例如4核伺服器期望負載再2.8以內。 同時uptime還會顯示系統執行時間。時間越長表示越穩定。

JVM學習筆記---伺服器,JVM效能監控工具

top命令會顯示更詳細的資訊

JVM學習筆記---伺服器,JVM效能監控工具
顯示的內容詳解:

  • 第一行與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系統的整個網路狀態

JVM學習筆記---伺服器,JVM效能監控工具
網路狀態會顯示本地埠與遠端埠,也有利於我們定位具體的服務。

在我所遇到的一個案例中,用netstat -anp | grep 8080 |wc -l 查出有幾千個websocket連線,且檢視其狀態都是close_wait,websocket是基於http的長連線協議,那麼closewait表示http協議關閉時未正常關閉。

JVM學習筆記---伺服器,JVM效能監控工具

jvm狀態監控

jvm監控可以幫助我們定位到問題根因。

jstat命令

jstat命令用於檢視jvm記憶體各個區域佔用情況,和gc情況。 先用jps檢視到需要監控的java程式的pid,使用 jstat -gcutil pid 1000 20 每一秒採集一次,共採集20次

s0區 | s1 區 |eden區|old區|後設資料區|壓縮空間|YGC次數|YGC時間|FGC次數|FGC時間|總GC時間

JVM學習筆記---伺服器,JVM效能監控工具
後設資料區在jdk8之前,是permanent區
JVM學習筆記---伺服器,JVM效能監控工具
可以看到這個程式每隔幾秒鐘有一次YGC,在沒有使用者訪問的情況下,是什麼東西在頻繁建立缺沒有使用,可能就會產生問題。

使用jvisualVM監控JVM

jvisualvm可以視覺化的觀察到jvm 的各類情況,而且這個工具越來越強大,在jdk9中已經脫離jdk獨立分發,需要單獨下載。在jdk8及以下,在jdk 的bin中可以找到這個工具。

JVM學習筆記---伺服器,JVM效能監控工具
左側可以看到本機正在執行的java程式,開啟之後在右邊可以視覺化的觀察到各類jvm資訊。

相關文章