简介: 压测时或多或少都收到过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