前段時間正好對系統負載這個概念感興趣。 就做了一些小的研究。 比較詳細的瞭解這個概念。 這裏是我對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