理解Linux 的CPU Load和CPU利用率

1. 什么是Cpu的Load

图1:

图2:

图3:

图4:

使用uptime、top或者查看/proc/loadavg都可以看到CPU的load统计,这里有三个值,分别代表1分钟、5分钟和15分钟的CPU Load情况。大部分人认为这三个数值越小说明比较好,如果越高说明系统可能存在问题或负载过高了。那这个值处于什么状态是好什么又是不好?什么时候需要关注并检查高的原因?
LOAD AVERAGE:一段时间内处于可运行状态和不可中断状态的进程平均数量。(可运行分为正在运行进程和正在等待CPU的进程,状态为R;不可中断则是它正在做某些工作不能被中断比如等待磁盘IO等,其状态为D),它是从另外一个角度体现CPU的使用状态。
如何理解LOAD这个含义呢?

上图1个电话亭可以理解为一个CPU核心。从上图的过程中可以看到load的概念,而使用率始终100%。

理想的CPU load是多少

这个跟你的CPU核心数量有关,理想情况下一个核心被一个进程占用,如果你是4个核心,那么跑4个进程,此时Load是4但是也不高,如果你只有2个核心,依然跑4个进程,这就意味着有一半进程在某一个时刻抢不到CPU,这时候Load还是4,如果是短期状态还无所谓,如果长期是这个状态你就要注意了。

首先,我们从最简单的单核处理器的系统进行说明。

CPU负载有点类似于交通拥堵程度

单核CPU就像一条单行道。想象您是一名交警.有时这条单行道太忙了,有汽车在排队等待同行。想让人们知道这条路的交通如何。最直接的指标是就是在特定时间内,这条道路上等待多少辆汽车。如果没有汽车在等待,即将到来的驾驶员便知道他们可以马上驶过。如果有汽车在排队等候,则驾驶员就知道知道要耽误时间了。

所以,交警同志,你应该怎样去定义交通拥塞程度的?可以按照下面的规则:

    0.00表示路上根本没有车。实际上,介于0.00和1.00之间都表示没有交通拥堵,到达的汽车可以直接同行。
    1.00表示道路完全处于满负荷状态。一切都还不错,但是如果再增加一辆汽车,将会产生交通堵塞。
    超过1.00表示有交通堵塞。2.00意味着当前的汽车总量需要两条车道才能保证不堵塞。 3.00意味着当前的汽车总量需要三条车道才能保证不堵塞。
如图:

这基本上就是CPU负载的含义。 “汽车”是指使用CPU时间(“通行”)或排队使用CPU的进程。 Unix将CPU负载定义为运行队列的长度:当前正在运行的进程数与正在等待(排队)的进程数之和。

就像交警一样,您希望您的汽车/进程永远不会等待。因此,理想情况下,您的CPU负载应保持在1.00以下。如果系统的负载暂时获得高于1.00的峰值,还是可以的,但是负载您始终高于1.00时,则需要进行处理了。


CPU load的理想值是1.0?

其实不然,当CPU的 load为1.00的时候,你的系统处于满负荷运转,再来一个进程,就会高于1.00,你的系统的性能将会降低,所以系统没有流出余粮,实际工作中,很多系统管理员认为比较理想的CPU负载应该是0.7,因此我们针对线上CPU负载的处理规则如下:

    0.70:需要注意并排查原因 。 如果平均负载保持在> 0.70以上,那么应该在情况变得更糟之前进行调查。

    1.00: 不紧急,需要处理。如果平均负载保持在1.00以上,需要查找问题原因并立即解决。否则,你的服务器可能在任何时候出现性能问题。

    5.0:紧急状态,立即处理。如果平均负载高于5.00,那么你的系统马上就要崩溃了,很有可能系统挂机或者hang死。因此需要立即处理这种情况,千万不要让你的系统负载达到5!



多核心CPU和多处理器

对于性能而言一个双核CPU和2个单核CPU是差不多的,当然一些细小区别是CPU的缓存、进程可能会在多个CPU上切换等。除了这些对于LOAD而言,核心个数才是最重要的,有多少个物理处理器不重要。
对于一个4核心处理器的系统来说,一个LOAD为3.00依然很健康,因为LOAD相对于处理器的核心数来说,100%使用率在一个单核处理器上的load是1.00,那么在一个双核处理器上就是2.00,在一个4核心处理器上就是4.00。
回到桥的那个例子,如果桥只有1条车到那么LOAD是1.00表示桥达到最大承载能力,如果在一个有2条车道的桥上1.00表示桥的负载啊是50%,1条车道满了,另外一条空闲可以继续通行。

以对于有多核心CPU的系统来说最大LOAD是最大的核心数量,你的LOAD不应该超过最大核心数量。2CPU、每个CPU有6个物理核心、算上超线程最终的逻辑CPU个数是24个。比如在Linux查看如下:

这里一个processor就算一个核心,虽然这里的数量是通过因特尔的超线程模拟出来的

出于性能目的,具有单个双核处理器的计算机是否基本上等同于具有两个具有一个内核的处理器的计算机?是的。大致上是一样的。但是还有很多其他微妙之,例如:高速缓存的数量,处理器之间的进程切换频率等。尽管多处理器有这些优点,但为了对于CPU负载值来说,CPU Core的总数是很重要的,因为无论怎样CPU Core是物理隔离的。

因此我们需要添加两条新的CPU 负载处理规则:

“核数=最大负载”:在多核系统上,您的负载不应超过可用核数。

“Core就是Core”的经验法则:CPU Core的性能与CPU上的分布方式无关。两个四核==四个双核==八个单核。他们的性能与八个Core的性能等同。

应该关注哪个值

应该关注5分钟或者15分钟,因为CPU偶尔高一些比较正常,但是如果最近15分钟都很高就需要调查了。

查看Linux系统物理CPU个数、核心数和逻辑CPU个数

总核数 = 物理CPU个数 * 每个物理CPU的核心数
总逻辑CPU数 = 物理CPU个数 * 每个物理CPU的核心数 * 超线程数量

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

如图:

查看每个物理CPU中的核心数
cat /proc/cpuinfo| grep "cpu cores"| uniq

查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

2. 什么是CPU使用率

如图:

使用率这个要结合时间片来说,从上图的演变可以看出影响使用率高低的因素不是LOAD的多少,而是在分配给某个进程时间片时,这个进程是否使用了CPU的计算能力。
在第四分钟时候,分配给蓝人1分钟,但是它什么也没干,这1分钟内电话是闲置的没有被使用,所以这一分钟内的电话使用率就是0%。但是LOAD是3。
当然这里就存在一个统计周期的问题,上图我们的统计周期是1分钟,而分配给每个人的最小时间单位也是1分钟。从计算机角度来说,单核心CPU,假设1秒钟分为100个时间片,如果2个任务,第一个任务用了5个时间片执行完成,另外一个任务用了15个时间片执行完成,所以如果统计周期是1秒,那么这1秒内的CPU使用率就是20%。CPU利用率高不一定负载高。利用率是一段时间内CPU被占用的情况。
CPU负载高利用率低:说明等待执行的任务很多,但是通常任务多CPU使用率也会比较高,如果低就说明CPU根本没工作,哪些很多的任务处于等待状态,可能进程僵死了。可以通过命令ps –axjf查看是否存在D状态的进程,该状态时不可中断的睡眠状态。这种状态无法被KILL。而有时候你通过top命令也看不出来,只能显示LOAD高,但是没有哪个进程的CPU使用率明显高,你可以通过ps –ux来查看。
CPU利用率高负载低:说明任务少,但是任务执行时间长,有可能是程序本身有问题,如果没有问题那么计算完成后则利用率会下降。

3. CPU多核心和多线程

CPU的组成是由控制器(Control Unit 负责调度)和运算器(Processing Unit 运算处理单元)组成。
单核CPU:一个分配工作的、一个具体干活的,来了一个任务那么先有控制器进行进行调度,如果此时运算器空闲那么就直接由运算器进行处理,如果此时运算器正在处理其他任务那么这个后来的任务就需要等待。
多核CPU:就是每个核心都有一组控制器和运算器。比如I5是4核心,简单来说他可以并行处理四个任务。假设这时候同时来了8个任务,那么分配到四个核心上相当于4个队列,此时每个队列只有2个任务。相比单核心CPU执行效率会大大提高。

什么是超线程

超线程(HT):超线程和多线程不同,多线程是程序方面的属于软的代码级别的,超线程是硬件架构方面的,通过控制器来模拟逻辑核心。
超线程有什么作用?其实也是为了提高效率更高的榨干控制器的运行能力。为什么这么说呢,因为任务过来之后很多时候不是马上就能由运算器进行计算的,它还需要其他资源比如网络传输过来的数据或者是硬盘中的数据,那么此时运算器就闲着,为了更大限度利用运算器,我可以设置2个控制器对应一个运算器,其中一个控制器处理的程序需要等待数据的时候,如果另外一个控制器处理的程序不需要等待或者数据已经准备好,那么就可以立即发送给运算器进行计算。
下图蓝色和橙色都是CPU的运算器在工作,白色表示运算器空闲。A图是单核心、B图是双核心、C图是单核心启用超线程,可以看到C图的CPU利用率最大。

图2:

多线程有什么缺点

争抢:核心上运算器只有一个,但是控制器2个,如果来的一个任务那么这两个控制器就需要协调一下谁来处理,所以这个会有一定损耗。这就相当于线程池中的惊群概念。
发生拥挤:物理核心太多如果开启HT则逻辑核心增加一倍,如果这时候来了几百个任务,如何分配这些任务到哪些核心上就是个问题,虽然这是由操作系统来做的调度但是也会有额外损耗,相反你只有一个我就根本不需要考虑分配的问题。

4. 一次问题排查

如图:

查看队列长度,r表示运行和等待CPU时间片的进程数量;b表示等待资源的进程数量比如IO、或者内存交互等。

图2 :

查看进程中哪个线程使用率高

根据线程来查看具体代码。
你也可以直接杀死这个进程。我这里直接杀死,然后LOAD就下降了。

参考:

https://www.cnblogs.com/rexcheny/p/9382396.html

https://www.jianshu.com/p/dde394a143e5

原文地址:https://www.cnblogs.com/zhongguiyao/p/13951234.html