性能分析之服务器卡顿
一、发现问题(CPU):
在做测试时,一发现测试环境卡顿,就会想着去看服务器运行状态。-->怎么看?
用‘top’,执行top命令,看啥呢?
图中发现:为啥CPU使用率这么低,但是load值缺比较高吗?
不知道原因,但是 知道现在系统load值很高,所以服务器很卡。
二、剖析问题(CPU)
1> 首先看服务器的运行情况,我们肯定会去看CPU的运行情况。当我们在执行top命令的时候,我们会看到有一个 %CPU(s) 这样一行,这一行,就是显示CPU的运行情况(默认间隔3秒钟更新数据),其中
us: 用户态,未改变优先级的进程占用CPU的百分比
sy: 系统态,内核空间占用CPU百分比
ni: 用户态改变优先级的进程占用的CPU百分比
id: 空闲的时间百分比
wa: 空闲&等待IO的时间百分比
hi: 硬中断时间百分比
si: 软中断时间百分比
st: 虚拟化时被其余vm窃取的时间百分比
2> 然后,我们还需要知道,按下数字键 ‘1’,就会看到 %Cpu(0)..... 这样多行,就可以知道当前有多少个活跃的CPU(逻辑)。
3> 那么,问题就是这些数据分别代表什么意思?与load又是什么关系?
* 第一个问题:先知道CPU由哪些部分组成及他们之间是怎么工作的?
准确来说,CPU是由4个重要部分组成:计算器、控制器、寄存器 和 时钟。
计算器:顾名思义,就是CPU中进行运算的核心元件,CPU实现的所有计算,都是由它来完成的。
控制器:就是CPU的指挥控制中心,是管理者,做一些指挥调度工作。
寄存器:这个买过电脑的同学应该都熟悉,现在买电脑CPU都要看有几级缓存,缓存大小。它是CPU中暂存数据的地方,
待处理和已经处理的数据,都会暂存在这里。
时钟:这个东西,你说它在吧,它又不在;不在吧,它又在。它做的就是时间片段计时的。计算器,在进行计算的时候,
都是有个时间片段的,时间片段到了,不管计算是否完成,计算器,都得去干其他事情,之后,再分配时间片段,
来做未完成的事情。
接下来,我们就来想一下公司的产品服务器,是不是在一台服务器上部署产品服务,服务运行起来,普通用户通过操作端,进行操作,从而驱动你们产品的服务进行计算,输出结果给用户。这个计算,就是在CPU内完成的。
开发人员 在实现产品经理要求的功能时,就会写一些代码,这些代码,有的是要自身逻辑运算,有的是需要调系统底层能力支撑,
调了系统底层的,我们说要使用系统内核,要用到CPU的sy系统态,不用调系统底层的,我们就说是用CPU的us用户态,
从非内核进入内核,再从内核处理完出来到非内核,这是不是要来回的切换。就好比公司的核心保密区和非保密区,你要进进出出,
是不是都有严格的审查。这个类比到CPU,我们叫上下文切换。而这个切换,我们也分自愿上下文切换和非自愿上下文切换,
这个大家应该很好理解,主动的进进出出就是自愿上下文,被迫进进出出就是非自愿上下文切换。还有我们前面说的时钟片段,
这些,就与CPU的si软中断,和CPU的hi硬中断关联上了。
在CPU进行计算时,你是不是要给一些资源(如:原始数据),进入CPU,计算完之后,再把结果从CPU中转移出来,这个资源的进\出,
就是资源的I/O,等待这些资源的时间,就是CPU的wa等待时间百分比。
一台服务器并不会只部署一个应用服务,当有多个应用服务在运行时,你认为现在的服务器是让它们串行,还是并行?
相信不用我说答案,大家都会说肯定是并行,那你们再想想,并行,插队是不是有可能。这种,服务间进程插队的情况,
就是CPU的ni进程优先级切换。
当没有用户使用你们的产品的时候,服务器在歇息,此时就是CPU的id空闲时间百分比。
* 第二个问题,CPU的数据与load值之间到底什么关系?load值很大,CPU的数据就一定高吗?
<1> 相信很多人,在没有看过文章第1张图之前,肯定会认为是对的,load值大,CPU的使用率就一定高。因为,普通的认识是:
CPU的us + sy的值越接近100,说明CPU越繁忙,load值就应该高,相反,就应该低。其实,在这个里面,存在一个误区。
<2> 现在linux服务器的内核,绝大多数都已经升级,超过了2.6版本。在2.6版的内核中,已经把load值的计算方法调整为,
所有不可中断睡眠状态的进程,即load average = CPU负载+Disk负载+网络负载+其余外设负载,从第1张图看,就是包含了
我们的wa等待负载值。
<3> 所以,第1张图中,我们能分析出,目前的服务器存在I/O问题,是因为服务器频繁在执行数据换进换出,导致CPU的wa等待资源时间过长,从而出现load值过高,系统比较卡顿。
本文来自博客园,作者:刑之风,转载请注明原文链接:https://www.cnblogs.com/xingzhifeng/p/17329772.html