概述
做壓力測試的時候,我們經常會關注兩個名額,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

top
saq -q
runq-sz:運作隊列的長度(等待運作的程序數)
plist-sz:程序清單中程序(processes)和線程(threads)的數量
ldavg-1:最後1分鐘的系統平均負載(Systemload average)
ldavg-5:過去5分鐘的系統平均負載
ldavg-15:過去15分鐘的系統平均負載