1、業務日志相關
假設系統出現異常或者業務有異常,首先想到的都是查看業務日志
查看日志工具:
less 或者more
grep
tail -f filename 查看實時的最新內容
ps:切忌vim直接打開大日志文件,由於會直接載入到內存的
2、數據庫相關
java應用非常多瓶頸在數據庫,一條sql沒寫好導致慢查詢,可能就會帶來應用帶來致命危害。
假設出現Could not get JDBC Connection 、接口響應慢、線程打滿等。
須要登錄線上庫,
查看數據庫連接情況:show processlist。查看當前數據庫的連接情況。確實因為慢查詢造成。須要手動kill
3、JVM相關
java虛擬機相關的問題一般多是下面幾種問題:gc時間過長、OOM、死鎖、線程block、線程數暴漲等問題。一般通過下面幾個工具都能定位出問題。
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、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等狀態信息。
3.3 gc時間過長
todo
先貼一個文章占坑:http://www.oracle.com/technetwork/cn/articles/java/g1gc-1984535-zhs.html
4、server問題
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