1、業務日誌相關
如果系統出現異常或者業務有異常,首先想到的都是查看業務日誌
查看日誌工具:
less 或者more
grep
tail -f filename 查看即時的最新內容
ps:切忌vim直接開啟大記錄檔,因為會直接載入到記憶體的 <h1 id="id-線上問題排查-2、 資料庫相關">2、資料庫相關
java應用很多瓶頸在資料庫,一條sql沒寫好導致慢查詢,可能就會帶來應用帶來致命危害。
如果出現Could not get JDBC Connection 、介面響應慢、線程打滿等,
需要登入線上庫,
查看資料庫連接情況:show processlist,查看當前資料庫的串連情況,確實由於慢查詢造成,需要手動kill 3、JVM相關
java虛擬機器相關的問題一般多是以下幾種問題:gc時間過長、OOM、死結、線程block、線程數暴漲等問題。一般通過以下幾個工具都能定位出問題。
jps命令
jinfo命令
jstat命令
jstack命令
jmap命令 3.1 OOM問題
發生OOM問題一般服務都會crash,業務日誌會有OutOfMemoryError。OOM一般都是出現了記憶體泄露,需要查看OOM時候的jvm堆的快照,如果配置了-XX:+HeapDumpOnOutOfMemoryError, 在發生OOM的時候會在-XX:HeapDumpPath產生堆的dump檔案,結合MAT,可以對dump檔案進行分析,尋找出發生OOM的原因. 關於MAT使用不詳述了,google上一堆(http://inter12.iteye.com/blog/1407492)。
ps.
1、伺服器的記憶體一般較大,所以要保證伺服器的磁碟空間大於記憶體大小
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 4、伺服器問題 4.1 CPU
top命令(參考https://linux.cn/article-2352-1.html)
主要關注cpu的load,以及比較耗cpu的進程
由於現在伺服器都是虛擬機器,還要關注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次