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

Linux做爲一個多任務操做系統,將每一個CPU的時間劃分爲很短的時間片,再經過調度器輪流分配給各個任務使用,所以形成多任務同時運行的錯覺。

CPU使用率
Linux做爲一個多任務操做系統,將每一個CPU的時間劃分爲很短的時間片,再經過調度器輪流分配給各個任務使用,所以形成多任務同時運行的錯覺。
爲了維護CPU時間,Linux經過事先定義的節拍率(內核中表示爲HZ),觸發時間中斷,並使用全局變量Jiffies記錄了開機以來的節拍數。每發生一次時間中斷,Jiffies的值就加1。
節拍率HZ是內核的可配選項,能夠自定義配置,可經過/boot/config來查詢linux

$ 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時間3d

irq(一般縮寫爲hi),表明處理硬中斷的CPU時間code

softirq(一般縮寫爲si),表明處理軟中斷的CPU時間對象

steal(一般縮寫爲st),表明當系統運行在虛擬機中的時候,被其餘虛擬機佔用的CPU時間blog

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%排查方法

相關文章
相關標籤/搜索