测试驿栈-由浅入深学性能 性能测试连载 (26)-剖析 cpu 负载和 cpu 利用率
性能答疑 QQ 群:697244251
概述
做压力测试的时候,我们经常会关注两个指标,CPU 利用率和 CPU 负载
在 Linux 中,进程分为三种状态:
不可中断的进程 blocked process
可运行的进程 runnable process
正在运行的进程 running process
当进程处于不可中断时,进程会等待 I/O 设备的数据或者系统调用;进程处于可运行状态时,它处在一个运行队列中,与其他可运行进程争夺 CPU
CPU 使用率
CPU 使用率指的是程序在运行期间实时占用的 CPU 百分比,这是对一个时间段内 CPU 使用状况的统计。通过这个指标可以看出在某一个时间段内 CPU 被占用的情况
load-average
它指的是正在运行(running)和不可中断(等待 IO)的平均进程数。在 linux top 命令中指的是是最近 1 分钟、5 分钟和 15 分钟的系统平均负载
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 低利用率的情况下也会有高 Load Average 的情况。当 CPU 分配时间片以后,是否使用完全取决于使用者,因此完全可能出现低利用率高 Load Average 的情况。
电话亭与负载
公共电话亭里有一个人在打电话,后面有四个人在等待,每人限定使用电话一分钟。若有人一分钟之内没有打完电话,只能挂掉电话去排队,等待下一轮。公共电话在就相当于 CPU,而正在打电话或等待打电话的人就相当于任务数。
在电话亭使用过程中,肯定会有人打完电话走掉,有人没有打完电话而选择重新排队,更会有新增的人在这儿排队。人数的变化就相当于任务数的增减。为了统计平均负载情况,我们 5 秒钟统计一次人数,并在第 1、5、15 分钟的时候对统计情况取平均值,从而形成第 1、5、15 分钟的平均负载。
有的人拿起电话就打,打满 1 分钟,有的人可能前三十秒在找号码,或者犹豫要不要打,后三十秒才真正开始打。如果把电话看作 CPU,人数看作任务,我们可以说前一个人(任务)的 CPU 利用率高,后一个人(任务)的 CPU 利用率低。当然, CPU 并不会在前三十秒工作,后三十秒歇着,它一直在处于 load 状态。
有的程序涉及到大量的计算,所以 CPU 利用率就高,而有的程序牵涉到计算的部分很少,CPU 利用率自然就低。但无论 CPU 的利用率是高是低,跟后面有多少任务在排队没有必然关系 (cpu 利用率和 load 没有必然关系)。
saq -q
runq-sz:运行队列的长度(等待运行的进程数)
plist-sz:进程列表中进程(processes)和线程(threads)的数量
ldavg-1:最后 1 分钟的系统平均负载(Systemload average)
ldavg-5:过去 5 分钟的系统平均负载
ldavg-15:过去 15 分钟的系统平均负载