作壓力測試的時候,咱們常常會關注兩個指標,CPU利用率和CPU負載linux
Linux中,進程分爲三種狀態:性能
阻塞的進程blocked process測試
可運行的進程runnable processspa
正在運行的進程running process線程
當進程阻塞時,進程會等待I/O設備的數據或者系統調用。設計
進程處於可運行狀態時,它處在一個運行隊列中,與其餘可運行進程爭奪CPUblog
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秒鐘統計一次人數,並在第一、五、15分鐘的時候對統計狀況取平均值,從而造成第一、五、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分鐘的系統平均負載