故障排查——CPU使用率過高

本篇將介紹CPU使用率過高的處理方案。

CPU使用率

CPU使用率過高,跟內存和進程都有關係,例如複雜運算,一般都會導致CPU升高。使用top命令查看(按1可以查看多核的CPU使用情況):
Top

產生原因

第三行 CPU 佔用率根據類型有以下幾種情況:

  • (us) user:CPU 在低 nice 值(高優先級)用戶態所佔用的時間(nice<=0)。正常情況下只要服務器不是很閒,那麼大部分的 CPU 時間應該都在此執行這類程序
  • (sy) system:CPU 處於內核態所佔用的時間,操作系統通過系統調用(system call)從用戶態陷入內核態,以執行特定的服務;通常情況下該值會比較小,但是當服務器執行的 IO 比較密集的時候,該值會比較大
  • (ni) nice:CPU 在高 nice 值(低優先級)用戶態以低優先級運行佔用的時間(nice>0)。默認新啓動的進程 nice=0,是不會計入這裏的,除非手動通過 renice 或者 setpriority() 的方式修改程序的nice值
  • (id) idle:CPU 在空閒狀態(執行 kernel idle handler )所佔用的時間
  • (wa) iowait:等待 IO 完成做佔用的時間
  • (hi) irq:系統處理硬件中斷所消耗的時間
  • (si) softirq:系統處理軟中斷所消耗的時間,記住軟中斷分爲 softirqs、tasklets (其實是前者的特例)、work queues,不知道這裏是統計的是哪些的時間,畢竟 work queues 的執行已經不是中斷上下文了
  • (st) steal:在虛擬機情況下才有意義,因爲虛擬機下 CPU 也是共享物理 CPU 的,所以這段時間表明虛擬機等待 hypervisor 調度 CPU 的時間,也意味着這段時間 hypervisor 將 CPU 調度給別的 CPU 執行,這個時段的 CPU 資源被“stolen”了。

排查步驟

CPU 佔用率高很多情況下意味着一些東西,這也給服務器 CPU 使用率過高情況下指明瞭相應地排查思路:

  1. 當 user 佔用率過高的時候,通常是某些個別的進程佔用了大量的 CPU,這時候很容易通過 top 找到該程序;此時如果懷疑程序異常,可以通過 perf 等思路找出熱點調用函數來進一步排查;

  2. 當 system 佔用率過高的時候,如果 IO 操作(包括終端 IO)比較多,可能會造成這部分的 CPU 佔用率高,比如在 file server、database server 等類型的服務器上,否則(比如>20%)很可能有些部分的內核、驅動模塊有問題;

  3. 當 nice 佔用率過高的時候,通常是有意行爲,當進程的發起者知道某些進程佔用較高的 CPU,會設置其 nice 值確保不會淹沒其他進程對 CPU 的使用請求;

  4. 當 iowait 佔用率過高的時候,通常意味着某些程序的 IO 操作效率很低,或者 IO 對應設備的性能很低以至於讀寫操作需要很長的時間來完成;

  5. 當 irq/softirq 佔用率過高的時候,很可能某些外設出現問題,導致產生大量的irq請求,這時候通過檢查 /proc/interrupts 文件來深究問題所在;

  6. 當 steal 佔用率過高的時候,黑心廠商虛擬機超售了吧!

  7. top -c 然後按P,獲取CPU使用率最高的進程

  • 如果是Java類應用,使用JDK提供的工具排查具體線程ID的調用情況即可,可以參考CPU %100排查過程
  • C++的話,使用gdb調試;
  • 沒有專門的工具的話,使用strace命令即可,例如跟蹤28979進程的所有系統調用(-e trace=all),並統計系統調用的花費時間,以及開始時間(並以可視化的時分秒格式顯示),最後將記錄結果存在output.txt文件裏面:
    strace -o output.txt -T -tt -e trace=all -p 28979

健康範圍

一般來說服務器上的CPU使用率在%40-%60左右即可,最高不超過80%,如果長期超過,考慮升級核心數。

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