性能測試--cpu使用率和cpu負載區別


1、cpu使用率

CPU使用率指的是程序在運行期間實時占用的CPU百分比,這是對一個時間段內CPU使用狀況的統計。通過這個指標可以看出在某一個時間段內CPU被占用的情況。

2、cpu負載

2.1 load-average 

Linux操作系統能夠同時處理幾個不同名稱的任務。但是同時運行多個任務的過程中,cpu和磁盤這些有限的硬件資源就需要被這些任務程序共享。即便很短的時間間隔內,需要一邊在這些任務之間進行切換到一邊進行處理,這就是多任務。

運行中的任務較少的情況下,系統並不是等待此類切換動作的發生。但是當任務增加時,例如任務A正在CPU上執行計算,接下來如果任務B和C也想進行計算,那么就需要等待CPU空閑。也就是說,即便是運行處理某任務,也要等到輪到他時才能運行,此類等待狀態就表現為程序運行延遲。

uptime輸出中包含“load average”的數字,Load average從左邊起依次是過去1分鍾、5分鍾、15分鍾內,單位時間的等待任務數,也就是表示平均有多少任務正處於等待狀態。在load average較高的情況下,這就說明等待運行的任務較多,因此輪到該任務運行的等待時間就會出現較大的延遲,即反映了此時負載較高。

假設一部電梯能站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

 

Linux命令查看系統平均負載load-average的輸出

uptime

top

 saq -q

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

plist-sz:進程列表中進程(processes)和線程(threads)的數量

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

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

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

2.2 cpu負載的計算

CPU數量和CPU內核數都會影響到CPU負載,因為任務最終是要分配到CPU核心去處理的。兩塊CPU要比一塊CPU好,雙核要比單核好。因此,除去CPU性能上的差異,CPU負載是基於內核數來計算的。“有多少內核,就有多少load”。如單核負載為1.00,雙核負載為2.00.以此類推。

2.3 cpu負載分類

負載就是cpu在一段時間內正在處理以及等待cpu處理的進程數之和的統計信息,也就是cpu使用隊列的長度統計信息,這個數字越小越好(如果超過CPU核心*0.7就是不正常)

負載分為兩大部分:CPU負載、IO負載

cpu負載:假設有一個進行大規模科學計算的程序,雖然該程序不會頻繁地從磁盤輸入輸出,但是處理完成需要相當長的時間。因為該程序主要被用來做計算、邏輯判斷等處理,所以程序的處理速度主要依賴於cpu的計算速度。此類cpu負載的程序稱為“計算密集型程序”。

IO負載:還有一類程序,主要從磁盤保存的大量數據中搜索找出任意文件。這個搜索程序的處理速度並不依賴於cpu,而是依賴於磁盤的讀取速度,也就是輸入輸出(input/output,I/O).磁盤越快,檢索花費的時間就越短。此類I/O負載的程序,稱為“I/O密集型程序”。

2.4 負載的意義

負載表示的是“等待進程的平均數”。在上面的進程狀態變換過程中,除了running狀態,其他都是等待狀態,那么其他狀態都會加入到負載等待進程中嗎?

事實證明,只有進程處於運行態(running)和不可中斷狀態(interruptible)才會被加入到負載等待進程中,也就是下面這兩種情況的進程才會表現為負載的值。

  • 即便需要立即使用CPU,也還需等待其他進程用完CPU
  • 即便需要繼續處理,也必須等待磁盤輸入輸出完成才能進行

下面描述一種直觀感受的場景說明為什么只有運行態(running)和可中斷狀態(interruptible)才會被加入負載。

如:在很占用CPU資源的處理中,例如在進行動畫編碼的過程中,雖然想進行其他相同類型的處理,結果系統反映卻變得很慢,還有從磁盤讀取大量數據時,系統的反映也同樣會變的很慢。但是另一方面,無論有多少等待鍵盤輸入輸出操作的進程,也不會讓系統響應變慢。

 

3、常見問題

3.1 為什么壓測時候會出現高負載,低CPU使用率的情況

原因:等待磁盤I/O完成的進程過多,導致進程隊列長度過大,但是cpu運行的進程卻很少,這樣就體現到負載過大了,cpu使用率低。

負載總結為一句話就是:需要運行處理但又必須等待隊列前的進程處理完成的進程個數。具體來說,也就是如下兩種情況:

  • 等待被授權予CPU運行權限的進程
  • 等待磁盤I/O完成的進程

cpu低而負載高也就是說等待磁盤I/O完成的進程過多,就會導致隊列長度過大,這樣就體現到負載過大了,但實際是此時cpu被分配去執行別的任務或空閑,具體場景有如下幾種。

場景一:磁盤讀寫請求過多就會導致大量I/O等待

上面說過,cpu的工作效率要高於磁盤,而進程在cpu上面運行需要訪問磁盤文件,這個時候cpu會向內核發起調用文件的請求,讓內核去磁盤取文件,這個時候會切換到其他進程或者空閑,這個任務就會轉換為不可中斷睡眠狀態。當這種讀寫請求過多就會導致不可中斷睡眠狀態的進程過多,從而導致負載高,cpu低的情況。

場景二:MySQL中存在沒有索引的語句或存在死鎖等情況

我們都知道MySQL的數據是存儲在硬盤中,如果需要進行sql查詢,需要先把數據從磁盤加載到內存中。當在數據特別大的時候,如果執行的sql語句沒有索引,就會造成掃描表的行數過大導致I/O阻塞,或者是語句中存在死鎖,也會造成I/O阻塞,從而導致不可中斷睡眠進程過多,導致負載過大。

具體解決方法可以在MySQL中運行show full processlist命令查看線程等待情況,把其中的語句拿出來進行優化。

場景三:外接硬盤故障,常見有掛了NFS,但是NFS server故障

比如我們的系統掛載了外接硬盤如NFS共享存儲,經常會有大量的讀寫請求去訪問NFS存儲的文件,如果這個時候NFS Server故障,那么就會導致進程讀寫請求一直獲取不到資源,從而進程一直是不可中斷狀態,造成負載很高。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM