Linux作為一個多任務操作系統,將每個CPU的時間划分為很短的時間片,再通過調度器輪流分配給各個任務使用,因此造成多任務同時運行的錯覺。
CPU使用率
Linux作為一個多任務操作系統,將每個CPU的時間划分為很短的時間片,再通過調度器輪流分配給各個任務使用,因此造成多任務同時運行的錯覺。
為了維護CPU時間,Linux通過事先定義的節拍率(內核中表示為HZ),觸發時間中斷,並使用全局變量Jiffies記錄了開機以來的節拍數。每發生一次時間中斷,Jiffies
的值就加1。
節拍率HZ是內核的可配選項,可以自定義配置,可通過/boot/config
來查詢
$ grep 'CONFIG_HZ=' /boot/config-$(uname -r) CONFIG_HZ=1000
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使用率,所以要注意間隔時間的設置,特別是多個工具對比分析時,需要保證它們的間隔時間是相同的。
比如,對比一下top和ps這兩個工具報告的CPU使用率,默認的結果可能不一樣,因為top默認使用3秒時間間隔,而ps使用的卻是進程的整個生命周期。
查看CPU使用率的方法
知道了cpu使用率的含義后,我們再來看看要怎么查看CPU使用率,說道查看cpu使用率性能工具,首先會想到ps
、top
。
top
顯示了系統總體的CPU和內存使用情況,以及各個進程的資源使用情況
ps
則是顯示了每個進程的資源使用情況
比如,top
的輸出格式:
需要注意的,top默認顯示的所有CPU的平均值,這個時候只需要按下數字1,就可以切換到每個CPU的使用率了。
繼續往下看,空白行之后是進程的實時信息,每個進程都有一個%CPU列,表示進程的CPU使用率,它是用戶態和內核態CPU使用率的總和,包括進程用戶空間、使用的CPU、通過系統調用執行的內核空間CPU、以及在就緒隊列等待運行的CPU。
分析進程的命令,比如pidstat,改命令包括:
用戶態CPU使用率(%user)
內核態CPU使用率(%system)
運行虛擬機CPU使用率(%guest)
等待CPU使用率(%wait)
以及總的CPU使用率(%CPU)
通過top、ps、pidstat等工具,可以找到具體的進程,但如果還想知道是代碼中的哪個函數呢?找到它,才能更高效、更有針對性地進行優化
。
推薦使用系統內置的perf工具,它以性能事件采樣作為基礎,不僅可以分析系統的各種事件和內核性能,還可以用來分析指定應用程序的性能問題。
第一種常用方法是perf top
輸出結果中,第一行包含三個數據,分別是采樣數(Samples)、事件類型(Event)和事件總數量(Event count)。
第一列Overhead,是該符號的性能事件在所有采樣中的比例,用百分比表示
第二列Shared,是該函數或指令所在的動態共享對象,如內核、進程名、動態鏈接庫名等
第三列Object,是動態共享對象的類型,比如[.]表示用戶空間可執行程序、或者動態鏈接庫,而[k]則表示內核空間
最后一列Symbol是符號名,也就是函數名。當函數名未知時,用十六進制的地址表示
第二種用法,就是perf record
和perf report
。perf top
雖然實時展示了系統的性能信息,但它的缺點是並不保存數據,也就是無法用於離線或者后續的分析,而record則提供了保存數據的功能,保存數據后,使用perf report
解析展示。