天天看點

[轉載]性能測試-cpu負載和cpu使用率

概述

做壓力測試的時候,我們經常會關注兩個名額,CPU使用率和CPU負載

  Linux中,程序分為三種狀态:

  •   阻塞的程序blocked process
  •   可運作的程序runnable process
  •   正在運作的程序running process

  當程序阻塞時,程序會等待I/O裝置的資料或者系統調用。

  程序處于可運作狀态時,它處在一個運作隊列中,與其他可運作程序争奪CPU

CPU使用率

CPU使用率指的是程式在運作期間實時占用的CPU百分比,這是對一個時間段内CPU使用狀況的統計。

通過這個名額可以看出在某一個時間段内CPU被占用的情況

CPU負載(load) 

  它指的是正在運作(running)和準備運作(runnable)的程序的總數,也就是是等待處理的任務隊列

load-average 

  它指的就是特定時間内運作隊列中(在CPU上運作或者等待運作)的平均程序數。

  在linux top指令中指的是是最近1分鐘、5分鐘和15分鐘的系統平均負載

  如果一個程序滿足以下條件,則其就會位于運作隊列中

  - 它沒有在等待I/O操作的結果

  - 它沒有主動進入等待狀态(也就是沒有調用wait)

  - 沒有被停止

cpu負載的計算

  CPU數量和CPU核心數都會影響到CPU負載,因為任務最終是要配置設定到CPU核心去處理的。

  兩塊CPU要比一塊CPU好,雙核要比單核好。是以,除去CPU性能上的差異,CPU負載是基于核心數來計算的。

“有多少核心,就有多少load”。如單核負載為1.00,雙核負載為2.00.以此類推。

舉例說明cpu負載

大家都要坐電梯坐電梯。假設一部電梯能站10個人,那當1-10人坐電梯時,可以認為電梯的load<1; 正好10人時,load=1; 超過10人時,load>1; 如果有15個人要坐電梯,那就是說能有10人直接上過山車,另外5人需要等待。 此時電梯的load=15/10 = 1.5 也就是說,1.5的負載表示系統目前滿負荷運轉,且還有相當于50%滿負荷的請求在等待

對于load average的臨界值,業内有兩種判斷依據

load average <= cpu核數 * 0.7

load average <= cpu核數 - 1

為什麼會有高Load,低CPU使用率的情況?

  依然拿電梯的例子來說明。假設一共有20個人來坐電梯。電梯一次運作5分鐘。兩次運作之間,第一批10人下來,第二批10人來,電梯等人進來,加上關門時間時間也要3分鐘。這種情況下電梯的使用率就是50%左右。而過山車的load是2。對應到我們的CPU上,當運作的程序(線程)過多時,頻繁的上下文切換耗費了大量的CPU時間,導緻真正用在運算的CPU時間片比較少(低CPU使用率),卻有很多程序在等待運作(高Load)。 

Cpu 使用率和 load 值高低沒有直必然關系

  我們做壓測的時候一般認為 CPU 使用率和 Load 值是正比的關系,既Load 值越高,CPU 使用率就越高。

但是事實上有時候 Load 很高,CPU 使用率卻比較低(多核更可能出現配置設定不均的情況)。

  因為 Load 是等待處理的任務隊列,當你的應用在等待同步消息傳回處理的同時,CPU 還是會将時間切片配置設定給這些線程。

而真正需要 CPU 的那些線程,卻不得不在得不到時間片以後暫時放棄工作被挂起。

CPU使用率高也并不意味着負載就一定大,可能這個任務是一個CPU密集型的。CPU低使用率的情況下也會有高Load Average的情況。當CPU配置設定時間

片以後,是否使用完全取決于使用者,是以完全可能出現低使用率高Load Average的情況。

  是以在程式設計的時候要考慮如何利用好CPU的這個資源,如何均勻的将壓力分攤到各個CPU 上(有時候一個線程在不斷循環,導緻單個CPU負荷很高)

再舉例

  公共電話亭裡有一個人在打電話,後面有四個人在等待,每人限定使用電話一分鐘。若有人一分鐘之内沒有打完電話,隻能挂掉電話去排隊,等待下一

輪。公共電話在就相當于CPU,而正在打電話或等待打電話的人就相當于任務數。

  在電話亭使用過程中,肯定會有人打完電話走掉,有人沒有打完電話而選擇重新排隊,更會有新增的人在這兒排隊。人數的變化就相當于任務數的增減。

為了統計平均負載情況,我們5秒鐘統計一次人數,并在第1、5、15分鐘的時候對統計情況取平均值,進而形成第1、5、15分鐘的平均負載。

  有的人拿起電話就打,打滿1分鐘,有的人可能前三十秒在找号碼,或者猶豫要不要打,後三十秒才真正開始打。如果把電話看作CPU,人數看作任務,

我們可以說前一個人(任務)的CPU使用率高,後一個人(任務)的CPU使用率低。當然, CPU并不會在前三十秒工作,後三十秒歇着,它一直在處于load

狀态。

  有的程式涉及到大量的計算,是以CPU使用率就高,而有的程式牽涉到計算的部分很少,CPU使用率自然就低。但無論CPU的使用率是高是低,跟後面有多少任務在排隊沒有必然關系(cpu使用率和load沒有必然關系)。

在Linux系統中,可以通過指令看到系統平均負載load-average的輸出

uptime

[轉載]性能測試-cpu負載和cpu使用率

top

[轉載]性能測試-cpu負載和cpu使用率

saq -q

[轉載]性能測試-cpu負載和cpu使用率

runq-sz:運作隊列的長度(等待運作的程序數)

plist-sz:程序清單中程序(processes)和線程(threads)的數量

ldavg-1:最後1分鐘的系統平均負載(Systemload average)

ldavg-5:過去5分鐘的系統平均負載

ldavg-15:過去15分鐘的系統平均負載