在Linux下面,能够经过top命令看到CPU的负载状况,其输出大概以下(只摘录CPU部分):html
top - 01:24:41 up 6 min, 2 users, load average: 0.00, 0.03, 0.00 %Cpu(s): 2.5 us, 1.8 sy, 3.1 ni, 90.5 id, 1.7 wa, 0.0 hi, 0.4 si, 0.0 st
这里的load average以及缩写的us、sy、ni、id、wa、hi、si、st都是些什么意思呢?这些值在一个什么样的区间比较合理呢?若是值超过了合理区间,应该怎么处理呢?这篇未来聊聊这些问题。linux
load average表明CPU的平均负载值,上面示例中的load average: 0.00, 0.03, 0.00
分别表示当前CPU在1分钟、5分钟和15分钟内的平均负载。这些负载值是怎么来的呢?缓存
这些数据来自于文件/proc/loadavg,内核会负责统计出这些数据。网络
top和uptime命令显示的内容就来自于这个文件,那么这里所谓的平均负载是个什么概念? 根据proc的帮助文件可知,这里的值就是单位时间内处于运行状态以及等待disk I/O状态的平均job数量。这里的运行状态和job都是内核的概念,这里简单澄清一下:app
对内核来讲,进程和线程都是job性能
job处于运行状态指job处于内核的运行队列中,正在或等待被CPU调度(用户空间的进程正在运行不表明须要被CPU调度,有可能在等待I/O,也有可能在sleep等等)ui
由于某一刻(瞬间)等待调度的进程多少并不能反映系统的总体压力,因此这里取了1,5和15分钟的平均值。spa
那么这个值的大小反映系统什么样的一个压力状态呢?这里以单核CPU为例线程
小于1: 说明平均每次只有不到一个job在忙,对于单核的CPU来讲,彻底能处理过来unix
等于1: 说明平均每次恰好有一个job在忙,对于单核的CPU来讲,恰好能处理过来
大于1: 说明平均每次有多于一个job在忙,对于单核的CPU来讲,因为一次只能处理一个任务,因此确定有任务在等待,说明系统负载较大,调度不过来,有job须要等待
从上面能够看出,一旦大于1,就说明job得不到及时调度,系统性能将受影响。对于多核来讲,因为一次能够调度多个job,因此大于1不必定有问题,以4核CPU为例,该值大于4才说明CPU忙不过来。
那这个平均负载保持在多少比较合适呢?其实没有一个标准值,但通常的作法是预留必定的空间来应对系统负载的波动,建议控制在“0.7*核数”之内,好比4核,那么0.7*4=2.8比较合适,一旦超过这个值,须要分析缘由并着手解决。
load average经过统计等待运行的平均job数量来推断CPU的繁忙程度,而%Cpu(s)则直接统计CPU处于不一样状态的时间,比上面的load average更直观,因此在实际上也被使用的更多。
整体来讲,CPU会处于下面三种状态中的一种:
Idle: 处于空闲状态,没有任务须要调度
User space: 正在运行user space的代码(处于用户态)
Kernel: 正在运行内核的代码(处于内核态)
对上面这三种状态,内核又进一步细分为不少状态,这里以上面输出的8种状态为例进行说明:
2.5 us : 表示CPU有2.5%的时间在运行用户态代码(即在运行用户态程序)
1.8 sy : 表示CPU有1.8%的时间在运行内核态代码。内核负责管理系统的全部进程和硬件资源,全部的内核代码都运行在内核态,当用户态进程须要访问硬件资源时,如分配内存,读写I/O等,也须要经过系统调用进入内核态运行内核代码。%sy高说明内核占用太多资源,或者用户进程发起了太多的系统调用。
3.1 ni : 表示CPU有3.1%的时间在运行niceness不为0的进程代码。默认状况下,进程的niceness值都为0,但能够经过命令nice来启动一个进程并指定其niceness值,niceness的取值范围是-20到19,值越小,表示优先级越高,越优先被内核调度。
90.5 id : 表示CPU有90.5%的时间处于空闲状态
1.7 wa : 表示CPU有1.7%的时间处于I/O等待状态。一般状况下,当CPU遇到一个I/O操做时,会先触发I/O操做,而后去干别的,等I/O操做完成后,CPU再接着继续工做,但若是这时系统比较空闲,CPU没有别的事情能够作,那么CPU将处于等待状态,这种处于等待状态的时间将会被统计进I/O wait,也就是说CPU处于I/O wait状态即CPU闲着没事干在等I/O操做结束,和idle几乎是同样的。这个值高说明CPU闲且I/O操做多或者I/O操做慢,但低并不能说明没有I/O操做或者I/O操做快,有多是CPU在忙别的,因此这只是一个参考值,须要和其余的统计项一块儿来分析。
0.0 hi & 0.4 si : 这两个值反映了CPU有多少时间花在了中断处理上,hi(hardware interrupts)是硬件中断,si(softirqs)是软件中断。硬件中断通常由I/O设备引发,如网卡、磁盘等,发生硬件中断后,CPU须要当即处理,当硬件中断中须要处理的事情不少时,内核会生成相应的软中断,而后将耗时且不须要当即处理完成的操做放在软中断中执行,好比当网卡收到网络包时,须要CPU当即把数据拷贝到内存中去,由于网卡自带的缓存较小,若是不及时处理的话后面的数据包就进不来,致使丢包,当数据拷贝到内存中以后,就不须要那么着急的处理了,这时候能够将处理数据包(协议栈)的代码放在软中断中执行。本人不是内核专家,关于软中断的部分请参考Understanding the Linux Kernel, 3rd Edition
0.0 st : %st和虚拟机有关,当系统运行在虚拟机中时,当前虚拟机就会和宿主机以及其它的虚拟机共享CPU,%st就表示当前虚拟机在等待CPU为它服务的时间。该值越大,表示物理CPU被宿主机和其它虚拟机占用的时间越长,致使当前虚拟机得不到充足的CPU资源。若是%st长时间大于0,说明CPU资源得不到知足,这时能够考虑将虚拟机移到其它机器上,或者减小当前机器运行的虚拟机数量。
上面这些统计项的总和等于100%,除了%idle以外,其它的任何一项数值太高都表明系统有问题,须要具体问题具体分析。
%us太高 : 表示有用户态进程占用了过多的CPU,经过top命令能够很清楚的看到是哪一个进程,若是这不是预期的行为,能够经过kill命令杀死相应的进程或者重启它
%sy太高 : 若是只是偶尔太高的话,不用担忧,但若是是持续走高的话,就须要重视,有多是某些进程的系统调用太频繁,好比进程不停的往控制台输出日志,但若是用户态的进程都没有问题,那多是内核里面的代码出现了问题,尤为是代码写的很差的驱动模块
%ni太高 : 说明有人用nice程序运行了比较耗CPU的进程。若是niceness值大于0的话,就没什么好担忧的,由于它的优先级比默认优先级要低,不会影响CPU性能,但最好仍是确认一下该进程不会抢占系统的其它资源,如内存、磁盘I/O等,避免对系统总体性能形成影响。若是niceness值小于0的话,表示该进程优先级高且占用CPU资源多,须要确保该进程占用的CPU资源是符合预期的,若是不是,能够用top命令把它找出来并kill掉或者重启。
%wa太高 : 意味着系统中有进程在作大量的I/O操做,或者在读写速度比较慢的I/O设备,好比频繁的读写磁盘,这时能够经过iotop命令来查看是哪些进程占I/O,而后再针对不一样的进程作相应的处理;还有一种状况就是系统在频繁的使用交换分区,这时须要解决的就是内存的问题,而不是I/O的问题。
%hi或者%si太高 : %hi太高通常是硬件出问题了,%si太高通常是内核里面的代码出问题了
%st 太高 : 正如上面介绍介绍的那样,%st太高表示当前虚拟机得不到足够的CPU资源。这时能够考虑将当前虚拟机搬迁到其它的主机上,或者想办法下降当前主机的负载,好比关掉一些其它的虚拟机。
load average和%Cpu(s)以不一样的方式给出了当前主机的CPU负载状况,经过%Cpu(s)咱们能够看到系统当前的实时负载,如今不少监控系统每隔一段时间都会采集一次%Cpu(s),而后存储起来以图形的方式展现出来,这样就能很直观的看到CPU负载的变化,固然若是没有这样的监控系统的话,经过load average也能大概的知道最近一段时间内的平均负载(最长15分钟)。