目录
一.背景
在性能指标上CPU使用率也是一项重要的指标值,一般cpu负载不超过40%,否则需要通过优化或扩展去降低该值。
cpu飙高有很多原因,我们要做的就是定位原因,分析院系,解决问题。
首先了解下CPU的基础。
二.CPU简介
1.结构
cpu是一台计算机的运算核心(Core)和控制核心( Control Unit)。
它的功能主要是解释计算机指令以及处理计算机软件中的数据。

控制单元:
由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和操作控制器OC(Operation Controller)、指令计数器PC(Program Counter)等,
它根据用户预先编好的程序,依次从存储器中取出各条指令,当每个指令被获取,指令计数器的存储地址加一,放在指令寄存器IR中,通过指令译码(分析)确定应该进行什么操作,然后通过操作控制器OC,按确定的时序,向相应的部件发出微操作控制信号。操作控制器OC中主要包括节拍脉冲发生器、控制矩阵、时钟脉冲发生器、复位电路和启停电路等控制逻辑。
运算单元:
是运算器的核心。可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。相对控制单元而言,运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的,所以它是执行部件。
存储单元:
包括CPU片内缓存和寄存器组,是CPU中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据,CPU访问寄存器所用的时间要比访问内存的时间短。
2.逻辑单元

(1)指令寄存器 :它是芯片上的指令仓库,有了它CPU就不必停下来查找计算机内存中的指令,从而大幅提高了CPU的运算速度。
(2)指令译码器 :它负责将复杂的机器语言指令解译成运算逻辑单元(ALU)和寄存器能够理解的简单格式,就像一位外交官。
(3)控制单元 :既然指令可以存入CPU,而且有相应指令来完成运算前的准备工作,背后自然有一个扮演推动作用的角色——它便是负责整个处理过程的操作控制器。根据来自译码单元的指令,它会生成控制信号,告诉运算逻辑单元(ALU)和寄存器如何运算、对什么进行运算以及对结果进行怎样的处理。
(4)寄存器 :它对于CPU来说非常的重要,除了存放程序的部分指令,它还负责存储指针跳转信息以及循环操作命令,是运算逻辑单元(ALU)为完成控制单元请求的任务所使用的数据的小型存储区域,其数据来源可以是高速缓存、内存、控制单元中的任何一个。
(5)逻辑运算单元(ALU) :它是CPU芯片的智能部件,能够执行加、减、乘、除等各种命令。此外,它还知道如何读取逻辑命令,如或、与、非。来自控制单元的讯息将告诉运算逻辑单元应该做些什么,然后运算单元会从寄存器中间断或连续提取数据,完成最终的任务。
(6)预取单元 :PU效能发挥对其依赖非常明显,预取命中率的高低直接关系到CPU核心利用率的高低,进而带来指令执行速度上的不同。根据命令或要执行任务所提出的要求,何时时候,预取单元都有可能从指令高速缓存或计算机内存中获取数据和指令。当指令到达时,预取单元最重要的任务就是确保所有指令均排列正确,然后发送给译码单元。
(7)总线单元 :它就像一条高速公路,快速完成各个单元间的数据交换,也是数据从内存流进和流出CPU的地方。
(8)数据高速缓存 :存储来自译码单元专门标记的数据,以备逻辑运算单元使用,同时还准备了分配到计算机不同部分的最终结果。
3.CPU处理流程
取指令 ->CPU的控制器从内存读取一条指令并放入指令寄存器
指令译码 ->指令寄存器中的指令经过译码
执行指令 ->分两个阶段“取操作数”和“进行运算
修改指令计数器 -> 计数器+1
三.top命令详解
输入top命令,出现如下

第一行:
12:58:56 — 当前系统时间
188 days, 19:07 — 系统已经运行了188天19小时7分钟(在这期间没有重启过)
2 users — 当前有2个用户登录系统
load average: 0.17, 0.11, 0.09 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况(
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了),负载高表示有很多程序等待调度运行,它会导致上下文切换频繁。
第二行:Tasks — 任务(进程),系统现在共有469个进程,其中处于运行中的有3个,466个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个
第三行:cpu状态
1.4% us — 用户空间占用CPU的百分比。
2.0% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
96.6% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比,说明
IO 等待比较严重。
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si — 软中断(Software Interrupts)占用CPU的百分比
0.0% st — 当前虚拟机中被物理机中的实例偷走的CPU占用(虚拟机占用的物理CPU被物理机占用的比例)
第四行:内存状态
22537704k total — 物理内存总量(22GB),后面分别是使用中的内存总量、空闲内存总量、用于缓存的内存量。
第五行:swap交换分区
2031608k total — 交换区总量(2GB)
2556k used — 使用的交换区总量(2.5M)
2029052k free — 空闲交换区总量(2GB)
4231276k cached — 缓冲的交换区总量(4GB)
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在Linux上free内存会越来越少,但不用为此担心。
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:530668+79236+4231276 = 4.7GB。对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第六行是空行
第七行以下:各进程(任务)的状态监控
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
top默认是按照CPU%排序的。
先输入“b”,再输入“x”。则高亮显示排序行。
shift+<>来切换排序的字段。
输入1则显示每个核的使用情况
这里需要注意的是:第三行是所有用户进程占用整个cpu的平均值,也就是每个核心的使用率/总核心数。而第七行%CPU则是当前进程占用总的CPU,如占满单个核100%,两个核会是200%。
个人的微信公众号,感兴趣的扫码关注。

网友评论