線上服務器的cpu使用達到100%了,如何排查、定位和解決該問題?


1、面試題 線上服務器的cpu使用達到100%了,如何排查、定位和解決該問題?

2、面試官心里分析 說實話,這個問題是面試的時候,聊基礎,最常問的一個問題,就是看看你有沒有處理過高負載的線上問題場景。所以很多大公司考察你的基本功,肯定會問這個。其實這個你干過就是干過,掌握就是掌握,只要干過,所有人都是一樣的步驟,沒區別。

3、面試題剖析 其實核心思路,就是找到這台服務器上,是哪個進程的哪個線程的哪段代碼,導致cpu 100了,主要就是考察你是否熟練運用一些線上的命令。 這里我可以給大家說一個我們線上的經驗,就是之前有一個bug,是一個很年輕的同學寫的,就是我們當時是定了異常日志是寫到es里去的 public void log(String message) { try { // 往es去寫 } catch(Exception e) { log(message); } } 線上事故,es集群出了點問題,沒法寫,最后出現線上幾十台機器,全部因為這一行代碼,全體cpu 100%,卡死了

(1)定位耗費cpu的進程 top -c,就可以顯示進程列表,然后輸入P,按照cpu使用率排序,你會看到類似下面的東西 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 43987 root 20 0 28.2g 4.5g 68m S 99.0 24.0 44333.4 java -Xms。。。 大概類似上面這樣,能看到哪個進程,CPU負載最高,還有啟動這個進程的命令,比如一般就是java啥啥的。

(2)定位耗費cpu的線程 top -Hp 43987,就是輸入那個進程id就好了,然后輸入P,按照cpu使用率排序,你會看到類似下面的東西 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 16872 root 20 0 28.2g 4.5g 68m S 95.0 12.0 65543.3 java 大概類似上面那樣,你就可以看到這個進程里的哪個線程耗費cpu最高

(3)定位哪段代碼導致的cpu過高 printf “%x\n” 16872,把線程pid轉換成16進制,比如41e8 jstack 43987 | grep ‘0x41e8’ -C5 --color 這個就是用jstack打印進程的堆棧信息,而且通過grep那個線程的16進制的pid,找到那個線程相關的東西,這個時候就可以在打印出的代碼里,看到是哪個類的哪個方法導致的這個cpu 100%的問題


免責聲明!

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



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