天天看點

cpu 負載分析

1.cpu核心數

CPU總核數 = 實體CPU個數 * 每顆實體CPU的核數

總邏輯CPU數 = 實體CPU個數 * 每顆實體CPU的核數 * 超線程數

檢視CPU資訊(型号)
[root@AAA ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
     24         Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz

# 檢視實體CPU個數
[root@AAA ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
2

# 檢視每個實體CPU中core的個數(即核數)
[root@AAA ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores    : 6

# 檢視邏輯CPU的個數
[root@AAA ~]# cat /proc/cpuinfo| grep "processor"| wc -l
24      

這些都代表什麼,那就請看CPU架構

多個實體CPU,CPU通過總線進行通信,效率比較低,如下:

cpu 負載分析

多核CPU,不同的核通過L2 cache進行通信,存儲和外設通過總線與CPU通信,如下:

cpu 負載分析

多核超線程,每個核有兩個邏輯的處理單元,兩個核共同分享一個核的資源,如下:

cpu 負載分析

從上面執行的結果來看,證明我使用的cpu有2 * 6 = 12核,每個核有2個超線程,是以有24個邏輯cpu。

2.cpu負載

cpu使用率

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

cpu負載

 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

cpu 負載分析

Linux指令檢視系統平均負載load-average的輸出

uptime

cpu 負載分析

top

cpu 負載分析

 sar -q

cpu 負載分析

sar -u 1 10

cpu 負載分析

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

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

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

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

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

cpu負載的計算

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

cpu負載分類

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

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

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

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

負載的意義

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

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

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

下面描述一種直覺感受的場景說明為什麼隻有運作态(running)和可中斷狀态(interruptible)才會被加入負載。

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

常見問題

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

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

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

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

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

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

上面說過,cpu的工作效率要高于磁盤,而程序在cpu上面運作需要通路磁盤檔案,這個時候cpu會向核心發起調用檔案的請求,讓核心去磁盤取檔案,這個時候會切換到其他程序或者空閑,這個任務就會轉換為不可中斷睡眠狀态。當這種讀寫請求過多就會導緻不可中斷睡眠狀态的程序過多,進而導緻負載高,cpu低的情況。

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

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

繼續閱讀