面試連環炮系列(八):服務器CPU飆升100%怎么排查


  1. 服務器CPU飆升100%怎么排查
    執行“top”命令,查看當前進程CPU占用的實時情況,PID列是進程號,確定是哪個應用程序的問題。

  2. 如果是Java應用導致的,怎么定位故障原因

    1. 執行“top -Hp 進程號”命令:查看java進程下的所有線程占CPU的情況。
    2. 執行“printf "%x\n 10"命令 :后續查看線程堆棧信息展示的都是十六進制,為了找到咱們的線程堆棧信息,把線程號轉成16進制。例如,printf "%x\n 10-》打印:a,那么在jstack中線程號就是0xa。
    3. 執行 “jstack 進程號 | grep 線程ID” 查找某進程下-》線程ID(jstack堆棧信息中的nid)=0xa的線程堆棧信息。如果“"VM Thread" os_prio=0 。tid=0x00007f871806e000 nid=0xa runnable”,第一個雙引號圈起來的就是線程名,如果是“VM Thread”這就是虛擬機GC回收線程了。
    4. 執行“jstat -gcutil 進程號 統計間隔毫秒 統計次數(缺省代表一致統計)”,查看某進程GC持續變化情況,如果發現返回中FGC很大且一直增大-》確認Full GC! 也可以使用“jmap -heap 進程ID”查看一下進程的堆內從是不是要溢出了,特別是老年代內從使用情況一般是達到閾值(具體看垃圾回收器和啟動時配置的閾值)就會進程Full GC。
    5. 執行“jmap -dump:format=b,file=filename 進程ID”,導出某進程下內存heap輸出到文件中。可以通過eclipse的mat工具查看內存中有哪些對象數量比較多。
  3. 頻繁Full GC有幾種原因

    1. 創建大量對象而無法回收。
    2. 頻繁顯示調用System.gc()。
  4. 如果是死鎖,怎么檢查呢
    執行 “jstack 進程號 | grep 線程ID” 查找對應的線程堆棧信息,出現deadlock關鍵字就表示發生了死鎖,通過堆棧信息能看到兩個線程的具體阻塞點。

參考(部分摘抄的文字版權屬於原作者):

https://mp.weixin.qq.com/s/g8KJhOtiBHWb6wNFrCcLVg

雞湯:別減肥了,你丑並不只是因為胖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM