博客專欄

EEPW首頁 > 博客 > Linux CPU使用率含義及原理

Linux CPU使用率含義及原理

發(fā)布人:電子禪石 時(shí)間:2022-02-08 來源:工程師 發(fā)布文章

Linux CPU使用率含義及原理

相關(guān)概念

在Linux/Unix下,CPU利用率分為用戶態(tài)、系統(tǒng)態(tài)和空閑態(tài),分別表示CPU處于用戶態(tài)執(zhí)的時(shí)間,系統(tǒng)內(nèi)核執(zhí)行的時(shí)間,和空閑系統(tǒng)進(jìn)程執(zhí)行的時(shí)間。

下面是幾個(gè)與CPU占用率相關(guān)的概念。

CPU利用率:CPU的使用情況。


用戶時(shí)間(User time) :表示CPU執(zhí)行用戶進(jìn)程的時(shí)間,包括nices時(shí)間。通常期望用戶空間CPU越高越好。


系統(tǒng)時(shí)間(System time) :表示CPU在內(nèi)核運(yùn)行時(shí)間,包括IRQ和softirq時(shí)間。系統(tǒng)CPU占用率高,表明系統(tǒng)某部分存在瓶頸。通常值越低越好。


等待時(shí)間(Waiting time) :CPU在等待I/O操作完成所花費(fèi)的時(shí)間。系統(tǒng)不應(yīng)該花費(fèi)大量時(shí)間來等待I/O操作,否則就說明I/O存在瓶頸。


空閑時(shí)間(Idle time) :系統(tǒng)處于空閑期,等待進(jìn)程運(yùn)行。


Nice時(shí)間(Nice time) :系統(tǒng)調(diào)整進(jìn)程優(yōu)先級(jí)所花費(fèi)的時(shí)間。


硬中斷處理時(shí)間(Hard Irq time) :系統(tǒng)處理硬中斷所花費(fèi)的時(shí)間。
軟中斷處理時(shí)間(SoftIrq time) :系統(tǒng)處理軟中斷中斷所花費(fèi)的時(shí)間。


丟失時(shí)間(Steal time) :被強(qiáng)制等待(involuntary wait)虛擬CPU的時(shí)間,此時(shí)hypervisor在為另一個(gè)虛擬處理器服務(wù)。

 

top命令看到的CPU占用率信息及各項(xiàng)值含義。

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,用戶態(tài)使用的cpu時(shí)間比。CPU一共花了多少比例的時(shí)間運(yùn)行在用戶態(tài)空間或者說是用戶進(jìn)程(running user space processes)。典型的用戶態(tài)空間程序有:Shell、數(shù)據(jù)庫、web服務(wù)器。
sy: System time,系統(tǒng)態(tài)使用的cpu時(shí)間比。System的含義與User相似。System表示:CPU花了多少比例的時(shí)間在內(nèi)核空間運(yùn)行。分配內(nèi)存、IO操作、創(chuàng)建子進(jìn)程……都是內(nèi)核操作。這也表明,當(dāng)IO操作頻繁時(shí),System參數(shù)會(huì)很高。
ni: Nice time,用做nice加權(quán)的進(jìn)程分配的用戶態(tài)cpu時(shí)間比。用戶空間進(jìn)程的CPU的調(diào)度優(yōu)先級(jí),范圍為[-20,19]。每個(gè)linux進(jìn)程都有個(gè)優(yōu)先級(jí),優(yōu)先級(jí)高的進(jìn)程有優(yōu)先執(zhí)行的權(quán)利,這個(gè)叫做pri。進(jìn)程除了優(yōu)先級(jí)外,還有個(gè)優(yōu)先級(jí)的修正值。即比如你原先的優(yōu)先級(jí)是20,然后修正值為-2,那么你最后的進(jìn)程優(yōu)先級(jí)為18。這個(gè)修正值就叫做進(jìn)程的nice值。
id: Idle time,空閑的cpu時(shí)間比。一般而言,idel + user + nice 約等于100%。
wa: Waiting time,cpu等待磁盤寫入完成時(shí)間。在計(jì)算機(jī)中,讀寫磁盤的操作遠(yuǎn)比CPU運(yùn)行的速度要慢,CPU負(fù)載處理數(shù)據(jù),而數(shù)據(jù)一般在磁盤上需要讀到內(nèi)存中才能處理。當(dāng)CPU發(fā)起讀寫操作后,需要等著磁盤驅(qū)動(dòng)器將數(shù)據(jù)讀入內(nèi)存,從而導(dǎo)致CPU 在等待的這一段時(shí)間內(nèi)無事可做。CPU處于這種等待狀態(tài)的時(shí)間由Wait參數(shù)來衡量。所以如果一臺(tái)機(jī)器看到wa特別高,那么一般說明是磁盤IO出現(xiàn)問題。
hi: Hard Irq time,硬中斷消耗時(shí)間
si: SoftIrq time,軟中斷消耗時(shí)間


如果程序都沒什么問題,那么是沒有hi和si的,但是實(shí)際上有個(gè)硬中斷和軟中斷的概念。比如硬中斷,cpu在執(zhí)行程序的時(shí)候,突然外設(shè)硬件(比如硬盤出現(xiàn)問題了)機(jī)器需要立刻通知cpu進(jìn)行現(xiàn)場保存工作。這個(gè)時(shí)候會(huì)cpu會(huì)出現(xiàn)上下文切換。就是cpu會(huì)有一部分時(shí)間會(huì)被硬中斷占用了,這個(gè)時(shí)間就是hi。相類似,si是軟中斷的cpu占用時(shí)間,軟中斷是由軟件的指令方式觸發(fā)的。
st: Steal time,虛擬機(jī)偷取時(shí)間。對(duì)虛擬機(jī)來說的,一臺(tái)物理是可以虛擬化出幾臺(tái)虛擬機(jī)的。在其中一臺(tái)虛擬機(jī)上用top查看發(fā)現(xiàn)st不為0,就說明本來有這么多個(gè)cpu時(shí)間是安排給這個(gè)虛擬機(jī)的,但是由于某種虛擬技術(shù),把這個(gè)cpu時(shí)間分配給了其他的虛擬機(jī)了。這就叫做偷取。

CPU占用率計(jì)算:

Linux CPU占用率計(jì)算,都是根據(jù)/proc/stat文件內(nèi)容計(jì)算而來。

# more /proc/statcpu 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 51508933575btime 1501052873processes 17604072procs_running 1procs_blocked 0
softirq 6714836597 0 2060074967 76941 1854616421 18 0 2 584892288 14211110 2200964850

CPU信息,cpu為總的信息,cpu0 ... cpun為各個(gè)具體CPU信息
cpu 23977676 8265 27737139 5387873754 2095720 404 650273 0 0
共有9個(gè)值(單位:ticks),分別為:
ticks就是系統(tǒng)時(shí)鐘中斷的時(shí)間間隔,該值與內(nèi)核中HZ值有關(guān),即ticks = 1/HZ。
HZ的值,就是每秒的時(shí)鐘中斷數(shù)量??梢杂^察/proc/interrupts中時(shí)鐘中斷值變化,來計(jì)算HZ的值。當(dāng)HZ的值為1000時(shí),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占用率計(jì)算公式
CPU時(shí)間=user+system+nice+idle+iowait+irq+softirq+Stl +guest
%us=(User time + Nice time)/CPU時(shí)間*100%
%sy=(System time + Hard Irq time +SoftIRQ time)/CPU時(shí)間*100%
%id=(Idle time)/CPU時(shí)間*100%
%ni=(Nice time)/CPU時(shí)間*100% %wa=(Waiting time)/CPU時(shí)間*100%
%hi=(Hard Irq time)/CPU時(shí)間*100%
%si=(SoftIRQ time)/CPU時(shí)間*100%
%st=(Steal time)/CPU時(shí)間*100%

CPU利用率總節(jié):

(1)Linux CPU占用率是根據(jù)/proc/stat文件中的數(shù)據(jù)計(jì)算而來;
(2)/proc/stat中的數(shù)據(jù)精度為ticks,即1/HZ秒;
(3)內(nèi)核每個(gè)ticks會(huì)更新一次CPU使用信息;
(4)CPU占用率的精度為1/HZ秒。


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: linux

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉