linux CPU负载

简介

CPU负载理解

这里要区别CPU负载和CPU利用率,它们是不同的两个概念,但它们的信息可以在同一个top命令中进行显示。
CPU利用率显示的是程序在运行期间实时占用的CPU百分比,而CPU负载显示的是一段时间内正在使用和等待使用CPU的平均任务数。 CPU利用率高,并不意味着负载就一定大。网上有篇文章举了一个有趣比喻,拿打电话来说明两者的区别。
某公用电话亭,有一个人在打电话,四个人在等待,每人限定使用电话一分钟,若有人一分钟之内没有打完电话,只能挂掉电话去排队,等待下一轮。电话在这里就相当于CPU,而正在或等待打电话的人就相当于任务数。
在电话亭使用过程中,肯定会有人打完电话走掉,有人没有打完电话而选择重新排队,更会有新增的人在这儿排队,这个人数的变化就相当于任务数的增减。为了统计平均负载情况,我们5秒钟统计一次人数,并在第1、5、15分钟的时候对统计情况取平均值,从而形成第1、5、15分钟的平均负载。
有的人拿起电话就打,一直打完1分钟,而有的人可能前三十秒在找电话号码,或者在犹豫要不要打,后三十秒才真正在打电话。如果把电话看作CPU,人数看作任务,我们就说前一个人(任务)的CPU利用率高,后一个人(任务)的CPU利用率低。
当然, CPU并不会在前三十秒工作,后三十秒歇着,只是说,有的程序涉及到大量的计算,所以CPU利用率就高,而有的程序牵涉到计算的部分很少,CPU利用率自然就低。但无论CPU的利用率是高是低,跟后面有多少任务在排队没有必然关系。

top查看机器负载

Tasks: 2244 total,   1 running, 2151 sleeping,   0 stopped,   0 zombie
%Cpu(s):  4.3 us,  1.6 sy,  0.0 ni, 92.2 id,  1.7 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem : 49199592 total, 21400612 free, 21820432 used,  5978548 buff/cache
KiB Swap: 16653308 total,  3981452 free, 12671856 used. 26274108 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                           
18142 mfeng     20   0 19.715g 3.565g   8704 S  46.7  7.6   9:22.22 java                                                              
 6986 root       0 -20       0      0      0 I  12.1  0.0   4:44.67 kworker/11:1H                                                     
20692 mfeng     20   0 11.883g 0.012t   2168 D  11.8 25.3   1:12.41 ld                                                                
 9889 root      20   0       0      0      0 I   2.0  0.0   0:24.43 kworker/11:2                                                      
21495 root      20   0   37512   5672   3048 R   1.6  0.0   0:00.15 top                                                               
20656 root      20   0       0      0      0 I   0.7  0.0   0:00.23 kworker/4:0                                                       
21341 root      20   0       0      0      0 I   0.7  0.0   0:00.10 kworker/4:2                                                       
    8 root      20   0       0      0      0 I   0.3  0.0   0:06.17 rcu_sched      
`load average`代表CPU的平均负载值,这些数据来自于文件`/proc/loadavg`,内核会负责统计出这些数据。`top`和`uptime`命令显示的内容就来自于这个文件,根据proc的帮助文件可知,这里的值就是单位时间内**处于运行状态以及等待磁盘 I/O状态的平均job数量**。
- 1、 对于内核而言,进程和线程都是job
- 2、 job处于运行状态指job处于内核的运行队列中,正在或等待被`CPU`调度(用户空间的进程正在运行不代表需要被CPU调度,有可能在等待I/O,也有可能在sleep等等)

单核举例

  • 1、 小于1: 说明平均每次只有不到一个job在忙,对于单核的CPU来说,完全能处理过来
  • 2、 等于1: 说明平均每次刚好有一个job在忙,对于单核的CPU来说,刚好能处理过来
  • 3、 大于1: 说明平均每次有多于一个job在忙,对于单核的CPU来说,由于一次只能处理一个任务,所以肯定有任务在等待,说明系统负载较大,调度不过来,有job需要等待
    对于单核cpu,一旦大于1,就说明job得不到及时调度,系统性能将会受到影响。对于2核心来说,该值大于2才说明cpu忙不过来。

%Cpu(s)

load average通过统计等待运行的平均job数量来推断CPU的繁忙程度,而%Cpu(s)则直接统计CPU处于不同状态的时间,比上面的load average更直观,所以在实际上也被使用的更多。
总体来说,CPU会处于下面三种状态中的一种:
- 1、 Idle: 处于空闲状态,没有任务需要调度
- 2、User space: 正在运行user space的代码(处于用户态)
- 3、 Kernel: 正在运行内核的代码(处于内核态)
对上面这三种状态,内核又进一步细分为很多状态,这里以上面输出的8种状态为例进行说明:
- 1、us : 表示CPU有2.5%的时间在运行用户态代码(即在运行用户态程序)
- 2、sy : 表示CPU有1.8%的时间在运行内核态代码。内核负责管理系统的所有进程和硬件资源,所有的内核代码都运行在内核态,当用户态进程需要访问硬件资源时,如分配内存,读写I/O等,也需要通过系统调用进入内核态运行内核代码。%sy高说明内核占用太多资源,或者用户进程发起了太多的系统调用。
- 3、ni : 表示CPU有3.1%的时间在运行niceness不为0的进程代码。默认情况下,进程的niceness值都为0,但可以通过命令nice来启动一个进程并指定其niceness值,niceness的取值范围是-20到19,值越小,表示优先级越高,越优先被内核调度。
- 4、id : 表示CPU有90.5%的时间处于空闲状态
- 5、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在忙别的,所以这只是一个参考值,需要和其他的统计项一起来分析。
- 6、hi & si : 这两个值反映了CPU有多少时间花在了中断处理上,hi(hardware interrupts)是硬件中断si(softirqs)是软件中断。硬件中断一般由I/O设备引起,如网卡、磁盘等,发生硬件中断后,CPU需要立即处理,当硬件中断中需要处理的事情很多时,内核会生成相应的软中断,然后将耗时且不需要立即处理完成的操作放在软中断中执行,比如当网卡收到网络包时,需要CPU立即把数据拷贝到内存中去,因为网卡自带的缓存较小,如果不及时处理的话后面的数据包就进不来,导致丢包,当数据拷贝到内存中之后,就不需要那么着急的处理了,这时候可以将处理数据包(协议栈)的代码放在软中断中执行。
- 7、 st : %st和虚拟机有关,当系统运行在虚拟机中时,当前虚拟机就会和宿主机以及其它的虚拟机共享CPU,%st就表示当前虚拟机在等待CPU为它服务的时间。该值越大,表示物理CPU被宿主机和其它虚拟机占用的时间越长,导致当前虚拟机得不到充足的CPU资源。如果%st长时间大于0,说明CPU资源得不到满足,这时可以考虑将虚拟机移到其它机器上,或者减少当前机器运行的虚拟机数量。
上面这些统计项的总和等于100%,除了%idle之外,其它的任何一项数值过高都代表系统有问题。

问题解决。

  • 1、 %us过高 : 表示有用户态进程占用了过多的CPU,通过top命令可以很清楚的看到是哪个进程,如果这不是预期的行为,可以通过kill命令杀死相应的进程或者重启它
  • 2、 %sy过高 : 如果只是偶尔过高的话,不用担心,但如果是持续走高的话,就需要重视,有可能是某些进程的系统调用太频繁,比如进程不停的往控制台输出日志,但如果用户态的进程都没有问题,那可能是内核里面的代码出现了问题,尤其是代码写的不好的驱动模块
  • 3、 %ni过高 : 说明有人用nice程序运行了比较耗CPU的进程。如果niceness值大于0的话,就没什么好担心的,因为它的优先级比默认优先级要低,不会影响CPU性能,但最好还是确认一下该进程不会抢占系统的其它资源,如内存、磁盘I/O等,避免对系统整体性能造成影响。如果niceness值小于0的话,表示该进程优先级高且占用CPU资源多,需要确保该进程占用的CPU资源是符合预期的,如果不是,可以用top命令把它找出来并kill掉或者重启。
  • 4、 %wa过高 : 意味着系统中有进程在做大量的I/O操作,或者在读写速度比较慢的I/O设备,比如频繁的读写磁盘,这时可以通过iotop命令来查看是哪些进程占I/O,然后再针对不同的进程做相应的处理;还有一种情况就是系统在频繁的使用交换分区,这时需要解决的就是内存的问题,而不是I/O的问题。
  • 5、 %hi或者%si过高 : %hi过高一般是硬件出问题了,%si过高一般是内核里面的代码出问题了
  • 6、 %st 过高 : 正如上面介绍介绍的那样,%st过高表示当前虚拟机得不到足够的CPU资源。这时可以考虑将当前虚拟机搬迁到其它的主机上,或者想办法降低当前主机的负载,比如关掉一些其它的虚拟机。

猜你喜欢

转载自blog.csdn.net/qq_25562325/article/details/111589589