1. 程式人生 > >Linux:CPU使用率100%排查方法

Linux:CPU使用率100%排查方法

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

導讀 Linux作為一個多工作業系統,將每個CPU的時間劃分為很短的時間片,再通過排程器輪流分配給各個任務使用,因此造成多工同時執行的錯覺。

CPU使用率
Linux作為一個多工作業系統,將每個CPU的時間劃分為很短的時間片,再通過排程器輪流分配給各個任務使用,因此造成多工同時執行的錯覺。
為了維護CPU時間,Linux通過事先定義的節拍率(核心中表示為HZ),觸發時間中斷,並使用全域性變數Jiffies記錄了開機以來的節拍數。每發生一次時間中斷,Jiffies

的值就加1。
節拍率HZ是核心的可配選項,可以自定義配置,可通過/boot/config來查詢

$ grep 'CONFIG_HZ=' /boot/config-$(uname -r)
CONFIG_HZ=1000

CPU使用率有很多重要指標,具體含義如下:

user(通常縮寫為us),代表使用者態CPU時間。注意,它包括下面的nice時間,但包括了guest時間。

nice(通常縮寫為ni),代表低優先順序使用者態CPU時間,也就是程序的nice值被調整為1-19之間是的CPU時間。

system(通常縮寫為sys),代表核心態CPU時間

idle(通常縮寫為id),代表空閒時間。注意,它不包括I/O等待時間(iowait

iowait(通常縮寫為wa),代表等待I/O的CPU時間

irq(通常縮寫為hi),代表處理硬中斷的CPU時間

softirq(通常縮寫為si),代表處理軟中斷的CPU時間

steal(通常縮寫為st),代表當系統執行在虛擬機器中的時候,被其他虛擬機器佔用的CPU時間

guest(通常縮寫為guest),代表通過虛擬化執行其他作業系統的時間,也就是執行虛擬機器的CPU時間

而我們通常所說的CPU使用率,就是除了空閒時間外的其他時間佔總CPU時間的百分比,用公式表示為:

Linux:CPU使用率100%排查方法Linux:CPU使用率100%排查方法

上面這個計算方式是不具備參考意義的,因為總CPU時間是機器開機以來的,事實上,為了計算CPU使用率,效能工具都會取間隔一段時間(比如5秒)的兩次值,做差後,再計算出這段時間內的平均CPU使用率,即:

Linux:CPU使用率100%排查方法Linux:CPU使用率100%排查方法
不過需要注意的是,效能分析工具給出的都是間隔一段時間的平均CPU使用率,所以要注意間隔時間的設定,特別是多個工具對比分析時,需要保證它們的間隔時間是相同的。

比如,對比一下top和ps這兩個工具報告的CPU使用率,預設的結果可能不一樣,因為top預設使用3秒時間間隔,而ps使用的卻是程序的整個生命週期。
檢視CPU使用率的方法

知道了cpu使用率的含義後,我們再來看看要怎麼檢視CPU使用率,說道檢視cpu使用率效能工具,首先會想到pstop

top顯示了系統總體的CPU和記憶體使用情況,以及各個程序的資源使用情況

ps則是顯示了每個程序的資源使用情況

比如,top的輸出格式:
Linux:CPU使用率100%排查方法Linux:CPU使用率100%排查方法

需要注意的,top預設顯示的所有CPU的平均值,這個時候只需要按下數字1,就可以切換到每個CPU的使用率了。
繼續往下看,空白行之後是程序的實時資訊,每個程序都有一個%CPU列,表示程序的CPU使用率,它是使用者態和核心態CPU使用率的總和,包括程序使用者空間、使用的CPU、通過系統呼叫執行的核心空間CPU、以及在就緒佇列等待執行的CPU。
分析程序的命令,比如pidstat,改命令包括:

使用者態CPU使用率(%user)
核心態CPU使用率(%system)
執行虛擬機器CPU使用率(%guest)
等待CPU使用率(%wait)
以及總的CPU使用率(%CPU)
Linux:CPU使用率100%排查方法Linux:CPU使用率100%排查方法

CPU使用率過高怎麼辦

通過top、ps、pidstat等工具,可以找到具體的程序,但如果還想知道是程式碼中的哪個函式呢?找到它,才能更高效、更有針對性地進行優化

推薦使用系統內建的perf工具,它以效能事件取樣作為基礎,不僅可以分析系統的各種事件和核心效能,還可以用來分析指定應用程式的效能問題。

第一種常用方法是perf top
Linux:CPU使用率100%排查方法Linux:CPU使用率100%排查方法

輸出結果中,第一行包含三個資料,分別是取樣數(Samples)、事件型別(Event)和事件總數量(Event count)。

再往下看是一個表格資料,每一行包含四列,分別是:

第一列Overhead,是該符號的效能事件在所有采樣中的比例,用百分比表示
第二列Shared,是該函式或指令所在的動態共享物件,如核心、程序名、動態連結庫名等
第三列Object,是動態共享物件的型別,比如[.]表示使用者空間可執行程式、或者動態連結庫,而[k]則表示核心空間
最後一列Symbol是符號名,也就是函式名。當函式名未知時,用十六進位制的地址表示

第二種用法,就是perf recordperf reportperf top雖然實時展示了系統的效能資訊,但它的缺點是並不儲存資料,也就是無法用於離線或者後續的分析,而record則提供了儲存資料的功能,儲存資料後,使用perf report解析展示。
Linux:CPU使用率100%排查方法Linux:CPU使用率100%排查方法

原文來自: https://www.linuxprobe.com/linux-cpu-clearancemethod.ht