1. 什么是Cpu的Load
使用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和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就算一个核心,虽然这里的数量是通过因特尔的超线程模拟出来的
应该关注哪个值
应该关注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个,如果来的一个任务那么这两个控制器就需要协调一下谁来处理,所以这个会有一定损耗。这就相当于线程池中的惊群概念。
发生拥挤:物理核心太多如果开启HT则逻辑核心增加一倍,如果这时候来了几百个任务,如何分配这些任务到哪些核心上就是个问题,虽然这是由操作系统来做的调度但是也会有额外损耗,相反你只有一个我就根本不需要考虑分配的问题。
4. 一次问题排查
查看队列长度,r表示运行和等待CPU时间片的进程数量;b表示等待资源的进程数量比如IO、或者内存交互等。
查看进程中哪个线程使用率高
根据线程来查看具体代码。
你也可以直接杀死这个进程。我这里直接杀死,然后LOAD就下降了。
CPU的load和使用率傻傻分不清(转)
转自: https://www.cnblogs.com/yunxizhujing/p/9382396.html 1. 什么是Cpu的Load 使用uptime.top或者查看/proc/loadavg ...
JS魔法堂:属性、特性,傻傻分不清楚
一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...
MVP MVC MVVM 傻傻分不清
最近MVC (Model-View-Controller) 和MVVM (Model-View-ViewModel) 在微软圈成为显学,ASP.NET MVC 和WPF 的Prism (MVVM Fr ...
Java:接口和抽象类,傻傻分不清楚?
01. 来看网络上对接口的一番解释: 接口(英文:Interface),在 Java 编程语言中是一个抽象类型,是抽象方法的集合.一个类通过继承接口的方式,从而来继承接口的抽象方法. 兄弟们,你们怎么 ...
[转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!
十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...
OCA,OCP,OCM傻傻分不清?
可能大家知道OCA.OCP.OCM的关系是一个比一个难考,一个比一个含金量高,但是你知道具体的考试科目.考试方式.就业形势区别吗?不知道的话这篇通俗易懂的文章会让你一目了然. 区别一:含金量 ■OCA ...
学点经济学:M0、M1、M2、M3,傻傻分不清?(转载)
来源:http://t.10jqka.com.cn/pid_97006727.shtml 学点经济学:M0.M1.M2.M3,傻傻分不清? 25,508人浏览 2018-08-03 11:06 常听人 ...
【华为敏捷/DevOps实践】7. 敏捷,DevOps,傻傻不分清楚【华为云技术分享】
文:姚冬(华为云DevCloud首席技术布道师,资深DevOps与精益/敏捷专家,金融解决方案技术Leader,中国DevOpsDays社区核心组织者) 前言 敏捷是什么?DevOps是什么?两者有什 ...
傻傻分不清之 Cookie、Session、Token、JWT
傻傻分不清之 Cookie.Session.Token.JWT 什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打 ...
随机推荐
数据结构和算法 – 番外篇.时间测试类Timing
public class Timing { //startingTime--用来存储正在测试的代码的开始时间. TimeSpan startingTime; //duration--用来存储正在测试的 ...
20145330第十周《Java学习笔记》
20145330第十周 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...
cxf的soap风格+spirng4+maven 客户端
上篇博客介绍了,cxf的soap风格的服务端,现在我们写客户端来调用 1.pom.xml
听听各位对Ubuntu的UI的看法
2012-7-15 15:46 最近升级到Ubuntu 12.4 .发现其界面效果真的时越来越炫啦.我就在想,你Ubuntu你图什么啊, 你是以个Linux系统,你的重点在于让系统运行更稳定,更 ...
HDU1671 水题字典树
#include #include #include #include #inc ...