Linux伺服器負載暴增和故障排查完全指南

FeelTouch發表於2018-02-11
類別監控命令描述備註
記憶體瓶頸free檢視記憶體使用 
 vmstat 3(間隔時間) 100(監控次數)檢視swap in/out詳細定位是否存在效能瓶頸推薦使用
 sar -r 3和free命令類似,檢視記憶體的使用情況,但是不包含swap的情況 
cpu瓶頸top -H按照cpu消耗高低進行排序 
 ps -Lp 程式號 cu檢視某個程式的cpu消耗排序 
 cat /proc/cpuinfo |grep ‘processor’|wc -l檢視cpu核數 
 top檢視cpu總體消耗,包括分項消耗如user,system,idle,nice等消耗 
 top 然後shift+h:顯示java執行緒,然後shift+M:按照記憶體使用進行排序;shift+P:按照cpu時間排序;shift+T:按照cpu累計使用時間排序

多核cpu,按“1”進入top檢視

  
 sar -u 3(間隔時間)檢視cpu總體消耗佔比 
 sar -q檢視cpu load 
 top -b -n 1 | awk ‘{if (NR<=7)print;else if($8==”D”){print;count++}}END{print “Total status D:”count}’計算在cpu load裡面的uninterruptedsleep的任務數量uninterruptedsleep的任務會被計入cpu load,如磁碟堵塞
網路瓶頸cat /var/log/messages檢視核心日誌,檢視是否丟包 
 watch more /proc/net/dev用於定位丟包,錯包情況,以便看網路瓶頸重點關注drop(包被丟棄)和網路包傳送的總量,不要超過網路上限
 sar -n SOCK檢視網路流量 
 netstat -na|grep ESTABLISHED|wc -l檢視tcp連線成功狀態的數量此命令特別消耗cpu,不適合進行長時間監控資料收集
 netstat -na|awk’{print $6}’|sort |uniq -c |sort -nr看tcp各個狀態數量 
 netstat -i檢視網路錯誤 
 ss state ESTABLISHED| wc -l更高效地統計tcp連線狀態為ESTABLISHED的數量 
 cat /proc/net/snmp檢視和分析240秒內網路包量,流量,錯包,丟包用於計算重傳率tcpetr=RetransSegs/OutSegs
 ping ip測試網路效能 
 traceroute ip檢視路由經過的地址常用於定位網路在各個路由區段的耗時
 dig 域名檢視域名解析地址 
 dmesg檢視系統核心日誌 
磁碟瓶頸iostat -x -k -d 1詳細列出磁碟的讀寫情況當看到I/O等待時間所佔CPU時間的比重很高的時候,首先要檢查的就是機器是否正在大量使用交換空間,同時關注iowait佔比cpu的消耗是否很大,如果大說明磁碟存在大的瓶頸,同時關注await,表示磁碟的響應時間以便小於5ms
 iostat -x檢視系統各個磁碟的讀寫效能重點關注await和iowait的cpu佔比
 iotop檢視哪個程式在大量讀取IO一般先通過iostat檢視是否存在io瓶頸,再定位哪個程式在大量讀取IO
 df -hl檢視磁碟剩餘空間 
 du -sh檢視磁碟使用了多少空間 
應用瓶頸ps -ef | grep java檢視某個程式的id號 
 ps -ef | grep httpd| wc -l檢視特定程式的數量 
 cat ***.log | grep ***Exception | wc -l統計日誌檔案中包含特定異常數量 
 jstack -l pid用於檢視執行緒是否存在死鎖 
 awk’{print $8}’ 2017-05-22-access_log|egrep ’301|302′| wc -l統計log中301、302狀態碼的行數,$8表示第八列是狀態碼,可以根據實際情況更改常用於應用故障定位
 grep ‘wholesaleProductDetailNew’ cookie_log | awk ‘{if($10==”200″)}’print}’ | awk ‘print $12′ | more列印包含特定資料的12列資料 
 grep “2017:05:22″ cookielog | awk ‘($12>0.3){print $12 “–” $8}’ | sort > 目錄地址對apache或者nginx訪問log進行響應時間排序,$12表示cookie log中的12列表示響應時間用於排查是否是由於是某些訪問超長造成整體的RT變長
 grep -v ‘HTTP/1.1″ 200′取出非200響應碼的URL 
 pgm -A -f 應用叢集名稱 “grep “’301 ‘ log檔案地址 | wc -l檢視整個叢集的log中301狀態碼的數量 
 ps -efL | grep [PID] | wc -l檢視某個程式建立的執行緒數 
 find / -type f -name “*.log” | xargs grep “ERROR”統計所有的log檔案中,包含Error字元的行這個在排查問題過程中比較有用
 jstat -gc [pid]檢視gc情況 
 jstat -gcnew [pid]檢視young區的記憶體使用情況,包括MTT(最大互動次數就被交換到old區),TT是目前已經交換的次數 
 jstat -gcold檢視old區的記憶體使用情況 
 jmap -J-d64 -dump:format=b,file=dump.bin PIDdump出記憶體快照-J-d64防止jmap導致虛擬機器crash(jdk6有bug)
 -XX:+HeapDumpOnOutOfMemeryError在java啟動時加入,當出現記憶體溢位時,儲存記憶體快照 
 jmap -histo [pid]按照物件記憶體大小排序注意會導致full gc
 gcore [pid]匯出完成的記憶體快照通常和jmap -permstat /opt/**/java gcore.bin 一起使用,將core dump轉換成heap dump
 -XX:HeapDumpPath=/home/logs -Xloggc:/home/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps在Java啟動引數中加入,列印gc日誌 
 -server -Xms4000m -Xmx4000m -Xmn1500m -Xss256k -XX:PermSize=340m -XX:MaxPermSize=340m -XX:+UseConcMarkSweepGC調整JVM堆大小xss是棧大小

相關文章