CPU的load和使用率傻傻分不清(转) 1. 什么是Cpu的Load 2. 什么是CPU使用率 3. CPU多核心和多线程 4. 一次问题排查

转自: https://www.cnblogs.com/yunxizhujing/p/9382396.html


CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

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

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

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

理想的CPU load是多少

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

多核心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查看如下:

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

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

应该关注哪个值

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

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

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

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

1
2
# 查看物理CPU个数
cat /proc/cpuinfogrep "physical id"sortuniqwc -l

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

1
2
查看每个物理CPU中的核心数
cat /proc/cpuinfogrep "cpu cores"uniq

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

1
2
查看逻辑CPU的个数
cat /proc/cpuinfogrep "processor"wc -l

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

2. 什么是CPU使用率

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

使用率这个要结合时间片来说,从上图的演变可以看出影响使用率高低的因素不是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利用率最大。

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

多线程有什么缺点

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

4. 一次问题排查

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

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

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

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

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查

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

CPU的load和使用率傻傻分不清(转)
1. 什么是Cpu的Load
2. 什么是CPU使用率
3. CPU多核心和多线程
4. 一次问题排查