java線上服務問題排查

1、業務日誌相關

假設系統出現異常或者業務有異常,首先想到的都是查看業務日誌

查看日誌工具:

less 或者more

grep

tail -f filename 查看實時的最新內容

ps:切忌vim直接打開大日誌文件,由於會直接載入到內存的

2、數據庫相關

java應用非常多瓶頸在數據庫,一條sql沒寫好導致慢查詢,可能就會帶來應用帶來致命危害。

假設出現Could not get JDBC Connection 、接口響應慢、線程打滿等。

須要登錄線上庫,

查看數據庫連接情況:show processlist。查看當前數據庫的連接情況。確實因爲慢查詢造成。須要手動kill

3JVM相關

java虛擬機相關的問題一般多是下面幾種問題:gc時間過長、OOM、死鎖、線程block、線程數暴漲等問題。一般通過下面幾個工具都能定位出問題。

jps命令

jinfo命令

jstat命令

jstack命令

jmap命令

3.1 OOM問題

發生OOM問題一般服務都會crash,業務日誌會有OutOfMemoryError。OOM一般都是出現了內存泄露,須要查看OOM時候的jvm堆的快照,假設配置了-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError="kill %p" -XX:HeapDumpPath=/data/logs/spark/heapdump-`date +'%Y%m%d%H%M'`.hprof,在發生OOM的時候會在-XX:HeapDumpPath生成堆的dump文件。結合MAT,能夠對dump文件進行分析。查找出發生OOM的原因. 關於MAT使用不詳述了,google上一堆(http://inter12.iteye.com/blog/1407492)。

ps.

1、server的內存一般較大,所以要保證server的磁盤空間大於內存大小

2、另外手動dump堆快照。能夠使用命令jmap -dump:format=b,file=file_name pid 或者kill -3 pid

3.2 死鎖

死鎖原因是兩個或者多個線程相互等待資源。現象通常是出現線程hung住。更嚴重會出現線程數暴漲,系統出現api alive報警等。查看死鎖最好的方法就是分析當時的線程棧。

 

詳細case 能夠參考jstack命令裏面的樣例

用到的命令:

jps -v

jstack -l pid

3.3 線程block、線程數暴漲

jstack -l pid |wc -l

jstack -l pid |grep "BLOCKED"|wc -l

jstack -l pid |grep "Waiting on condition"|wc -l

線程block問題通常是等待io、等待網絡、等待監視器鎖等造成,可能會導致請求超時、造成造成線程數暴漲導致系統502等。

假設出現這樣的問題,主要是關注jstack 出來的BLOCKED、Waiting on condition、Waiting on monitor entry等狀態信息。

 

 

假設大量線程在“waiting for monitor entry”:

 

可能是一個全局鎖堵塞住了大量線程。

 

假設短時間內打印的 thread dump 文件反映。隨着時間流逝。waiting for monitor entry 的線程越來越多,沒有降低的趨勢,可能意味着某些線程在臨界區裏呆的時間太長了,以至於越來越多新線程遲遲無法進入臨界區。

 

假設大量線程在“waiting on condition”:

可能是它們又跑去獲取第三方資源,遲遲獲取不到Response,導致大量線程進入等待狀態。

 

 

所以假設你發現有大量的線程都處在 Wait on condition,從線程堆棧看,正等待網絡讀寫,這可能是一個網絡瓶頸的徵兆,由於網絡堵塞導致線程無法運行。

3.3 gc時間過長

todo

先貼一個文章佔坑:http://www.oracle.com/technetwork/cn/articles/java/g1gc-1984535-zhs.html

4server問題

4.1 CPU

top命令(參考https://linux.cn/article-2352-1.html)

主要關注cpu的load,以及比較耗cpu的進程

因爲如今server都是虛擬機,還要關注st(st 的全稱是 Steal Time 。是分配給執行在其他虛擬機上的任務的實際 CPU 時間)

 

經常使用交互命令:

h 幫助。十分實用

R: 反向排序

x:將排序字段高亮顯示(縱列)

y 將執行進程高亮顯示(橫行)

shift+> 或shift+<:切換排序字段

 d或s: 設置顯示的刷新間隔

f: 字段管理 設置顯示的字段

k:kill進程

4.2 內存

free命令:

free -m -c10 -s1

-m:以MB爲單位顯示。其它的有-k -g -b

-s: 間隔多少秒持續觀察內存使用狀況

-c:觀察多少次

 

vmstat命令:(http://man.linuxde.net/vmstat)

vmstat 1 10

1表示每隔1s輸出一次,10 表示輸出10

 

兩個參數須要關注

r: 執行隊列中進程數量,這個值也能夠推斷是否須要添加CPU。

(長期大於1)

b: 等待IO的進程數量。
 

4.3 IO

iostat 命令(http://www.orczhou.com/index.php/2010/03/iostat-detail/

 

iostat -m 1 10

  • -m:某些使用block爲單位的列強制使用MB爲單位
  • 1 10:數據顯示每隔1秒刷新一次。共顯示10次

 

4.4 網絡

netstat 命令(http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html

netstat -antp 

-a (all)顯示全部選項。默認不顯示LISTEN相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的所有轉化成數字。
-l 僅列出有在 Listen (監聽) 的服服務狀態

-p 顯示建立相關鏈接的程序名

 

 

顯示tcp各個狀態數量:

 netstat -ant |awk '{print $6}'|sort|uniq -c

 

查看連接某服務port最多的的IP地址

netstat -nat | grep "10.32.45.35:8924" |awk '{print $5}'|awk -F: '{print $4}'|sort|uniq -c|sort -nr|head -10

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章