判斷Linux load的值是否過高

原文地址:http://selboo.com.cn/post/885/

接觸過和使用過unix或linux的朋友,都知道如何查看Unix/Linux load的值,這邊我也重複一下查看load的方法:

[root@aaronw ~]# uptime
13:33:37 up 7 days, 1:52, 1 user, load average: 4.15, 2.00, 3.14
[root@aaronw ~]# w
13:35:35 up 1 days, 1:54, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 192.168.2.2 13:33 0.00s 0.02s 0.00s w
load average 後面三個值代表系統在1分鐘、5分鐘和15分鐘的負載情況,都知道數字越高表示系統負載越大,第一直覺就是這個系統不行了。load average 是0的時候都認爲他很低,10的時候就覺得高,20就不用講了!但是除了這兩種極端的情況之外,那什麼時候是這兩個值的臨界點?當別人問起我這個問題的時候,我也不知道如何回答,在我大腦裏就根本就沒有考慮過。困擾了我很久,我覺得要搞明白他!

先從linux的kernel的源碼開始吧!在linux 2.6.36版本中有這樣一段代碼:

 

  1. /** 
  2. * spu_calc_load – update the avenrun load estimates. 
  3. * 
  4. * No locking against reading these values from userspace, as for 
  5. * the CPU loadavg code. 
  6. */ 
  7. static void spu_calc_load(void
  8. unsigned long active_tasks; /* fixed-point */ 
  9.  
  10. active_tasks = count_active_contexts() * FIXED_1; 
  11. CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks); 
  12. CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks); 
  13. CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks); 

 

  1. CALC_LOAD是這樣定義: 
  2. #define LOAD_FREQ (5*HZ+1) /* 5 sec intervals */ 
  3. #define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */ 
  4. #define EXP_5 2014 /* 1/exp(5sec/5min) */ 
  5. #define EXP_15 2037 /* 1/exp(5sec/15min) */#define CALC_LOAD(load,exp,n) \ 
  6. load *= exp; \ 
  7. load += n*(FIXED_1-exp); \ 
  8. load >>= FSHIFT; 

從這裏我們能看到取負載值的最小週期5秒,根據代碼中定義我們知道

什麼是load?

load的就是一定時間內計算機有多少個active_tasks,也就是說是計算機的任務執行隊列的長度,cpu計算的隊列。

load多少是正常?

既然load是cpu計算的隊列,那就應該和cpu個處理方式和cpu的個數有關係。所以我個人認爲應該按系統識別的cpu個數來確定load的臨界值,系統識別爲8個cpu,那麼load爲8就是臨界點,高與8就屬於over load了。

什麼叫系統識別cpu個數?

我是這樣認爲的,這裏涉及到cpu物理個數和超線程技術的問題。個人認爲4個物理cpu和2個雙核是不能夠等同的,當然這是物理層面的事了!在系統裏識別的都是4個CPU.所以應該要以系統識別的爲準。畢竟是系統去支配他的使用。

CPU高不等同於load高

在Unix/Linux可能經常會遇到cpu的使用率爲100%,但是load卻不高!這是爲什麼呢?因爲幾乎所有的任務和會和CPU進行交互,但是由於各個設備的使用頻率不同,造成了不能同步進行的問題。比如說,當對硬盤進行讀寫的時候,出現IO的等待時候,事實上cpu已經被切換到別的進程上了。該任務就處於等待狀態,當這樣的任務過多,導致隊列長度過大,這樣就體現到負載過大了,但實際是此時cpu被分配去幹執行別的任務或空閒,因此CPU高不等同於load高,load高也不能於cpu高。

 

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