Linux服務(wù)器性能分析之CPU利用率

2021-02-10    分類: 網(wǎng)站建設(shè)

1. 指標(biāo)范圍

1.1 User mode CPU utilization+ System mode CPU utilization

合理值:60-85%,如果在一個(gè)多用戶系統(tǒng)中us+sy時(shí)間超過85%,則進(jìn)程可能要花時(shí)間在運(yùn)行隊(duì)列中等待,響應(yīng)時(shí)間和業(yè)務(wù)吞吐量會(huì)受損害;us過大,說明有用戶進(jìn)程占用很多cpu時(shí)間,需要進(jìn)一步的分析其它軟硬件因素;sy過大,說明系統(tǒng)管理方面花了很多時(shí)間,說明該系統(tǒng)中某個(gè)子系統(tǒng)產(chǎn)生了瓶頸,需要進(jìn)一步分析其它軟硬件因素。

  1. %us =(User time + Nice time)/CPU時(shí)間*100%  
  2. %sy=(System time + Hardirq time +Softirq time)/ CPU時(shí)間*100%  
  3. %id=(Idle time)/CPU時(shí)間*100%  
  4. %ni=(Nice time)/CPU時(shí)間*100%  
  5. %wa=(Waiting time)/CPU時(shí)間*100%  
  6. %hi=(Hardirq time)/CPU時(shí)間*100%  
  7. %si=(Softirq time)/CPU時(shí)間*100%  
  8. %st=(Steal time)/CPU時(shí)間*100% 

備注: top 命令默認(rèn)情況下,是每 3 秒刷新一次。也可以通過 top -d <刷新時(shí)間間隔> 來指定刷新頻率,如top -d 0.1 或top -d 0.01 等。top 執(zhí)行時(shí),也可以按“s ”鍵,修改時(shí)間間隔。

2.2 使用vmstat查看

r表示運(yùn)行隊(duì)列的大小,b表示由于IO等待而的線程數(shù)量,in表示中斷的數(shù)量,cs表示上下文切換的數(shù)量。

2.3 其它查看方式

Iostat、sar -q、sar –u等

3. CPU介紹

3.1 內(nèi)核中的時(shí)間

HZ是系統(tǒng)時(shí)鐘在一秒內(nèi)固定發(fā)出時(shí)鐘中斷的次數(shù)。HZ在編譯內(nèi)核前是可以進(jìn)行配置的,因此通過下述命令就可以查看當(dāng)前系統(tǒng)的時(shí)鐘中斷頻率:cat /boot/config-`uname -r` | grep CONFIG_HZ

tick為系統(tǒng)時(shí)鐘每“滴答“一次的時(shí)間,其值為(1/HZ)秒。也就是連續(xù)兩次時(shí)鐘中斷之間的時(shí)間間隔。

jiffies用來計(jì)算自系統(tǒng)啟動(dòng)以來tick的次數(shù),也就是說系統(tǒng)時(shí)鐘每產(chǎn)生一次時(shí)鐘中斷,該變量的值就增加一次。

3.2 CPU時(shí)間組成

CPU的工作時(shí)間由三部分組成:用戶態(tài)時(shí)間、系統(tǒng)態(tài)時(shí)間和空閑態(tài)時(shí)間。具體的組成為:

CPU時(shí)間包含User time、System time、Nice time、Idle time、Waiting time、Hardirq time、Softirq time、Steal time

空閑態(tài)時(shí)間==idle time

用戶態(tài)時(shí)間==user time+ Nice time。

內(nèi)核態(tài)時(shí)間==system time+ Hardirq time+ Softirq time。

user time。指CPU在用戶態(tài)執(zhí)行進(jìn)程的時(shí)間。

system time。指CPU在內(nèi)核運(yùn)行的時(shí)間。

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

idle time。系統(tǒng)處于空閑期,等待進(jìn)程運(yùn)行。

waiting time。指CPU花費(fèi)在等待I/O操作上的總時(shí)間,與ed相似。

steal time。指當(dāng)前CPU被強(qiáng)制(involuntary wait )等待另外虛擬的CPU處理完畢時(shí)花費(fèi)的時(shí)間,此時(shí) hypervisor 在為另一個(gè)虛擬處理器服務(wù)。

Softirq time 、Hardirq time。分別對(duì)應(yīng)系統(tǒng)在處理軟硬中斷時(shí)候所花費(fèi)的CPU時(shí)間。

3.3 User mode CPU utilization

%usr。顯示了用戶方式下所花費(fèi)CPU時(shí)間的百分比,用戶使用CPU的進(jìn)程包括:cpu運(yùn)行常規(guī)用戶進(jìn)程,cpu運(yùn)行niced process,cpu運(yùn)行實(shí)時(shí)進(jìn)程。一個(gè)進(jìn)程可以在用戶方式下執(zhí)行,也可以在系統(tǒng)(內(nèi)核)方式下執(zhí)行,當(dāng)一個(gè)進(jìn)程在內(nèi)核代碼中運(yùn)行時(shí),我們稱其處于內(nèi)核態(tài);當(dāng)一個(gè)進(jìn)程正在執(zhí)行用戶自己的代碼時(shí),我們稱其處于用戶態(tài),在用戶方式下執(zhí)行時(shí),進(jìn)程在它自己的應(yīng)用代碼中執(zhí)行,不需要內(nèi)核資源來進(jìn)行計(jì)算、管理內(nèi)存或設(shè)置變量

3.4 System mode CPU utilization

顯示了系統(tǒng)方式下所花費(fèi)cpu時(shí)間的百分比,包括內(nèi)核進(jìn)程(kprocs)和其他需要訪問內(nèi)核資源的進(jìn)程所消耗的cpu資源,系統(tǒng)使用cpu的進(jìn)程包括:用于系統(tǒng)調(diào)用,用于I/O管理(中斷和驅(qū)動(dòng)),用于內(nèi)存管理(paging and swapping),用于進(jìn)程管理(context switch and process start),如果一個(gè)進(jìn)程需要內(nèi)核資源,它必須執(zhí)行一個(gè)系統(tǒng)調(diào)用,并由此切換到系統(tǒng)方式從而使該資源可用。

3.5 %wa(wait)

顯示了暫掛本地磁盤I/O和NFS加載的磁盤的cpu空閑百分比,是由于進(jìn)程等待I/O而使cpu處于空閑狀態(tài)的比率,I/O主要包括: I/O,raw I/O,VM-paging/swapins。如果在wait運(yùn)行時(shí)至少有一個(gè)未完成的磁盤I/O,該事件就歸為I/O等待時(shí)間,對(duì)磁盤的I/O請(qǐng)求會(huì)導(dǎo)致調(diào)用的進(jìn)程阻塞(或睡眠),直到請(qǐng)求完成為止,一旦進(jìn)程的I/O請(qǐng)求完成,該進(jìn)程就放入運(yùn)行隊(duì)列中。如果I/O很快完成,該進(jìn)程可以使用更多的cpu時(shí)間。

3.6 %id(idle)

除了上面的WIO以外的空閑情況,顯示了沒有本地I/O時(shí)cpu空閑或等待的時(shí)間百分比。如果沒有線程可以執(zhí)行(運(yùn)行隊(duì)列為空),系統(tǒng)分派一個(gè)叫做wait的線程,可稱為idle kproc。如果ps報(bào)告顯示這個(gè)線程的總計(jì)時(shí)間較高,這表明存在時(shí)間段,其中沒有其它線程準(zhǔn)備在cpu上運(yùn)行或等待執(zhí)行。系統(tǒng)因此大部分時(shí)間空閑或等待新任務(wù)。

3.7 r(runq-sz)

運(yùn)行進(jìn)程隊(duì)列的長度。對(duì)于可運(yùn)行狀態(tài)的進(jìn)程個(gè)數(shù)的大小,這些進(jìn)程在內(nèi)存中準(zhǔn)備就緒

4. 概念介紹

4.1 用戶模式+內(nèi)核模式

一般說來,一個(gè)進(jìn)程在CPU上運(yùn)行可以有兩種運(yùn)行模式,既可在用戶模式下運(yùn)行,又可在內(nèi)核模式下運(yùn)行(即進(jìn)程分別工作在用戶態(tài)和內(nèi)核態(tài),在內(nèi)核態(tài)工作仍舊是這個(gè)進(jìn)程,除非進(jìn)行了進(jìn)程的切換)。通常操作系統(tǒng)把虛擬地址空間劃分為用戶空間和內(nèi)核空間,例如x86平臺(tái)的Linux系統(tǒng)虛擬地址空間是0x00000000~0xffffffff,前3GB(0x00000000~0xbfffffff)是用戶空間,后1GB(0xc0000000~0xffffffff)是內(nèi)核空間。用戶加載到用戶空間,在用戶模式下執(zhí)行,不能訪問內(nèi)核中的數(shù)據(jù),也不能跳轉(zhuǎn)到內(nèi)核代碼中執(zhí)行。這樣可以保護(hù)內(nèi)核,如果一個(gè)進(jìn)程訪問了非法地址,頂多這一個(gè)進(jìn)程崩潰,而不會(huì)影響到內(nèi)核和整個(gè)系統(tǒng)的穩(wěn)定性。

Cpu在產(chǎn)生中斷或異常時(shí)不僅會(huì)跳轉(zhuǎn)到中斷或異常服務(wù)城西,還會(huì)自動(dòng)切換模式,從用戶模式切換到特權(quán)模式,因此從中斷或異常程序可以跳轉(zhuǎn)到內(nèi)核代碼中執(zhí)行。事實(shí)上,整個(gè)內(nèi)核就是由各種中斷和異常處理程序組成的。即,正常情況下處理器在用戶模式執(zhí)行用戶程序,在中斷或異常情況下處理器切換到特權(quán)模式執(zhí)行內(nèi)核程序,處理完中斷或異常之后再返回用戶模式繼續(xù)執(zhí)行用戶程序,例如,用戶進(jìn)程A調(diào)用了內(nèi)核系統(tǒng)調(diào)用來獲取當(dāng)前的時(shí)鐘滴答數(shù),在執(zhí)行用戶進(jìn)程A中的系統(tǒng)調(diào)用指令時(shí)會(huì)保存當(dāng)前用戶進(jìn)程的IP,CS等當(dāng)前狀態(tài),然后再跳轉(zhuǎn)到內(nèi)核空間(即內(nèi)核代碼區(qū)域)去執(zhí)行像應(yīng)的系統(tǒng)調(diào)用函數(shù),獲取當(dāng)前的時(shí)鐘滴答數(shù)。執(zhí)行完后再通過IRET指令返回到進(jìn)程A中(就是將進(jìn)入時(shí)保存的信息再復(fù)位到相應(yīng)的寄存器中),再接著從CS:EIP地址開始執(zhí)行A進(jìn)程的指令。

進(jìn)程在創(chuàng)建的時(shí)候除了創(chuàng)建進(jìn)程的控制塊之外,在內(nèi)核里還創(chuàng)建了進(jìn)程的內(nèi)核棧,進(jìn)程通過系統(tǒng)調(diào)用(例如fopen()或者open())進(jìn)入內(nèi)核后,此時(shí)處理器處于特權(quán)級(jí)高的(0級(jí))內(nèi)核代碼中執(zhí)行,當(dāng)進(jìn)程處于內(nèi)核態(tài)時(shí),執(zhí)行的內(nèi)核代碼會(huì)使用當(dāng)前進(jìn)程的內(nèi)核棧,是指向在進(jìn)程的上下文上的,

內(nèi)核模式的權(quán)限高于用戶模式的權(quán)限。

用戶級(jí)。系統(tǒng)用戶可以與進(jìn)行交互操作,如運(yùn)行應(yīng)用和系統(tǒng)命令,用戶級(jí)通過系統(tǒng)調(diào)用接口訪問內(nèi)核級(jí);內(nèi)核級(jí)。操作系統(tǒng)自動(dòng)運(yùn)行一些功能,它們主要對(duì)硬件進(jìn)行操作

4.2 進(jìn)程調(diào)度

任何進(jìn)程要想占有CPU,從而真正處于執(zhí)行狀態(tài),就必須經(jīng)由進(jìn)程調(diào)度。進(jìn)程調(diào)度機(jī)制主要涉及到調(diào)度方式、調(diào)度時(shí)機(jī)和調(diào)度策略。

1. 調(diào)度方式

Linux內(nèi)核的調(diào)度方式基本上采用“搶占式優(yōu)先級(jí)”方式,即當(dāng)進(jìn)程在用戶模式下運(yùn)行時(shí),不管是否自愿,在一定條件下(如時(shí)間片用完或等待I/O),核心就可以暫時(shí)剝奪其運(yùn)行而調(diào)度其它進(jìn)程進(jìn)入運(yùn)行。但是,一旦進(jìn)程切換到內(nèi)核模式下運(yùn)行,就不受以上限制而一直運(yùn)行下去,直至又回到用戶模式之前才會(huì)發(fā)生進(jìn)程調(diào)度。

Linux系統(tǒng)中的調(diào)度策略基本上繼承了Unix的以優(yōu)先級(jí)為基礎(chǔ)的調(diào)度。就是說,核心為系統(tǒng)中每個(gè)進(jìn)程計(jì)算出一個(gè)優(yōu)先權(quán),該優(yōu)先權(quán)反映了一個(gè)進(jìn)程獲得CPU使用權(quán)的資格,即高優(yōu)先權(quán)的進(jìn)程優(yōu)先得到運(yùn)行。核心從進(jìn)程就緒隊(duì)列中挑選一個(gè)優(yōu)先權(quán)高的進(jìn)程,為其分配一個(gè)CPU時(shí)間片,令其投入運(yùn)行。在運(yùn)行過程中,當(dāng)前進(jìn)程的優(yōu)先權(quán)隨時(shí)間遞減,這樣就實(shí)現(xiàn)了“負(fù)反饋”作用:經(jīng)過一段時(shí)間之后,原來級(jí)別較低的進(jìn)程就相對(duì)“提升”了級(jí)別,從而有機(jī)會(huì)得到運(yùn)行。當(dāng)所有進(jìn)程的優(yōu)先權(quán)都變?yōu)?時(shí),就重新計(jì)算一次所有進(jìn)程的優(yōu)先權(quán)。

2. 調(diào)度策略

Linux系統(tǒng)針對(duì)不同類別的進(jìn)程提供了三種不同的調(diào)度策略,即SCHED_FIFO、SCHED_RR及SCHED_OTHER。

SCHED_FIFO適合于實(shí)時(shí)進(jìn)程,它們對(duì)時(shí)間性要求比較強(qiáng),而每次運(yùn)行所需的時(shí)間比較短,一旦這種進(jìn)程被調(diào)度開始運(yùn)行后,就要一直運(yùn)行到自愿讓出CPU,或者被優(yōu)先權(quán)更高的進(jìn)程搶占其執(zhí)行權(quán)為止。

SCHED_RR對(duì)應(yīng)“時(shí)間片輪轉(zhuǎn)法”,適合于每次運(yùn)行需要較長時(shí)間的實(shí)時(shí)進(jìn)程。一個(gè)運(yùn)行進(jìn)程分配一個(gè)時(shí)間片(如200毫秒),當(dāng)時(shí)間片用完后,CPU被另外進(jìn)程搶占,而該進(jìn)程被送回相同優(yōu)先級(jí)隊(duì)列的末尾。SCHED_OTHER是傳統(tǒng)的Unix調(diào)度策略,適合于交互式的分時(shí)進(jìn)程。這類進(jìn)程的優(yōu)先權(quán)取決于兩個(gè)因素,一個(gè)因素是進(jìn)程剩余時(shí)間配額,如果進(jìn)程用完了配給的時(shí)間,則相應(yīng)優(yōu)先權(quán)為0;另一個(gè)是進(jìn)程的優(yōu)先數(shù)nice,這是從Unix系統(tǒng)沿襲下來的方法,優(yōu)先數(shù)越小,其優(yōu)先級(jí)越高。

nice的取值范圍是19-20。用戶可以利用nice命令設(shè)定進(jìn)程的nice值。但一般用戶只能設(shè)定正值,從而主動(dòng)降低其優(yōu)先級(jí);只有特權(quán)用戶才能把nice的值置為負(fù)數(shù)。進(jìn)程的優(yōu)先權(quán)就是以上二者之和。核心動(dòng)態(tài)調(diào)整用戶態(tài)進(jìn)程的優(yōu)先級(jí)。這樣,一個(gè)進(jìn)程從創(chuàng)建到完成任務(wù)后終止,需要經(jīng)歷多次反饋循環(huán)。當(dāng)進(jìn)程再次被調(diào)度運(yùn)行時(shí),它就從上次斷點(diǎn)處開始繼續(xù)執(zhí)行。對(duì)于實(shí)時(shí)進(jìn)程,其優(yōu)先權(quán)的值是(1000+設(shè)定的正值),因此,至少是1000。所以,實(shí)時(shí)進(jìn)程的優(yōu)先權(quán)高于其它類型進(jìn)程的優(yōu)先權(quán)。另外,時(shí)間配額及nice值與實(shí)時(shí)進(jìn)程的優(yōu)先權(quán)無關(guān)。如果系統(tǒng)中有實(shí)時(shí)進(jìn)程處于就緒狀態(tài),則非實(shí)時(shí)進(jìn)程就不能被調(diào)度運(yùn)行,直至所有實(shí)時(shí)進(jìn)程都完成了,非實(shí)時(shí)進(jìn)程才有機(jī)會(huì)占用CPU。

后臺(tái)命令(在命令末尾有&符號(hào),如gcc f1.c& )對(duì)應(yīng)后臺(tái)進(jìn)程(又稱后臺(tái)作業(yè)),后臺(tái)進(jìn)程的優(yōu)先級(jí)低于任何交互(前臺(tái))進(jìn)程的優(yōu)先級(jí)。所以,只有當(dāng)系統(tǒng)中當(dāng)前不存在可運(yùn)行的交互進(jìn)程時(shí),才調(diào)度后臺(tái)進(jìn)程運(yùn)行。后臺(tái)進(jìn)程往往按批處理方式調(diào)度運(yùn)行。

3. 調(diào)度時(shí)機(jī)

核心進(jìn)行進(jìn)程調(diào)度的時(shí)機(jī)有以下幾種情況:

(1)當(dāng)前進(jìn)程調(diào)用系統(tǒng)調(diào)用nanosleep( )或pause( )使自己進(jìn)入睡眠狀態(tài),主動(dòng)讓出一段時(shí)間的CPU使用權(quán);

(2)進(jìn)程終止,永久地放棄對(duì)CPU的使用;

(3)在時(shí)鐘中斷處理程序執(zhí)行過程中,發(fā)現(xiàn)當(dāng)前進(jìn)程連續(xù)運(yùn)行的時(shí)間過長;

(4)當(dāng)喚醒一個(gè)睡眠進(jìn)程時(shí),發(fā)現(xiàn)被喚醒的進(jìn)程比當(dāng)前進(jìn)程更有資格運(yùn)行;

(5)一個(gè)進(jìn)程通過執(zhí)行系統(tǒng)調(diào)用來改變調(diào)度策略或降低自身的優(yōu)先權(quán)(如nice命令),從而引起立即調(diào)度。

4. 調(diào)度算法

進(jìn)程調(diào)度的算法應(yīng)該比較簡(jiǎn)單,以便減少頻繁調(diào)度時(shí)的系統(tǒng)開銷。Linux執(zhí)行進(jìn)程調(diào)度時(shí),首先查找所有在就緒隊(duì)列中的進(jìn)程,從中選出優(yōu)先級(jí)高且在內(nèi)存的一個(gè)進(jìn)程。如果隊(duì)列中有實(shí)時(shí)進(jìn)程,那么實(shí)時(shí)進(jìn)程將優(yōu)先運(yùn)行。如果最需要運(yùn)行的進(jìn)程不是當(dāng)前進(jìn)程,那么當(dāng)前進(jìn)程就被掛起,并且保存它的現(xiàn)場(chǎng)所涉及的一切機(jī)器狀態(tài),包括計(jì)數(shù)器和CPU寄存器等,然后為選中的進(jìn)程恢復(fù)運(yùn)行現(xiàn)場(chǎng)。

4.3 用戶級(jí)線程與內(nèi)核級(jí)線程

在許多類Unix系統(tǒng)中,如Linux、FreeBSD、Solaris等,進(jìn)程一直都是操作系統(tǒng)內(nèi)核調(diào)用的最小單位,也都采用多進(jìn)程模型。后來引入了線程概念,有以下兩種概念的線程:

用戶級(jí)線程(User-Level Thread,ULT)。由應(yīng)用進(jìn)程利用線程庫創(chuàng)建和管理,不在內(nèi)核中實(shí)現(xiàn)線程,只在用戶態(tài)中模擬出多線程,不依賴于核心,操作系統(tǒng)內(nèi)核完全不知道多線程的存在。

內(nèi)核線線程(Kernel-Level Thread,KLT),又稱為內(nèi)核支持的線程或輕量級(jí)進(jìn)程。是在核心空間實(shí)現(xiàn)的,內(nèi)核為每個(gè)線程在核心空間中設(shè)置了一個(gè)線程控制塊,用來登記該線程的線程標(biāo)識(shí)符、值、狀態(tài)、優(yōu)先級(jí)等信息,所有對(duì)線程的操作,如創(chuàng)建、撤銷和切換都是通過系統(tǒng)功能調(diào)用由內(nèi)核中的相應(yīng)處理完成,內(nèi)核維護(hù)進(jìn)程及線程的上下文切換以及線程切換,類系統(tǒng)中一般通過修改進(jìn)程的實(shí)現(xiàn)方式來實(shí)現(xiàn),可以使用不完全的進(jìn)程創(chuàng)建方式創(chuàng)建共享數(shù)據(jù)空間的進(jìn)程,在 Linux下這種系統(tǒng)調(diào)用為clone(),而在FreeBSD下它為rfork()。

5. 常見誤區(qū)

5.1 Cpu利用率很高就是cpu資源不夠

出現(xiàn)cpu計(jì)數(shù)器不在范圍時(shí),不一定是由于cpu資源不夠,因?yàn)槠渌Y源的也會(huì)引起,例如內(nèi)存不夠時(shí),cpu會(huì)忙內(nèi)存管理的事,表面上可能是cpu的利用為100%

本文標(biāo)題:Linux服務(wù)器性能分析之CPU利用率
本文鏈接:http://www.bm7419.com/news/100157.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、企業(yè)建站、商城網(wǎng)站電子商務(wù)、全網(wǎng)營銷推廣標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)