Linux生產環境CPU使用率100%,教你定位到具體函數

在我們項目部署上線的時候,我們是不是會經常去Linux服務器上查查服務器的CPU使用率,或者是運維經常會盯Linux的CPU使用率,發現監控報了60%的一般就會報警了,到了100%那就慘啦,做我開發的我們如果自己程序運行時CPU使用率一直是100%的話,那麼,我們加班肯定逃不掉了,更打擊我們自己的強大的自尊心。今天我就將我們線上之前有個100%的CPU給大家講解下,然後教大家怎麼去定位然後發現到具體的函數,然後去修改它就行了

 

什麼是CPU使用率

CPU 使用率,就是除了空閒時間外的其他時間佔總 CPU 時間的百分比,

 

咱們大家平時是不是都是用top 或者 ps來分析CPU使用率的,需要我們注意的是,性能分析工具給出的都是間隔一段時間的平均 CPU 使用率,所以要注意間隔時間的設置,特別是用多個工具對比分析時,你一定要保證它們用的是相同的間隔時間。

例如,我們的 top 和 ps 分析工具報告的 CPU 使用率,兩者的結果可能不太一樣,因爲 top 默認使用 3 秒時間的間隔,而 ps 工具使用的卻是進程的整個生命週期。

 

怎麼找出100%的問題

我們在上面先大致的瞭解了CPU使用率是什麼,下面我就來教大家怎麼定位到造成CPU100%的具體函數。

1,用ssh客戶端登錄到你的服務器

運行 top 命令,然後按一下鍵盤上 1 鍵,查看你Linux服務器上每個CPU的使用率情況,如下圖

 

現在,我這個CPU是正常的,就沒有給重新放出100%進程了,定位方法時一樣的。我就假設我這個php-fpm 進程CPU到了100%看下面:

top - 13:59:19 up 168 days, 23:03, 1 user, load average: 0.04, 0.03, 0.00
Tasks: 216 total, 1 running, 215 sleeping, 0 stopped, 0 zombie
%Cpu0 : 99.0 us, 2.4 sy, 0.0 ni, 97.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 99.8 us, 1.2 sy, 0.0 ni, 97.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4028864 total, 973100 free, 711608 used, 2344156 buff/cache
KiB Swap: 1046524 total, 1032336 free, 14188 used. 2920808 avail Mem 
 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
 94804 dev 20 0 49004 3812 3084 R 2.3 0.1 0:00.20 top 
 94805 dev 20 0 47212 8796 2408 S 1.1 0.2 407:42.92 php-fpm 
94806 dev 20 0 47212 8796 2408 S 1.1 0.2 407:42.92 php-fpm
 94670 root 20 0 19620 2996 2764 S 1.1 0.1 0:00.03 mysql-systemd-s 
 94762 dev 20 0 97464 3556 2608 S 1.1 0.1 0:00.08 sshd 

從上面可看出,兩個php-fpm進程的CPU使用率加起來99.8%了。和最上面的%CPU基本都快到100了,所以,現在我們就可以確定造成服務器CPU 使用率100%的進程是這php-fpmj進程

2,怎麼知道是哪個函數

雖然現在我們知道是由於php-fpm進程造成的cpu飆升,但是裏面代碼那麼多,我怎麼知道是哪個函數哪塊代碼出的問題的呢?這個時候,我們就需要用另一個工具perf來分析下,也就是在ssh上輸入pref命令來看下:

 

# -g開啓調用關係分析,-p指定php-fpm的進程號94806$ perf top -g -p 94806

 

我們通過按方向鍵,切換到php-fpm,然後按回車鍵就會展開php-fpm的調用關係,最後我們就會看到,調用關係最終到了 sqrt 和 add_function。所以我們現在就需要看這兩個函數了。

 

3,查看函數

好,那我們來看看這個函數sqrt,add_function這個函數是php內置的,現在看看是出現了什麼問題

$ cat app/index.php $x += sqrt($x);
}

echo "It works!"

現在,我們已經看到了,我在上面加了個大循環,這裏導致cpu使用率驟增的。

總結,我們知道CPU的使用率其實在生產環境就是直接的反應我們系統性能的重要指標。當我們碰到 我們服務器CPU 使用率升高的時候,不要慌,我們要先借助 top、pidstat 等性能分析工具,先找到導致 CPU 性能問題的來源;然後再使用 perf 相關分析工具,進行查出引起性能問題的具體函數所在。如果大家喜歡或者對大家有幫助,就關注我,讓我們一起共同學習共同進步。

下一篇預告,分庫分表相關專題

在公衆號菜單“成神之路” 可獲得專屬架構視頻資料,有今年最新面試資料,更多java、python、人工智能、小程序、大前端等可加作者,無私奉獻

往期精選

數據庫分庫分表方案,優化大量併發寫入所帶來的性能問題

java類加載機制,再也不怕面試官的刁難

要想精通java,你必須得知道java的內存模型,不忽悠

數據庫讀寫分離方案,實現高性能數據庫集羣

我們是這樣一步一步實現分佈式鎖的

不好意思,懂分佈式事務的你真的很了不起,下篇

 

關於  架構師修煉

本號旨在分享一線互聯網各種技術架構解決方案,分佈式以及高併發等相關專題,同時會將作者的學習總結進行整理並分享。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章