cpu負(fù)載的探討

原鏈接http://blog.chinaunix.net/uid-12693781-id-368837.html

摘要:確定cpu的負(fù)載的定義陋桂,幫助管理員設(shè)置cpu負(fù)載閥值哑蔫,推測(cè)可能的導(dǎo)致cpu負(fù)載過(guò)高的原因中狂,進(jìn)而保證服務(wù)器的正常運(yùn)行。
1.cpu負(fù)載的定義
首先晤斩,看看cpu負(fù)載的定義餐弱。在一般情況下可以將單核心cpu的負(fù)載看成是一條單行的橋宴霸,數(shù)字1代表cpu剛好能夠處理過(guò)來(lái),即橋上能夠順利通過(guò)所有的車輛膏蚓,
橋外沒(méi)有等待的車輛瓢谢,橋是暢通的。當(dāng)超過(guò)1時(shí)表示有等待上橋的車輛驮瞧,小于1時(shí)表示車輛能夠快速的通過(guò)氓扛。單核心cpu就表示該cpu能夠處理的事務(wù)數(shù)是1,在多核
cpu中cpu能夠并行處理的事務(wù)的數(shù)量應(yīng)該是cpu個(gè)數(shù)*cpu核數(shù)论笔,而且負(fù)載數(shù)最好不要超過(guò)這個(gè)數(shù)值采郎。例如一個(gè)4核cpu,則cpu_load最大值為4狂魔,不能長(zhǎng)期超過(guò)4尉剩,否則會(huì)有任務(wù)沒(méi)有得到及時(shí)的處理,而使系統(tǒng)的負(fù)載累積增高,導(dǎo)致系統(tǒng)運(yùn)行緩慢毅臊。
大多數(shù)的Unix系統(tǒng)中的負(fù)載只是記錄那些處在運(yùn)行狀態(tài)和可運(yùn)行狀態(tài)的進(jìn)程理茎,但是Linux有所不同黑界,它會(huì)包含那些不可中斷的處于睡眠狀態(tài)的進(jìn)程。這時(shí)當(dāng)這些進(jìn)程由于I/O的阻塞而不能夠運(yùn)行皂林,就可能顯著的增加cpu的負(fù)載朗鸠。所以在Unix和Linux下的cpu的負(fù)載的計(jì)算方法是不一樣的,在設(shè)定監(jiān)測(cè)值的時(shí)候也需要特別考率础倍。
下面從內(nèi)核源碼中分析cpu負(fù)載的計(jì)算根源烛占,這里能夠給出cpu負(fù)載的完整計(jì)算方法。下面的代碼是是在kernel-2.6.32中的kernel/shed.c中截取的沟启,用來(lái)計(jì)算cpu的平均負(fù)載忆家。

/* Variables and functions for calc_load */
static atomic_long_t calc_load_tasks;
static unsigned long calc_load_update;
unsigned long avenrun[3];
EXPORT_SYMBOL(avenrun);
 
/**
 * get_avenrun - get the load average array
 * @loads: pointer to dest load array
 * @offset: offset to add
 * @shift: shift count to shift the result left
 *
 * These values are estimates at best, so no need for locking.
 */
void get_avenrun(unsigned long *loads, unsigned long offset, int shift)
{
loads[0] = (avenrun[0] + offset) << shift;
loads[1] = (avenrun[1] + offset) << shift;
loads[2] = (avenrun[2] + offset) << shift;
}
 
static unsigned long
calc_load(unsigned long load, unsigned long exp, unsigned long active)
{
load *= exp;
load += active * (FIXED_1 - exp);
return load >> FSHIFT;
}
 
/*
 * calc_load - update the avenrun load estimates 10 ticks after the
 * CPUs have updated calc_load_tasks.
 */
void calc_global_load(void)
{
unsigned long upd = calc_load_update + 10;
long active;
 
if (time_before(jiffies, upd))
return;
 
active = atomic_long_read(&calc_load_tasks);
active = active > 0 ? active * FIXED_1 : 0;
 
avenrun[0] = calc_load(avenrun[0], EXP_1, active);
avenrun[1] = calc_load(avenrun[1], EXP_5, active);
avenrun[2] = calc_load(avenrun[2], EXP_15, active);
 
calc_load_update += LOAD_FREQ;
}
 
/*
 * Either called from update_cpu_load() or from a cpu going idle
 */
static void calc_load_account_active(struct rq *this_rq)
{
long nr_active, delta;
 
nr_active = this_rq->nr_running;  //記錄在cpu上運(yùn)行的進(jìn)程數(shù)
nr_active += (long) this_rq->nr_uninterruptible;  //記錄不可中斷的進(jìn)程數(shù)
 
if (nr_active != this_rq->calc_load_active) {
delta = nr_active - this_rq->calc_load_active;
this_rq->calc_load_active = nr_active;
atomic_long_add(delta, &calc_load_tasks);
}
}

從上面的代碼特別是注釋的兩行可以看出,Linux記錄cpu負(fù)載的時(shí)候是將cpu隊(duì)列中的運(yùn)行進(jìn)程數(shù)和不可中斷進(jìn)程數(shù)都統(tǒng)計(jì)在內(nèi)的德迹,這樣在對(duì)cpu負(fù)載分析的時(shí)候就需要考慮不可中斷的進(jìn)程的情況
2.影響cpu負(fù)載的進(jìn)程
從定義可以看出cpu的負(fù)載主要來(lái)自在cpu運(yùn)行的進(jìn)程數(shù)芽卿,隊(duì)列中準(zhǔn)備就緒的進(jìn)程數(shù)和不可中斷進(jìn)程數(shù)。那么當(dāng)cpu負(fù)載過(guò)高的時(shí)候如果能夠知道當(dāng)前運(yùn)行的進(jìn)程的狀態(tài)那么就能夠判斷是哪些進(jìn)程的運(yùn)行導(dǎo)致了問(wèn)題胳搞。剛好卸例,在Linux中ps可以幫助查找當(dāng)前在運(yùn)行的進(jìn)程的狀態(tài),通過(guò)對(duì)這些進(jìn)程的狀態(tài)的了解肌毅,就能夠很好的查找問(wèn)題的真正原因筷转。

#ps aux可以顯示進(jìn)程的運(yùn)行狀態(tài)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

當(dāng)使用ps aux后就可以得知一個(gè)進(jìn)程的11項(xiàng)參數(shù),其中STAT是顯示進(jìn)程的運(yùn)行狀態(tài)悬而。
進(jìn)程的狀態(tài)有以下幾種呜舒。

=================進(jìn)程STAT狀態(tài)==================== 
  D 無(wú)法中斷的休眠狀態(tài)(通常 IO 的進(jìn)程)
  R 正在運(yùn)行,在可中斷隊(duì)列中笨奠; 
  S 處于休眠狀態(tài)袭蝗,靜止?fàn)顟B(tài); 
  T 停止或被追蹤艰躺,暫停執(zhí)行呻袭; 
  W 進(jìn)入內(nèi)存交換(從內(nèi)核2.6開(kāi)始無(wú)效)眨八; 
  X 死掉的進(jìn)程腺兴; 
  Z 僵尸進(jìn)程不存在但暫時(shí)無(wú)法消除;
  W: 沒(méi)有足夠的記憶體分頁(yè)可分配
  WCHAN 正在等待的進(jìn)程資源廉侧;
 
  <:高優(yōu)先級(jí)進(jìn)程
  N: 低優(yōu)先序進(jìn)程
  L: 有記憶體分頁(yè)分配并鎖在記憶體內(nèi) (即時(shí)系統(tǒng)或捱A I/O)页响,即,有些頁(yè)被鎖進(jìn)內(nèi)存
  s 進(jìn)程的領(lǐng)導(dǎo)者(在它之下有子進(jìn)程);
  l 多進(jìn)程的(使用 CLONE_THREAD, 類似 NPTL pthreads)段誊;
  + 位于后臺(tái)的進(jìn)程組闰蚕;

3.防止cpu負(fù)載過(guò)高的方法
短期來(lái)看,可以通過(guò)kill和killall來(lái)殺死一些影響cpu負(fù)載的進(jìn)程连舍,達(dá)到降低cpu負(fù)載的目的没陡。
這些進(jìn)程的狀態(tài)是可以利用ps 顯示出來(lái)的,然后對(duì)相關(guān)的進(jìn)程采取一定的措施就能在短時(shí)間內(nèi)降低cpu的負(fù)載。
關(guān)于kill和killall的用法盼玄,這里不做詳細(xì)的介紹贴彼。

4.cpu負(fù)載過(guò)高的進(jìn)一步分析
長(zhǎng)遠(yuǎn)來(lái)看,要想cpu的負(fù)載不高埃儿,就要從cpu的利用率和當(dāng)前的服務(wù)來(lái)進(jìn)行分析器仗。
下面以具體的案例進(jìn)行分析:
我們有臺(tái)服務(wù)器,當(dāng)服務(wù)器的鏈接數(shù)過(guò)高時(shí)童番,就會(huì)導(dǎo)致nfs阻塞(該臺(tái)服務(wù)器和另外一臺(tái)服務(wù)采用nfs共享文件)精钮,這時(shí)wa為95.8%,負(fù)載馬上就上升到180.

server1:~$ est
   467 connections established

當(dāng)服務(wù)器有大量的鏈接數(shù)時(shí)會(huì)發(fā)生nfs阻塞的問(wèn)題:

root      2631  0.2  0.0      0     0 ?        D    Jul20  50:28 [nfsd]
root      2632  0.2  0.0      0     0 ?        D    Jul20  49:24 [nfsd]
root      2633  0.2  0.0      0     0 ?        S    Jul20  49:27 [nfsd]
root      2634  0.2  0.0      0     0 ?        S    Jul20  49:47 [nfsd]
root      2635  0.2  0.0      0     0 ?        S    Jul20  51:12 [nfsd]
root      2636  0.2  0.0      0     0 ?        S    Jul20  49:00 [nfsd]
root      2637  0.2  0.0      0     0 ?        S    Jul20  49:39 [nfsd]
root      2638  0.2  0.0      0     0 ?        D    Jul20  50:24 [nfsd]

image.png

通過(guò)這種簡(jiǎn)單的分析剃斧,就基本上可以斷定問(wèn)題處在nfs處轨香,需要調(diào)整文件共享的方式。
5.關(guān)于cpu負(fù)載和利用率的關(guān)系

大家可以參考這里的一篇文章寫(xiě)得很好悯衬。

http://www.blogjava.net/cenwenchu/archive/2008/06/30/211712.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弹沽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子筋粗,更是在濱河造成了極大的恐慌策橘,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,185評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娜亿,死亡現(xiàn)場(chǎng)離奇詭異丽已,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)买决,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門沛婴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人督赤,你說(shuō)我怎么就攤上這事嘁灯。” “怎么了躲舌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,684評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵丑婿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我没卸,道長(zhǎng)羹奉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,564評(píng)論 1 284
  • 正文 為了忘掉前任约计,我火速辦了婚禮诀拭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘煤蚌。我一直安慰自己耕挨,他們只是感情好细卧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著筒占,像睡著了一般酒甸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赋铝,一...
    開(kāi)封第一講書(shū)人閱讀 49,874評(píng)論 1 290
  • 那天插勤,我揣著相機(jī)與錄音,去河邊找鬼革骨。 笑死农尖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的良哲。 我是一名探鬼主播盛卡,決...
    沈念sama閱讀 39,025評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼筑凫!你這毒婦竟也來(lái)了滑沧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,761評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巍实,失蹤者是張志新(化名)和其女友劉穎滓技,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體棚潦,經(jīng)...
    沈念sama閱讀 44,217評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡令漂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丸边。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叠必。...
    茶點(diǎn)故事閱讀 38,694評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妹窖,靈堂內(nèi)的尸體忽然破棺而出纬朝,到底是詐尸還是另有隱情,我是刑警寧澤骄呼,帶...
    沈念sama閱讀 34,351評(píng)論 4 332
  • 正文 年R本政府宣布共苛,位于F島的核電站,受9級(jí)特大地震影響谒麦,放射性物質(zhì)發(fā)生泄漏俄讹。R本人自食惡果不足惜哆致,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評(píng)論 3 315
  • 文/蒙蒙 一绕德、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摊阀,春花似錦耻蛇、人聲如沸踪蹬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,778評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跃捣。三九已至,卻和暖如春夺蛇,著一層夾襖步出監(jiān)牢的瞬間疚漆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,007評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工刁赦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娶聘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,427評(píng)論 2 360
  • 正文 我出身青樓甚脉,卻偏偏與公主長(zhǎng)得像丸升,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牺氨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 文/tangsl(簡(jiǎn)書(shū)作者) 原文鏈接:http://www.reibang.com/p/2b993a4b913e...
    西葫蘆炒胖子閱讀 3,749評(píng)論 0 5
  • 原因總結(jié) 產(chǎn)生的原因一句話總結(jié)就是:等待磁盤I/O完成的進(jìn)程過(guò)多猴凹,導(dǎo)致進(jìn)程隊(duì)列長(zhǎng)度過(guò)大夷狰,但是cpu運(yùn)行的進(jìn)程卻很少...
    wangfs閱讀 17,486評(píng)論 4 10
  • 又來(lái)到了一個(gè)老生常談的問(wèn)題,應(yīng)用層軟件開(kāi)發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢郊霎? 今天就這個(gè)問(wèn)題開(kāi)始孵淘,來(lái)談?wù)劜?..
    tangsl閱讀 4,100評(píng)論 0 23
  • 1、第八章 Samba服務(wù)器2歹篓、第八章 NFS服務(wù)器3瘫证、第十章 Linux下DNS服務(wù)器配站點(diǎn),域名解析概念命令:...
    哈熝少主閱讀 3,719評(píng)論 0 10
  • 下雪啦庄撮,下雪啦背捌,小朋友們出來(lái)玩雪啦,他們有的堆雪人洞斯,有的打雪仗毡庆,還有一個(gè)小朋友摔的四腳朝天。他們玩的都很開(kāi)心快樂(lè)烙如。
    龔辰珺閱讀 359評(píng)論 0 1