簡介: 壓測時或多或少都收到過CPU或者Load高的告警,若是是單機偶發性的,常常會認爲是「宿主機搶佔致使的」,那事實是否真是如此呢?是什麼引發了這些指標的飆高?網絡、磁盤仍是高併發?有什麼工具能夠定位?TOP、PS仍是vmstat?CPU高&Load高和CPU低&Load高,不一樣的表徵又表明着什麼?html
LINUX 2.6之後的內核中,進程通常存在7種基礎狀態:D-不可中斷睡眠、R-可執行、S-可中斷睡眠、T-暫停態、t-跟蹤態、X-死亡態、Z-殭屍態,這幾種狀態在PS命令中有對應解釋。linux
談到系統性能,Load和CPU使用率是最直觀的兩個指標,那麼這兩個指標是怎麼被計算出來的呢?是否能互相等價呢?ios
Load Average網絡
很多人都認爲,Load表明正在CPU上運行&等待運行的進程數,即併發
但Linux系統中,這種描述並不徹底準確。負載均衡
如下爲Linux內核源碼中Load Average計算方法,能夠看出來,所以除了可執行態進程,不可中斷睡眠態進程也會被一塊兒歸入計算,即:異步
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進程狀態 中有提到過,不可中斷睡眠態的進程(TASK_UNINTERRUTED)通常都在進行I/O等待,好比磁盤、網絡或者其餘外設等待。由此咱們能夠看出,Load Average在Linux中體現的是總體系統負載,即CPU負載 + Disk負載 + 網絡負載 + 其他外設負載,並不能徹底等同於CPU使用率(這種狀況只出如今Linux中,其他系統好比Unix,Load仍是隻表明CPU負載)。socket
CPU使用率tcp
CPU的時間分片通常可分爲4大類:用戶進程運行時間 - User Time, 系統內核運行時間 - System Time, 空閒時間 - Idle Time, 被搶佔時間 - Steal Time。除了Idle Time外,其他時間CPU都處於工做運行狀態。高併發
一般而言,咱們泛指的總體CPU使用率爲User Time 和 Systime佔比之和(例如tsar中CPU util),即:
爲了便於定位問題,大多數性能統計工具都將這4類時間片進一步細化成了8類,以下爲TOP對CPU時間片的分類。
這8類分片中,除wa和id外,其他分片CPU都處於工做態。
從上文咱們瞭解到,Load Average和CPU使用率可被細分爲不一樣的子域指標,指向不一樣的資源瓶頸。整體來講,指標與資源瓶頸的對應關係基本以下圖所示。
這是咱們最常遇到的一類狀況,即load上漲是CPU負載上升致使。根據CPU具體資源分配表現,可分爲如下幾類:
CPU sys高
這種狀況CPU主要開銷在於系統內核,可進一步查看上下文切換狀況。
CPU si高
這種狀況CPU大量消耗在軟中斷,可進一步查看軟中斷類型。通常而言,網絡I/O或者線程調度引發軟中斷最爲常見:
CPU us高
這種狀況說明資源主要消耗在應用進程,可能引起的緣由有如下幾類:
Load高 & CPU低
這種狀況出現的根本緣由在於不可中斷睡眠態(TASK_UNINTERRUPTIBLE)進程數較多,即CPU負載不高,但I/O負載較高。可進一步定位是磁盤I/O仍是網絡I/O致使。
利用現有經常使用的工具,咱們經常使用的排查策略基本以下圖所示:
從問題發現到最終定位,基本可分爲四個階段:
這一階段經過全局性能檢測工具,初步定位資源消耗異常位點。
經常使用的工具備:
定位到資源瓶頸後,可進一步分析具體進程資源消耗狀況,找到熱點進程。
經常使用工具備:
找到具體進程後,可細化分析進程內部資源開銷狀況。
經常使用工具備:
獲取到熱點線程後,咱們可用trace或者dump工具,將線程反向關聯,將問題範圍定位到具體方法&堆棧。
經常使用的工具備:
相關閱讀
[1]Linux Load Averages: Solving the Mystery
http://www.brendangregg.com/blog/2017-08-08/linux-load-averages.html
[2]What exactly is a load average?
http://linuxtechsupport.blogspot.com/2008/10/what-exactly-is-load-average.html