在我們項目部署上線的時候,我們是不是會經常去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、人工智能、小程序、大前端等可加作者,無私奉獻
往期精選
關於 架構師修煉
本號旨在分享一線互聯網各種技術架構解決方案,分佈式以及高併發等相關專題,同時會將作者的學習總結進行整理並分享。