1. 程式人生 > >Linux負載飆升的原因詳解

Linux負載飆升的原因詳解

這裡要區別CPU負載和CPU利用率,它們是不同的兩個概念,但它們的資訊可以在同一個top命令中進行顯示。CPU利用率顯示的是程式在執行期間實時佔用的CPU百分比,這是對一個時間段內CPU使用狀況的統計,通過這個指標可以看出在某一個時間段內CPU被佔用的情況, 如果被佔用時間很高,那麼就需要考慮CPU是否已經處於超負荷運作。而CPU負載顯示的是在一段時間內CPU正在處理以及等待CPU處理的程序數之和的統計資訊,也就是CPU使用佇列的長度的統計資訊。

CPU利用率高並不意味著負載就一定大,可能這個任務是一個CPU密集型的。一樣CPU低利用率的情況下是否會有高Load Average的情況產生呢?理解佔有時間和使用時間就可以知道,當CPU分配時間片以後,是否使用完全取決於使用者,因此完全可能出現低利用率高Load Average的情況。另外IO裝置也可能導致CPU負載高。

由此來看,僅僅從CPU的使用率來判斷CPU是否處於一種超負荷的工作狀態還是不夠的,必須結合Load Average來全域性的看CPU的使用情況。網上有個例子來說明兩者的區別如下:某公用電話亭,有一個人在打電話,四個人在等待,每人限定使用電話一分鐘,若有人一分鐘之內沒有打完電話,只能掛掉電話去排隊,等待下一輪。電話在這裡就相當於CPU,而正在或等待打電話的人就相當於任務數。在電話亭使用過程中,肯定會有人打完電話走掉,有人沒有打完電話而選擇重新排隊,更會有新增的人在這兒排隊,這個人數的變化就相當於任務數的增減。為了統計平均負載情況,我們5秒鐘統計一次人數,並在第1、5、15分鐘的時候對統計情況取平均值,從而形成第1、5、15分鐘的平均負載。有的人拿起電話就打,一直打完1分鐘,而有的人可能前三十秒在找電話號碼,或者在猶豫要不要打,後三十秒才真正在打電話。如果把電話看作CPU,人數看作任務,我們就說前一個人(任務)的CPU利用率高,後一個人(任務)的CPU利用率低。當然, CPU並不會在前三十秒工作,後三十秒歇著,CPU是一直在工作。只是說,有的程式涉及到大量的計算,所以CPU利用率就高,而有的程式牽涉到計算的部分很少,CPU利用率自然就低。但無論CPU的利用率是高是低,跟後面有多少任務在排隊沒有必然關係。

CPU數量和CPU核心數(即核心數)都會影響到CPU負載,因為任務最終是要分配到CPU核心去處理的。兩塊CPU要比一塊CPU好,雙核要比單核好。因此,我們需要記住,除去CPU效能上的差異,CPU負載是基於核心數來計算的,即“有多少核心,即有多少負載”,如單核最好不要超過100%,也就是負載為1.00,如此類推。

Linux裡有一個/proc目錄,存放的是當前執行系統的虛擬對映,其中有一個檔案為cpuinfo,這個檔案裡存放著CPU的資訊。/proc/cpuinfo檔案按邏輯CPU而非真實CPU分段落顯示資訊,每個邏輯CPU的資訊佔用一個段落,第一個邏輯CPU標識從0開始。

要理解該檔案中的CPU資訊,有幾個相關的概念要知道,如:processor表示邏輯CPU的標識、model name表示真實CPU的型號資訊、physical id表示真實CPU和標識、cpu cores表示真實CPU的核心數等等。

邏輯CPU的描述:現在的伺服器一般都使用了“超執行緒”(Hyper-Threading,簡稱HT)技術來提高CPU的效能。超執行緒技術是在一顆CPU同時執行多個程式而共同分享一顆CPU內的資源,理論上要像兩顆CPU一樣在同一時間執行兩個執行緒。雖然採用超執行緒技術能同時執行兩個執行緒,但它並不象兩個真正的CPU那樣,每各CPU都具有獨立的資源。當兩個執行緒都同時需要某一個資源時,其中一個要暫時停止,並讓出資源,直到這些資源閒置後才能繼續。因此超執行緒的效能並不等於兩顆CPU的效能。具有超執行緒技術的CPU還有一些其它方面的限制。