作压力测试的时候,咱们常常会关注两个指标,CPU利用率和CPU负载linux
Linux中,进程分为三种状态:性能
阻塞的进程blocked process测试
可运行的进程runnable processspa
正在运行的进程running process线程
当进程阻塞时,进程会等待I/O设备的数据或者系统调用。设计
进程处于可运行状态时,它处在一个运行队列中,与其余可运行进程争夺CPUblog
CPU使用率队列
CPU使用率指的是程序在运行期间实时占用的CPU百分比,这是对一个时间段内CPU使用情况的统计。进程
经过这个指标能够看出在某一个时间段内CPU被占用的状况资源
CPU负载(load)
它指的是正在运行(running)和准备运行(runnable)的进程的总数,也就是是等待处理的任务队列
load-average
它指的就是特定时间内运行队列中(在CPU上运行或者等待运行)的平均进程数。
在linux top命令中指的是是最近1分钟、5分钟和15分钟的系统平均负载
若是一个进程知足如下条件,则其就会位于运行队列中
- 它没有在等待I/O操做的结果
- 它没有主动进入等待状态(也就是没有调用wait)
- 没有被中止
cpu负载的计算
CPU数量和CPU内核数都会影响到CPU负载,由于任务最终是要分配到CPU核心去处理的。
两块CPU要比一块CPU好,双核要比单核好。所以,除去CPU性能上的差别,CPU负载是基于内核数来计算的。
“有多少内核,就有多少load”。如单核负载为1.00,双核负载为2.00.以此类推。
举例说明cpu负载
你们都要坐电梯坐电梯。假设一部电梯能站10我的,那当1-10人坐电梯时,能够认为电梯的load<1;
正好10人时,load=1;
超过10人时,load>1;
若是有15我的要坐电梯,那就是说能有10人直接上过山车,另外5人须要等待。
此时电梯的load=15/10 = 1.5
也就是说,1.5的负载表示系统当前满负荷运转,且还有至关于50%满负荷的请求在等待
对于load average的临界值,业内有两种判断依据
load average <= cpu核数 * 0.7
load average <= cpu核数 - 1
为何会有高Load,低CPU使用率的状况?
依然拿电梯的例子来讲明。假设一共有20我的来坐电梯。电梯一次运行5分钟。两次运行之间,第一批10人下来,第二批10人来,电梯等人进来,加上关门时间时间也要3分钟。这种状况下电梯的使用率就是50%左右。而过山车的load是2。对应到咱们的CPU上,当运行的进程(线程)过多时,频繁的上下文切换耗费了大量的CPU时间,致使真正用在运算的CPU时间片比较少(低CPU使用率),却有不少进程在等待运行(高Load)。
Cpu 利用率和 load 值高低没有直必然关系
咱们作压测的时候通常认为 CPU 利用率和 Load 值是正比的关系,既Load 值越高,CPU 利用率就越高。
可是事实上有时候 Load 很高,CPU 利用率却比较低(多核更可能出现分配不均的状况)。
由于 Load 是等待处理的任务队列,当你的应用在等待同步消息返回处理的同时,CPU 仍是会将时间切片分配给这些线程。
而真正须要 CPU 的那些线程,却不得不在得不到时间片之后暂时放弃工做被挂起。
CPU利用率高也并不意味着负载就必定大,可能这个任务是一个CPU密集型的。CPU低利用率的状况下也会有高Load Average的状况。当CPU分配时间
片之后,是否使用彻底取决于使用者,所以彻底可能出现低利用率高Load Average的状况。
所以在程序设计的时候要考虑如何利用好CPU的这个资源,如何均匀的将压力分摊到各个CPU 上(有时候一个线程在不断循环,致使单个CPU负荷很高)
再举例
公共电话亭里有一我的在打电话,后面有四我的在等待,每人限定使用电话一分钟。如有人一分钟以内没有打完电话,只能挂掉电话去排队,等待下一
轮。公共电话在就至关于CPU,而正在打电话或等待打电话的人就至关于任务数。
在电话亭使用过程当中,确定会有人打完电话走掉,有人没有打完电话而选择从新排队,更会有新增的人在这儿排队。人数的变化就至关于任务数的增减。
为了统计平均负载状况,咱们5秒钟统计一次人数,并在第一、五、15分钟的时候对统计状况取平均值,从而造成第一、五、15分钟的平均负载。
有的人拿起电话就打,打满1分钟,有的人可能前三十秒在找号码,或者犹豫要不要打,后三十秒才真正开始打。若是把电话看做CPU,人数看做任务,
咱们能够说前一我的(任务)的CPU利用率高,后一我的(任务)的CPU利用率低。固然, CPU并不会在前三十秒工做,后三十秒歇着,它一直在处于load
状态。
有的程序涉及到大量的计算,因此CPU利用率就高,而有的程序牵涉到计算的部分不多,CPU利用率天然就低。但不管CPU的利用率是高是低,跟后面有多少任务在排队没有必然关系(cpu利用率和load没有必然关系)。
在Linux系统中,能够经过命令看到系统平均负载load-average的输出
uptime
top
saq -q
runq-sz:运行队列的长度(等待运行的进程数)
plist-sz:进程列表中进程(processes)和线程(threads)的数量
ldavg-1:最后1分钟的系统平均负载(Systemload average)
ldavg-5:过去5分钟的系统平均负载
ldavg-15:过去15分钟的系统平均负载