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

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

1. 指標(biāo)范圍

1.1 User mode CPU utilization+ System mode CPU utilization

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

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

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

2.2 使用vmstat查看

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

2.3 其它查看方式

Iostat、sar -q、sar –u等

3. CPU介紹

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

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

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

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

3.2 CPU時間組成

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

CPU時間包含User time、System time、Nice time、Idle time、Waiting time、Hardirq time、Softirq time、Steal time

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

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

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

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

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

nice time。指系統(tǒng)花費在調(diào)整進程優(yōu)先級上的時間。

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

waiting time。指CPU花費在等待I/O操作上的總時間,與ed相似。

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

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

3.3 User mode CPU utilization

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

3.4 System mode CPU utilization

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

3.5 %wa(wait)

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

3.6 %id(idle)

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

3.7 r(runq-sz)

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

4. 概念介紹

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

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

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

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

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

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

4.2 進程調(diào)度

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

1. 調(diào)度方式

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

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

2. 調(diào)度策略

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

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

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

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

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

3. 調(diào)度時機

核心進行進程調(diào)度的時機有以下幾種情況:

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

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

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

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

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

4. 調(diào)度算法

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

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

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

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

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

5. 常見誤區(qū)

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

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

分享題目:Linux服務(wù)器性能分析之CPU利用率
標(biāo)題URL:http://www.bm7419.com/news7/100157.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、搜索引擎優(yōu)化、品牌網(wǎng)站設(shè)計、品牌網(wǎng)站制作、定制開發(fā)網(wǎng)站內(nèi)鏈

廣告

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

成都網(wǎng)站建設(shè)公司