阿里妹導(dǎo)讀:壓測(cè)時(shí)或多或少都收到過(guò)CPU或者Load高的告警,如果是單機(jī)偶發(fā)性的,,經(jīng)常會(huì)認(rèn)為是“宿主機(jī)搶占導(dǎo)致的”,,那事實(shí)是否真是如此呢?是什么引起了這些指標(biāo)的飆高,?網(wǎng)絡(luò),、磁盤(pán)還是高并發(fā)?有什么工具可以定位,?TOP、PS還是vmstat,?CPU高&Load高和CPU低&Load高,,不同的表征又代表著什么? 文末福利:免費(fèi)下載《ECS運(yùn)維指南之Linux系統(tǒng)診斷》電子書(shū),。 一 背景知識(shí) LINUX進(jìn)程狀態(tài) LINUX 2.6以后的內(nèi)核中,,進(jìn)程一般存在7種基礎(chǔ)狀態(tài):D-不可中斷睡眠、R-可執(zhí)行,、S-可中斷睡眠,、T-暫停態(tài),、t-跟蹤態(tài)、X-死亡態(tài),、Z-僵尸態(tài),,這幾種狀態(tài)在PS命令中有對(duì)應(yīng)解釋。
Load Average & CPU使用率 談到系統(tǒng)性能,,Load和CPU使用率是最直觀的兩個(gè)指標(biāo),那么這兩個(gè)指標(biāo)是怎么被計(jì)算出來(lái)的呢,?是否能互相等價(jià)呢,? Load Average 不少人都認(rèn)為,Load代表正在CPU上運(yùn)行&等待運(yùn)行的進(jìn)程數(shù),,即 但Linux系統(tǒng)中,,這種描述并不完全準(zhǔn)確。 以下為L(zhǎng)inux內(nèi)核源碼中Load Average計(jì)算方法,,可以看出來(lái),,因此除了可執(zhí)行態(tài)進(jìn)程,不可中斷睡眠態(tài)進(jìn)程也會(huì)被一起納入計(jì)算,,即: 602staticunsignedlongcount_active_tasks(void) 603 { 604structtask_struct*p; 605unsignedlongnr=0; 606607read_lock(&tasklist_lock); 608for_each_task(p) { 609if ((p->state==TASK_RUNNING610 (p->state&TASK_UNINTERRUPTIBLE))) 611nr =FIXED_1; 612 } 613read_unlock(&tasklist_lock); 614returnnr; 615 } ...... 625staticinlinevoidcalc_load(unsignedlongticks) 626 { 627unsignedlongactive_tasks; /* fixed-point */628staticintcount=LOAD_FREQ; 629630count-=ticks; 631if (count<0) { 632count =LOAD_FREQ; 633active_tasks=count_active_tasks(); 634CALC_LOAD(avenrun[0], EXP_1, active_tasks); 635CALC_LOAD(avenrun[1], EXP_5, active_tasks); 636CALC_LOAD(avenrun[2], EXP_15, active_tasks); 637 } 638 } 在前文 Linux進(jìn)程狀態(tài) 中有提到過(guò),,不可中斷睡眠態(tài)的進(jìn)程(TASK_UNINTERRUTED)一般都在進(jìn)行I/O等待,比如磁盤(pán),、網(wǎng)絡(luò)或者其他外設(shè)等待,。由此我們可以看出,Load Average在Linux中體現(xiàn)的是整體系統(tǒng)負(fù)載,,即CPU負(fù)載 Disk負(fù)載 網(wǎng)絡(luò)負(fù)載 其余外設(shè)負(fù)載,,并不能完全等同于CPU使用率(這種情況只出現(xiàn)在Linux中,其余系統(tǒng)比如Unix,,Load還是只代表CPU負(fù)載)。 CPU使用率 CPU的時(shí)間分片一般可分為4大類:用戶進(jìn)程運(yùn)行時(shí)間 - User Time, 系統(tǒng)內(nèi)核運(yùn)行時(shí)間 - System Time, 空閑時(shí)間 - Idle Time, 被搶占時(shí)間 - Steal Time,。除了Idle Time外,,其余時(shí)間CPU都處于工作運(yùn)行狀態(tài),。 通常而言,我們泛指的整體CPU使用率為User Time 和 Systime占比之和(例如tsar中CPU util),,即: 為了便于定位問(wèn)題,,大多數(shù)性能統(tǒng)計(jì)工具都將這4類時(shí)間片進(jìn)一步細(xì)化成了8類,如下為T(mén)OP對(duì)CPU時(shí)間片的分類,。
這8類分片中,除wa和id外,其余分片CPU都處于工作態(tài),。 二 資源&瓶頸分析 從上文我們了解到,,Load Average和CPU使用率可被細(xì)分為不同的子域指標(biāo),指向不同的資源瓶頸,??傮w來(lái)說(shuō),指標(biāo)與資源瓶頸的對(duì)應(yīng)關(guān)系基本如下圖所示,。 Load高 & CPU高 這是我們最常遇到的一類情況,,即load上漲是CPU負(fù)載上升導(dǎo)致。根據(jù)CPU具體資源分配表現(xiàn),,可分為以下幾類: CPU sys高 這種情況CPU主要開(kāi)銷(xiāo)在于系統(tǒng)內(nèi)核,,可進(jìn)一步查看上下文切換情況。
CPU si高 這種情況CPU大量消耗在軟中斷,,可進(jìn)一步查看軟中斷類型。一般而言,,網(wǎng)絡(luò)I/O或者線程調(diào)度引起軟中斷最為常見(jiàn):
CPU us高 這種情況說(shuō)明資源主要消耗在應(yīng)用進(jìn)程,可能引發(fā)的原因有以下幾類:
Load高 & CPU低 這種情況出現(xiàn)的根本原因在于不可中斷睡眠態(tài)(TASK_UNINTERRUPTIBLE)進(jìn)程數(shù)較多,,即CPU負(fù)載不高,但I(xiàn)/O負(fù)載較高,??蛇M(jìn)一步定位是磁盤(pán)I/O還是網(wǎng)絡(luò)I/O導(dǎo)致。 三 排查策略 利用現(xiàn)有常用的工具,,我們常用的排查策略基本如下圖所示: 從問(wèn)題發(fā)現(xiàn)到最終定位,,基本可分為四個(gè)階段: 資源瓶頸定位 這一階段通過(guò)全局性能檢測(cè)工具,初步定位資源消耗異常位點(diǎn),。 常用的工具有:
熱點(diǎn)進(jìn)程定位 定位到資源瓶頸后,可進(jìn)一步分析具體進(jìn)程資源消耗情況,,找到熱點(diǎn)進(jìn)程,。 常用工具有:
線程&進(jìn)程內(nèi)部資源定位 找到具體進(jìn)程后,,可細(xì)化分析進(jìn)程內(nèi)部資源開(kāi)銷(xiāo)情況,。 常用工具有:
熱點(diǎn)事件&方法分析 獲取到熱點(diǎn)線程后,我們可用trace或者dump工具,,將線程反向關(guān)聯(lián),,將問(wèn)題范圍定位到具體方法&堆棧,。 常用的工具有:
|
|
來(lái)自: yi321yi > 《系統(tǒng)》