在Linux/Unix下,CPU利用率分爲用戶態、系統態和空閒態,分別表示CPU處於用戶態執的時間,系統內核執行的時間,和空閒系統進程執行的時間。linux
CPU利用率:CPU的使用狀況。
用戶時間(User time) :表示CPU執行用戶進程的時間,包括nices時間。一般指望用戶空間CPU越高越好。
系統時間(System time) :表示CPU在內核運行時間,包括IRQ和softirq時間。系統CPU佔用率高,代表系統某部分存在瓶頸。一般值越低越好。
等待時間(Waiting time) :CPU在等待I/O操做完成所花費的時間。系統不該該花費大量時間來等待I/O操做,不然就說明I/O存在瓶頸。
空閒時間(Idle time) :系統處於空閒期,等待進程運行。
Nice時間(Nice time) :系統調整進程優先級所花費的時間。
硬中斷處理時間(Hard Irq time) :系統處理硬中斷所花費的時間。
軟中斷處理時間(SoftIrq time) :系統處理軟中斷中斷所花費的時間。
丟失時間(Steal time) :被強制等待(involuntary wait)虛擬CPU的時間,此時hypervisor在爲另外一個虛擬處理器服務。web
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 99.2%id, 0.5%wa, 0.0%hi, 0.0%si, 0.0%st
us: User time,用戶態使用的cpu時間比。CPU一共花了多少比例的時間運行在用戶態空間或者說是用戶進程(running user space processes)。典型的用戶態空間程序有:Shell、數據庫、web服務器。
sy: System time,系統態使用的cpu時間比。System的含義與User類似。System表示:CPU花了多少比例的時間在內核空間運行。分配內存、IO操做、建立子進程……都是內核操做。這也代表,當IO操做頻繁時,System參數會很高。
ni: Nice time,用作nice加權的進程分配的用戶態cpu時間比。用戶空間進程的CPU的調度優先級,範圍爲[-20,19]。每一個linux進程都有個優先級,優先級高的進程有優先執行的權利,這個叫作pri。進程除了優先級外,還有個優先級的修正值。即好比你原先的優先級是20,而後修正值爲-2,那麼你最後的進程優先級爲18。這個修正值就叫作進程的nice值。
id: Idle time,空閒的cpu時間比。通常而言,idel + user + nice 約等於100%。
wa: Waiting time,cpu等待磁盤寫入完成時間。在計算機中,讀寫磁盤的操做遠比CPU運行的速度要慢,CPU負載處理數據,而數據通常在磁盤上須要讀到內存中才能處理。當CPU發起讀寫操做後,須要等着磁盤驅動器將數據讀入內存,從而致使CPU 在等待的這一段時間內無事可作。CPU處於這種等待狀態的時間由Wait參數來衡量。因此若是一臺機器看到wa特別高,那麼通常說明是磁盤IO出現問題。
hi: Hard Irq time,硬中斷消耗時間
si: SoftIrq time,軟中斷消耗時間
若是程序都沒什麼問題,那麼是沒有hi和si的,可是實際上有個硬中斷和軟中斷的概念。好比硬中斷,cpu在執行程序的時候,忽然外設硬件(好比硬盤出現問題了)機器須要馬上通知cpu進行現場保存工做。這個時候會cpu會出現上下文切換。就是cpu會有一部分時間會被硬中斷佔用了,這個時間就是hi。相相似,si是軟中斷的cpu佔用時間,軟中斷是由軟件的指令方式觸發的。
st: Steal time,虛擬機偷取時間。對虛擬機來講的,一臺物理是能夠虛擬化出幾臺虛擬機的。在其中一臺虛擬機上用top查看發現st不爲0,就說明原本有這麼多個cpu時間是安排給這個虛擬機的,可是因爲某種虛擬技術,把這個cpu時間分配給了其餘的虛擬機了。這就叫作偷取。數據庫
Linux CPU佔用率計算,都是根據/proc/stat文件內容計算而來。服務器
# more /proc/stat cpu 23977676 8265 27737139 5387873754 2095720 404 650273 0 0 cpu0 12075284 4247 13885851 2693786340 1054213 7 312015 0 0 cpu1 11902391 4018 13851287 2694087414 1041507 396 338257 0 0 intr 7878366837 118 6 0 0 0 0 0 0 0 0 0 31 104 0 0 69 0 0 0 0 0 0 0 0 0 24 0 29360958 0 23446119 0 798059818 13974 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ctxt 51508933575 btime 1501052873 processes 17604072 procs_running 1 procs_blocked 0 softirq 6714836597 0 2060074967 76941 1854616421 18 0 2 584892288 14211110 2200964850
CPU信息,cpu爲總的信息,cpu0 ... cpun爲各個具體CPU信息
cpu 23977676 8265 27737139 5387873754 2095720 404 650273 0 0
共有9個值(單位:ticks),分別爲:
ticks就是系統時鐘中斷的時間間隔,該值與內核中HZ值有關,即ticks = 1/HZ。
HZ的值,就是每秒的時鐘中斷數量。能夠觀察/proc/interrupts中時鐘中斷值變化,來計算HZ的值。當HZ的值爲1000時,ticks的單位即爲1/1000秒,即1ms。
User time:23977676 Nice time:8265 System time:27737139 Idle time:5387873754
Waiting time:2095720 HardIrq time:404 SoftIRQ time:650273 Steal time:0 guest time:0ide
CPU佔用率計算公式
CPU時間=user+system+nice+idle+iowait+irq+softirq+Stl +guest
%us=(User time + Nice time)/CPU時間*100%
%sy=(System time + Hard Irq time +SoftIRQ time)/CPU時間*100%
%id=(Idle time)/CPU時間*100%
%ni=(Nice time)/CPU時間*100% %wa=(Waiting time)/CPU時間*100%
%hi=(Hard Irq time)/CPU時間*100%
%si=(SoftIRQ time)/CPU時間*100%
%st=(Steal time)/CPU時間*100%spa
CPU利用率總節:
(1)Linux CPU佔用率是根據/proc/stat文件中的數據計算而來;
(2)/proc/stat中的數據精度爲ticks,即1/HZ秒;
(3)內核每一個ticks會更新一次CPU使用信息;
(4)CPU佔用率的精度爲1/HZ秒。code