系統(tǒng)負(fù)載:如何判斷Linux load的值是否過高
接觸過和使用過unix或linux的朋友,都知道如何查看Unix/Linux load的值,這邊我也重復(fù)一下查看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 后面三個(gè)值代表系統(tǒng)在1分鐘、5分鐘和15分鐘的負(fù)載情況,都知道數(shù)字越高表示系統(tǒng)負(fù)載越大,第一直覺就是這個(gè)系統(tǒng)不行了。load average 是0的時(shí)候都認(rèn)為他很低,10的時(shí)候就覺得高,20就不用講了!但是除了這兩種極端的情況之外,那什么時(shí)候是這兩個(gè)值的臨界點(diǎn)?當(dāng)別人問起我這個(gè)問題的時(shí)候,我也不知道如何回答,在我大腦里就根本就沒有考慮過。困擾了我很久,我覺得要搞明白他!
先從linux的kernel的源碼開始吧!在linux 2.6.36版本中有這樣一段代碼:
/** * spu_calc_load – update the avenrun load estimates. * * No locking against reading these values from userspace, as for * the CPU loadavg code. */ static void spu_calc_load(void) { unsigned long active_tasks; /* fixed-point */ active_tasks = count_active_contexts() * FIXED_1; CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks); CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks); CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks); }
CALC_LOAD是這樣定義:
#define LOAD_FREQ (5*HZ+1) /* 5 sec intervals */ #define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */ #define EXP_5 2014 /* 1/exp(5sec/5min) */ #define EXP_15 2037 /* 1/exp(5sec/15min) */#define CALC_LOAD(load,exp,n) \ load *= exp; \ load += n*(FIXED_1-exp); \ load >>= FSHIFT;
從這里我們能看到取負(fù)載值的最小周期5秒,根據(jù)代碼中定義我們知道
什么是load?
load的就是一定時(shí)間內(nèi)計(jì)算機(jī)有多少個(gè)active_tasks,也就是說是計(jì)算機(jī)的任務(wù)執(zhí)行隊(duì)列的長(zhǎng)度,cpu計(jì)算的隊(duì)列。
load多少是正常?
既然load是cpu計(jì)算的隊(duì)列,那就應(yīng)該和cpu個(gè)處理方式和cpu的個(gè)數(shù)有關(guān)系。所以我個(gè)人認(rèn)為應(yīng)該按系統(tǒng)識(shí)別的cpu個(gè)數(shù)來確定load的臨界值,系統(tǒng)識(shí)別為8個(gè)cpu,那么load為8就是臨界點(diǎn),高于8就屬于over load了。
什么叫系統(tǒng)識(shí)別cpu個(gè)數(shù)?
我是這樣認(rèn)為的,這里涉及到cpu物理個(gè)數(shù)和超線程技術(shù)的問題。個(gè)人認(rèn)為4個(gè)物理cpu和2個(gè)雙核是不能夠等同的,當(dāng)然這是物理層面的事了!在系統(tǒng)里識(shí)別的都是4個(gè)CPU.所以應(yīng)該要以系統(tǒng)識(shí)別的為準(zhǔn)。畢竟是系統(tǒng)去支配他的使用。
CPU高不等同于load高
在Unix/Linux可能經(jīng)常會(huì)遇到cpu的使用率為100%,但是load卻不高!這是為什么呢?因?yàn)閹缀跛械娜蝿?wù)和會(huì)和CPU進(jìn)行交互,但是由于各個(gè)設(shè)備的使用頻率不同,造成了不能同步進(jìn)行的問題。比如說,當(dāng)對(duì)硬盤進(jìn)行讀寫的時(shí)候,出現(xiàn)IO的等待時(shí)候,事實(shí)上cpu已經(jīng)被切換到別的進(jìn)程上了。該任務(wù)就處于等待狀態(tài),當(dāng)這樣的任務(wù)過多,導(dǎo)致隊(duì)列長(zhǎng)度過大,這樣就體現(xiàn)到負(fù)載過大了,但實(shí)際是此時(shí)cpu被分配去干執(zhí)行別的任務(wù)或空閑,因此CPU高不等同于load高,load高也不能于cpu高。
【編輯推薦】