相關概念
在Linux/Unix下,CPU利用率分為用戶態、系統態和空閑態,分別表示CPU處於用戶態執的時間,系統內核執行的時間,和空閑系統進程執行的時間。
下面是幾個與CPU占用率相關的概念。
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在為另一個虛擬處理器服務。
top命令看到的CPU占用率信息及各項值含義。
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時間分配給了其他的虛擬機了。這就叫做偷取。
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:0
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%
CPU利用率總節:
(1)Linux CPU占用率是根據/proc/stat文件中的數據計算而來;
(2)/proc/stat中的數據精度為ticks,即1/HZ秒;
(3)內核每個ticks會更新一次CPU使用信息;
(4)CPU占用率的精度為1/HZ秒。