Linux系統負載相關知識彙總

前段時間正好對系統負載這個概念感興趣。 就做了一些小的研究。 比較詳細的瞭解這個概念。 這裏是我對Linux負載相關的知識的一些整理,記載在博客裏, 方便以後查看, 也希望對其他人有用。 


本文的內容結構如下:

一: 什麼是系統平均負載

二: 怎麼查看系統負載

三: 怎麼判斷系統負載是否過重

四: 系統負載是怎麼計算出來的



一: 什麼是系統平均負載


以下內容是針對Linux下進行討論的。 Linux Load average , 即系統平均負載。 系統平均負載被定義爲在特定時間間隔內運行隊列中的平均進程數。 


有幾個基本概念:(以下內容引用自: http://www.cnblogs.com/amsun/p/3155246.html)

  • Load 指的是運行隊列(run-queue)的長度:L = 等待進程的數目 + 運行進程的數目
  • Load Average指的是在一段時間內CPU正在處理以及等待CPU處理的進程數之和的統計信息,也就是CPU使用隊列的長度的統計信息。
  • Load Average反映了CPU的使用情況和申請情況.

雖然系統負載反應了cpu的使用情況和申請情況,但是cpu利用率和系統負載又是有區別的。 

  • Load Average所包含的信息不是CPU的使用率狀況
  • 多任務環境下,系統分配時間片以後,是否使用完全使用時間片取決於進程,因此完全可能出現低CPU利用率而高Load Average的情況

二: 怎麼查看系統負載


目前Linux上有三個命令(top, w, uptime),可以查看系統負載。 


load average: 0.00, 0.01, 0.05 


這三個數字,分別表示1分鐘, 5分鐘, 15分鐘內的系統的平均負荷。


額外補充一種查看系統負載的方法: cat  /proc/loadavg  



三: 怎麼判斷系統負載是否過重


在阮一峯老師的博客裏有比較好的介紹,他分別針對單CPU, 多CPU,  CPU多核三種情況來做討論。 他做了一個類別, 把cpu比做大橋, 單cpu就是單車道, 類似的多CPU或者CPU有多個核,就是多車道。 下面直接引用他的描述

(http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html):

那麼,我們不妨把這個CPU想象成一座大橋,橋上只有一根車道,所有車輛都必須從這根車道上通過。(很顯然,這座橋只能單向通行。)

系統負荷爲0,意味着大橋上一輛車也沒有。

系統負荷爲0.5,意味着大橋一半的路段有車。

系統負荷爲1.0,意味着大橋的所有路段都有車,也就是說大橋已經"滿"了。但是必須注意的是,直到此時大橋還是能順暢通行的。

系統負荷爲1.7,意味着車輛太多了,大橋已經被佔滿了(100%),後面等着上橋的車輛爲橋面車輛的70%。以此類推,系統負荷2.0,意味着等待上橋的車輛與橋面的車輛一樣多;系統負荷3.0,意味着等待上橋的車輛是橋面車輛的2倍。總之,當系統負荷大於1,後面的車輛就必須等待了;系統負荷越大,過橋就必須等得越久。

CPU的系統負荷,基本上等同於上面的類比。大橋的通行能力,就是CPU的最大工作量;橋樑上的車輛,就是一個個等待CPU處理的進程(process)。

如果CPU每分鐘最多處理100個進程,那麼系統負荷0.2,意味着CPU在這1分鐘裏只處理20個進程;系統負荷1.0,意味着CPU在這1分鐘里正好處理100個進程;系統負荷1.7,意味着除了CPU正在處理的100個進程以外,還有70個進程正排隊等着CPU處理。

爲了電腦順暢運行,系統負荷最好不要超過1.0,這樣就沒有進程需要等待了,所有進程都能第一時間得到處理。很顯然,1.0是一個關鍵值,超過這個值,系統就不在最佳狀態了,你要動手干預了。


通常情況下, 對於單CPU的情況,

如果load average 大於 0.7 ,就要開始引起系統管理員注意, 查找問題所在;

大於1.0, 就要尋找解決方法;

大於5.0,表明系統的問題已經很嚴重了, 可能會死機。 

對於多CPU或者多核的情況, 請乘以對應的倍數來判斷。 


另外,由於在Linux中,會返回三個時間的觀察值,那麼就存在一個問題,就是我要以哪個時長的觀察值爲準了。 在阮一峯老師的博文中也給出了建議:

如果只有1分鐘的系統負荷大於1.0,其他兩個時間段都小於1.0,這表明只是暫時現象,問題不大。

如果15分鐘內,平均系統負荷大於1.0(調整CPU核心數之後),表明問題持續存在,不是暫時現象。所以,你應該主要觀察"15分鐘系統負荷",將它作爲電腦正常運行的指標。



四: 系統負載是怎麼計算出來的


爲了搞清楚系統負載是怎麼算出來的, 我又在網上找到了一些資料。 計算公式涉及了高等數學的運算,如果對此不感興趣,可以直接跳過。 


通過查看Linux源碼, 可以得到, Linux計算系統平均負載的公式爲:


load(t) = load(t-1) e^(-5/60) + n (1 - e^(-5/60))


其中,exp(x)爲e的x次冪,

n爲當前運行隊列的長度。


Linux內核認爲進程的生存時間服從參數爲1的指數分佈,


指數分佈的概率密度爲:以內核計算負載load1爲例,設相鄰兩個計算時刻之間系統活動的進程集合爲S0。


從1分鐘前到當前計算時刻這段時間裏面活動的load1個進程,設他們的集合是 S1,內核認爲的概率密度是:λe-λx,


而在當前時刻活動的n個進程,設他們的集合是Sn內核認爲的概率密度是1-λe-λx。


其中x = 5 / 60,因爲相鄰兩個計算時刻之間進程所耗的CPU時間爲5秒,而考慮的時間段是1分鐘(60秒)。


那麼可以求出最近1分鐘系統運行隊列的長度:



load1 = |S1| -* λe-λx + |Sn| * (1-λe-λx) = load1 * λe-λx + n * (1-λe-λx)



其中λ = 1, x = 5 / 60, |S1|和|Sn|是集合元素的個數,這就是Linux內核源文件shed.c的函數calc_load()計算負載的數學依據。



【參考文獻】

1.    http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages 

2.    http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html

3.    http://www.penglixun.com/tech/system/how_to_calc_load_cpu.html

4.    http://www.cnblogs.com/amsun/p/3155246.html

5.    http://www.ccvita.com/354.html



<<<<<<<<< 全文完  >>>>>>>>>

 

文章首發於我的個人網站 : www.hackstoic.com  












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章