性能分析Linux服務器CPU利用率

CPU度量php

1.  指標範圍

1.1  User mode CPU utilization+ System mode CPU utilization

合理值:60-85%,若是在一個多用戶系統中us+sy時間超過85%,則進程可能要花時間在運行隊列中等待,響應時間和業務吞吐量會受損害;us過大,說明有用戶進程佔用不少cpu時間,須要進一步的分析其它軟硬件因素;sy過大,說明系統管理方面花了不少時間,說明該系統中某個子系統產生了瓶頸,須要進一步分析其它軟硬件因素。html

1.2  Wa(wait)

參考值:小於25%,超過25%的wa的值能夠表示磁盤子系統可能沒有被正確平衡,也多是磁盤密集工做負載的結果,系統的磁盤或其它I/o可能有問題,能夠經過iostat/SAR –C命令進一步分解分析linux

1.3  Id(idle)

參考值:大於40,若是r常常大於4,且id常常小於40,表示cpu的負荷很重ios

1.4  r

參考值:小於4,隊列大於4時,代表系統的cpu或內存可能有問題,若是r常常大於4,且id常常少於40,表示cpu的負荷很重。當隊列變長時,隊列中進程在等待cpu調度執行時所花的時間會變長算法

1.5  判斷cpu瓶頸的方法

很慢的響應時間(slow response time)api

Cpu的空閒時間爲零(zero percent idle cpu)服務器

太高的用戶佔用cpu時間(high percent user cpu)多線程

太高的系統佔用cpu時間(high percent system cpu)app

長時間的有很長的運行進程隊列(large run queue size sustained over time)函數

2.  如何查看cpu利用率

2.1  使用top命令查看

數據來自/proc/stat文件

 bubuko.com,布布扣

%us =(User time + Nice time)/CPU時間*100%

%sy=(System time + Hardirq time +Softirq time)/ CPU時間*100%

%id=(Idle time)/CPU時間*100%

%ni=(Nice time)/CPU時間*100%

%wa=(Waiting time)/CPU時間*100%

%hi=(Hardirq time)/CPU時間*100%

%si=(Softirq time)/CPU時間*100%

%st=(Steal time)/CPU時間*100%

備註: top 命令默認狀況下,是每 3 秒刷新一次。也能夠經過 top  -d <刷新時間間隔> 來指定刷新頻率,如top -d 0.1 或top -d 0.01 等。top 執行時,也能夠按「s 」鍵,修改時間間隔。 

 

2.2  使用vmstat查看

 bubuko.com,布布扣

r表示運行隊列的大小,b表示因爲IO等待而block的線程數量,in表示中斷的數量,cs表示上下文切換的數量。

2.3  其它查看方式

Iostat、sar  -q、sar –u等

3.  CPU介紹

3.1  內核中的時間

HZ是系統時鐘在一秒內固定發出時鐘中斷的次數。HZ在編譯內核前是能夠進行配置的,所以經過下述命令就能夠查看當前系統的時鐘中斷頻率:cat /boot/config-`uname -r` | grep CONFIG_HZ

tick爲系統時鐘每「滴答「一次的時間,其值爲(1/HZ)秒。也就是連續兩次時鐘中斷之間的時間間隔。

jiffies用來計算自系統啓動以來tick的次數,也就是說系統時鐘每產生一次時鐘中斷,該變量的值就增長一次。

3.2  CPU時間組成

CPU的工做時間由三部分組成:用戶態時間、系統態時間和空閒態時間。具體的組成爲:

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

空閒態時間==idle time

用戶態時間==user time+ Nice time。

內核態時間==system time+ Hardirq time+ Softirq time。

user time。指CPU在用戶態執行進程的時間。

system time。指CPU在內核運行的時間。

nice time。指系統花費在調整進程優先級上的時間。

idle time。系統處於空閒期,等待進程運行。

waiting time。指CPU花費在等待I/O操做上的總時間,與blocked類似。

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

Softirq time 、Hardirq time。分別對應系統在處理軟硬中斷時候所花費的CPU時間。

 

3.3  User mode CPU utilization

%usr。顯示了用戶方式下所花費CPU時間的百分比,用戶使用CPU的進程包括:cpu運行常規用戶進程,cpu運行niced process,cpu運行實時進程。一個linux進程能夠在用戶方式下執行,也能夠在系統(內核)方式下執行,當一個進程在內核代碼中運行時,咱們稱其處於內核態;當一個進程正在執行用戶本身的代碼時,咱們稱其處於用戶態,在用戶方式下執行時,進程在它本身的應用程序代碼中執行,不須要內核資源來進行計算、管理內存或設置變量

3.4  System mode CPU utilization

顯示了系統方式下所花費cpu時間的百分比,包括內核進程(kprocs)和其餘須要訪問內核資源的進程所消耗的cpu資源,系統使用cpu的進程包括:用於系統調用,用於I/O管理(中斷和驅動),用於內存管理(paging and swapping),用於進程管理(context switch and process start),若是一個進程須要內核資源,它必須執行一個系統調用,並由此切換到系統方式從而使該資源可用。

3.5  %wa(wait)

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

3.6  %id(idle)

除了上面的WIO之外的空閒狀況,顯示了沒有本地磁盤I/O時cpu空閒或等待的時間百分比。若是沒有線程能夠執行(運行隊列爲空),系統分派一個叫作wait的線程,可稱爲idle kproc。若是ps報告顯示這個線程的總計時間較高,這代表存在時間段,其中沒有其它線程準備在cpu上運行或等待執行。系統所以大部分時間空閒或等待新任務。

3.7  r(runq-sz)

運行進程隊列的長度。對於可運行狀態的進程個數的大小,這些進程在內存中準備就緒

4.  概念介紹

4.1  用戶模式+內核模式

通常說來,一個進程在CPU上運行能夠有兩種運行模式,既可在用戶模式下運行,又可在內核模式下運行(即進程分別工做在用戶態和內核態,在內核態工做仍舊是這個進程,除非進行了進程的切換)。一般操做系統把虛擬地址空間劃分爲用戶空間和內核空間,例如x86平臺的Linux系統虛擬地址空間是0x00000000~0xffffffff,前3GB(0x00000000~0xbfffffff)是用戶空間,後1GB(0xc0000000~0xffffffff)是內核空間。用戶程序加載到用戶空間,在用戶模式下執行,不能訪問內核中的數據,也不能跳轉到內核代碼中執行。這樣能夠保護內核,若是一個進程訪問了非法地址,頂多這一個進程崩潰,而不會影響到內核和整個系統的穩定性。Cpu在產生中斷或異常時不只會跳轉到中斷或異常服務城西,還會自動切換模式,從用戶模式切換到特權模式,所以從中斷或異常服務器程序能夠跳轉到內核代碼中執行。事實上,整個內核就是由各類中斷和異常處理程序組成的。即,正常狀況下處理器在用戶模式執行用戶程序,在中斷或異常狀況下處理器切換到特權模式執行內核程序,處理完中斷或異常以後再返回用戶模式繼續執行用戶程序,例如,用戶進程A調用了內核系統調用來獲取當前的時鐘滴答數,在執行用戶進程A中的系統調用指令時會保存當前用戶進程的IP,CS等當前寄存器狀態,而後再跳轉到內核空間(即內核代碼區域)去執行像應的系統調用函數,獲取當前的時鐘滴答數。執行完後再經過IRET指令返回到進程A中(就是將進入時保存的信息再復位到相應的寄存器中),再接着從CS:EIP地址開始執行A進程的指令

進程在建立的時候除了建立進程的控制塊以外,在內核裏還建立了進程的內核棧,進程經過系統調用(例如fopen()或者open())進入內核後,此時處理器處於特權級最高的(0級)內核代碼中執行,當進程處於內核態時,執行的內核代碼會使用當前進程的內核棧,是指向在進程的上下文上的,

內核模式的權限高於用戶模式的權限。

用戶級。系統用戶能夠與操做系統進行交互操做,如運行應用和系統命令,用戶級經過系統調用接口訪問內核級;內核級。操做系統自動運行一些功能,它們主要對硬件進行操做

 

4.2  進程調度

任何進程要想佔有CPU,從而真正處於執行狀態,就必須經由進程調度。進程調度機制主要涉及到調度方式、調度時機和調度策略。

1. 調度方式

Linux內核的調度方式基本上採用「搶佔式優先級」方式,即當進程在用戶模式下運行時,不論是否自願,在必定條件下(如時間片用完或等待I/O),核心就能夠暫時剝奪其運行而調度其它進程進入運行。可是,一旦進程切換到內核模式下運行,就不受以上限制而一直運行下去,直至又回到用戶模式以前纔會發生進程調度。

Linux系統中的調度策略基本上繼承了Unix的以優先級爲基礎的調度。就是說,核心爲系統中每一個進程計算出一個優先權,該優先權反映了一個進程得到CPU使用權的資格,即高優先權的進程優先獲得運行。核心從進程就緒隊列中挑選一個優先權最高的進程,爲其分配一個CPU時間片,令其投入運行。在運行過程當中,當前進程的優先權隨時間遞減,這樣就實現了「負反饋」做用:通過一段時間以後,原來級別較低的進程就相對「提高」了級別,從而有機會獲得運行。當全部進程的優先權都變爲0時,就從新計算一次全部進程的優先權。

2. 調度策略

Linux系統針對不一樣類別的進程提供了三種不一樣的調度策略,即SCHED_FIFO、SCHED_RR及SCHED_OTHER。

SCHED_FIFO適合於實時進程,它們對時間性要求比較強,而每次運行所需的時間比較短,一旦這種進程被調度開始運行後,就要一直運行到自願讓出CPU,或者被優先權更高的進程搶佔其執行權爲止。

SCHED_RR對應「時間片輪轉法」,適合於每次運行須要較長時間的實時進程。一個運行進程分配一個時間片(如200毫秒),當時間片用完後,CPU被另外進程搶佔,而該進程被送回相同優先級隊列的末尾。SCHED_OTHER是傳統的Unix調度策略,適合於交互式的分時進程。這類進程的優先權取決於兩個因素,一個因素是進程剩餘時間配額,若是進程用完了配給的時間,則相應優先權爲0;另外一個是進程的優先數nice,這是從Unix系統沿襲下來的方法,優先數越小,其優先級越高。

nice的取值範圍是19-20。用戶能夠利用nice命令設定進程的nice值。但通常用戶只能設定正值,從而主動下降其優先級;只有特權用戶才能把nice的值置爲負數。進程的優先權就是以上兩者之和。核心動態調整用戶態進程的優先級。這樣,一個進程從建立到完成任務後終止,須要經歷屢次反饋循環。當進程再次被調度運行時,它就從上次斷點處開始繼續執行。對於實時進程,其優先權的值是(1000+設定的正值),所以,至少是1000。因此,實時進程的優先權高於其它類型進程的優先權。另外,時間配額及nice值與實時進程的優先權無關。若是系統中有實時進程處於就緒狀態,則非實時進程就不能被調度運行,直至全部實時進程都完成了,非實時進程纔有機會佔用CPU。

後臺命令(在命令末尾有&符號,如gcc f1.c& )對應後臺進程(又稱後臺做業),後臺進程的優先級低於任何交互(前臺)進程的優先級。因此,只有當系統中當前不存在可運行的交互進程時,才調度後臺進程運行。後臺進程每每按批處理方式調度運行。

3. 調度時機

核心進行進程調度的時機有如下幾種狀況:

(1)當前進程調用系統調用nanosleep( )或pause( )使本身進入睡眠狀態,主動讓出一段時間的CPU使用權;

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

(3)在時鐘中斷處理程序執行過程當中,發現當前進程連續運行的時間過長;

(4)當喚醒一個睡眠進程時,發現被喚醒的進程比當前進程更有資格運行;

(5)一個進程經過執行系統調用來改變調度策略或下降自身的優先權(如nice命令),從而引發當即調度。

4. 調度算法

進程調度的算法應該比較簡單,以便減小頻繁調度時的系統開銷。Linux執行進程調度時,首先查找全部在就緒隊列中的進程,從中選出優先級最高且在內存的一個進程。若是隊列中有實時進程,那麼實時進程將優先運行。若是最須要運行的進程不是當前進程,那麼當前進程就被掛起,而且保存它的現場所涉及的一切機器狀態,包括程序計數器和CPU寄存器等,而後爲選中的進程恢復運行現場。

 

4.3  用戶級線程與內核級線程

在許多類Unix系統中,如Linux、FreeBSD、Solaris等,進程一直都是操做系統內核調用的最小單位,程序開發也都採用多進程模型。後來引入了線程概念,有如下兩種概念的線程:

用戶級線程(User-Level Thread,ULT)。由應用進程利用線程庫建立和管理,不在內核中實現線程,只在用戶態中模擬出多線程,不依賴於操做系統核心,操做系統內核徹底不知道多線程的存在。

內核線線程(Kernel-Level Thread,KLT),又稱爲內核支持的線程或輕量級進程。是在覈心空間實現的,內核爲每一個線程在覈心空間中設置了一個線程控制塊,用來登記該線程的線程標識符、寄存器值、狀態、優先級等信息,全部對線程的操做,如建立、撤銷和切換都是經過系統功能調用由內核中的相應處理程序完成,內核維護進程及線程的上下文切換以及線程切換,類unix系統中通常經過修改進程的實現方式來實現,可使用不徹底的進程建立方式建立共享數據空間的進程,在 Linux下這種系統調用爲clone(),而在FreeBSD下它爲rfork()。

 

5.  常見誤區

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

出現cpu計數器不在範圍時,不必定是因爲cpu資源不夠,由於其餘資源的也會引發,例如內存不夠時,cpu會忙內存管理的事,表面上多是cpu的利用爲100%

相關文章
相關標籤/搜索