你該擔心Linux主機CPU的負載嗎?

ㄚ琪自從從DELL買來一台超便宜的伺服器來提昇網站效能,果真解決了主機常當機的問題,使用了一段時間,也不再發生當機事件,安心了不少,但是偶爾還是會想說,到底CPU負載要到多少才要擔心啊?一直沒有看過這樣的數據,今天再一次搜尋,找到了這篇Understanding Linux CPU Load – when should you be worried?,我就為各位翻譯一下這篇,好讓自己網管的工作技能可以提昇。

你可能已經很熟悉Linux的平均負載,平均負載是用uptime跟top命令來顯示的,看起來就像這樣:

2010-10-05_164628

很多人對平均負載是什麼可能有一點點瞭解:這三個數字分別表示(1分鐘、5分鐘及15分鐘)的平均值,而且數字越低越好,喔,所以我的是0.00說,好像有點太好了吧!較高的數值表示有問題或是主機負荷過多,但是什麼值才算負載過多?這個門檻是?”好的”與”壞的”的平均負載值怎麼看?我們什麼時候要注意平均負載值?什麼時候我們應該盡快修復它?

首先,關於平均負載值的意義有一個小背景,我們會開始最簡單的案例:一台有一個單核心的機器。

交通的比喻

一個單核心的CPU就像是一條單線道的交通,想像你是一個艦長…有時候你的艦橋很忙有車子排隊要穿過,你想要讓人們知道在艦橋上教通如何移動,一個適當的指標就是在一個特定時間有多少汽車在等待 ,假如沒有汽車在等待,進來的司機就可以知道他們可以馬上通過,假如車子堵住了,司機就會知道他們他們耽誤了。

所以艦長,你要使用什麼編號系統?你認為怎樣:

  • 0.00意謂橋上沒有交通,事實上,0.00跟1.00之間意謂沒有塞車,車子一抵達就可以馬上過去。
  • 1.00意謂橋上剛好滿載,所有的一切還好,但假如交通狀況再嚴重一點,一切都將放慢。
  • 超過1.00意謂有塞車,多少?嗯,2.00意謂有兩線道的車輛數 — 一個車道的車子在橋上,另一個車道的車子在等候,3.00意謂有三個車道的車子數目 — 一個車道的車子在橋上,兩個車道的車子在等候等等。

= load of 1.00

= load of 0.50

= load of 1.70

這就是基本的CPU負載,"車子"就是使用一段CPU時間的程序("通過艦橋")或是排隊使用CPU,Unix稱此為執行佇列長度:正在執行的程序數加上正在等候(佇列)執行的數目的總和。

就像艦長一樣,你會想要你的車子/程序永遠不要等待,所以,你的CPU負載最好應該保持在100以下,另外也像艦長一樣,如果你碰到一個臨時的間超過1.00以上你還是可以的…但是當你常常在1.00以上時,你需要擔心了。

所以你說理想的負載是1.00?

嗯,不完全對,負載1.00的問題就是你沒有淨空,實際上,很多的系統管理員會話出一條0.70的線:

  • "需要尋找它"的經驗法則:0.70 假如你的平均負載保持在0.70以上,現在是時候再事情變糟之前做調查了。

  • "現在修正"的經驗法則:1.00,假如你的平均負載保持在1.00以上,找出問題並且解決它,否則,你會在半夜被吵醒,而這就讓人不快樂了。

  •  "Arrgh,現在是凌晨3點的跆拳道嗎?"的經驗法則:5.0,假如你的平均負載是5.00,你處在麻煩的狀況中,你的機器不是掛了就是一直很慢,而這(難以理解地)發生在最糟糕的時候像是在半夜或是當你在會議上報告的時候,不要讓這種情形存在。

那多處理器怎樣?我的負載說3.00,但是事情看起來很好!

有一個四處理器的系統嗎?負載3.00仍然是健康的。

在多處理器系統上,負載相對於處理器核心的數量,在一個單核心的系統上"100%的使用率"就是1.00,在雙核心上就是2.00,在四核心上就是4.00等等。

假如我們回到艦橋的比喻上,"1.00"真的就是指"一個車道上的交通",在一個單線道的橋上,意味著滿了,在一個雙線道上,負載1.00表示它的容量是50% — 只有一個車道是滿的,所以還有另一個車道可以使用。

= load of 2.00 on two-lane road

CPU也一樣:在單核心的機器上1.00的負載是100%的CPU使用率,在雙核心的機器上2.00的負載是100%的CPU使用率。

多核心 vs. 多處理器

當我們在這個主題上時,讓我們談談多核心 vs. 多處理器,基於效能的目的,一台有一個雙核心處理器的機器是否等同於兩台處理器,每台處理器有一個核心的機器?是的,大致上差不多,在這裡還有很多的奧秘關於暫存的數量、處理器之間程序交換的頻率等等,儘管有這些細節,但為了估量CPU負載值的目的,只討論核心的總數目是什麼,而不管那些核心佈在多少個實體的處理器上。

這使我們得到了兩個新的經驗法則:

  • "核心數 = 最大負載" 的經驗法則:在多核心系統上,你的負載不應該超過核心數。

  • "核心就是核心" 的經驗法則:核心如何佈在CPU上不管,兩個四核心 == 4個雙核心 == 8個單核心,這些都是8個核心的意思。

帶它回家

讓我們看看uptime的輸出所表示的平均負載:

~ $ uptime
23:05 up 14 days, 6:08, 7 users, load averages: 0.65 0.42 0.36

這是一個四核心的CPU,所以我們有很多的淨空,我甚至不會去想它直到負載保持道1.7以上或左右。

現在,這三個數值怎樣?0.65是最後一分鐘的平均,0.42是過去5分鐘的平均,而0.36是過去15分鐘的平均,這給我們什麼樣的問題:

我應該觀察哪一個平均值?1分鐘的、5分鐘的還是15分鐘的?

我們之前有討論過這些數值 (1.00 = 現在就修正,等等),你應該看5分鐘或15分鐘的平均值,老實說,假如你的機器1分鐘的平均值有一些1.0以上的尖峰,這還是可以的,當15分鐘的平均值到了1.0時並且一直停留在那,那你就需要加把勁了(很顯然地,正如我們剛剛所學到的,調整這些數值到你系統有的處理器核心數)。

所以核心的#對於表示平均負載就很重要 … 我如何知道我的系統有多少核心?

cat /proc/cpuinfo取得你系統裡每個處理器的資訊,注意:在OSX、Google及其他的機器不適用,要得到一個數值透過grep及字數計算執行:grep 'model name' /proc/cpuinfo | wc -l

使用Scout監控Linux CPU 負載

Scout 提供2種方式來監控CPU負載,我們的原始伺服器負載外掛Jesse Newland的Load-Per-Processor外掛 這兩種都可以報告CPU負載並且在負載高峰有/或是趨勢往錯誤的方向集中時可以警告你:

load alert

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *