当前位置: 首页 > Linux

LinuxCPU使用情况

时间:2023-04-06 19:59:29 Linux

Linux下可以使用top命令查看CPU负载情况。输出大致如下(只摘录了CPU部分):top-01:24:41up6min,2users,loadaverage:0.00,0.03,0.00%Cpu(s):2.5us,1.8sy,3.1ni,90.5id,1.7wa,0.0hi,0.4si,0.0st这里的平均负载和缩写的us,sy,ni,id,wa,hi,si,st它们是什么意思?对于这些值,什么样的间隔是合理的?超出合理范围怎么办?本文将在未来讨论这些问题。loadaverageloadaverage代表CPU的平均负载值。上例中loadaverage:0.00、0.03、0.00分别代表当前CPU在1分钟、5分钟、15分钟内的平均负载。这些负载值是怎么来的呢?这些数据来自文件/proc/loadavg,内核会负责统计这些数据。top和uptime命令显示的内容都来自这个文件,那么这里所谓的平均负载是什么概念呢?根据proc的帮助文件,这里的值是单位时间内正在运行并等待磁盘I/O的平均作业数。这里的runningstate和job都是内核的概念。这里简单说明一下:对于内核来说,进程和线程都是运行态的jobjobs,意思是作业在内核的运行队列中,正在或者等待CPU调度(在用户空间)的事实进程正在运行并不意味着它需要被CPU调度,它可能正在等待I/O,也可能处于休眠状态等)因为某一时刻等待调度的进程数(瞬时)并不能反映系统的整体压力,所以这里取1,5和15分钟的平均值。那么这个值在系统中体现了什么样的压力状态呢?这里我们以单核CPU为例,小于1:表示平均一次忙的作业少于1个。对于单核CPU,完全可以搞定。等于1:表示平均每次只有一个作业忙。对于一个单核的CPU,它只能处理超过1个:这意味着平均一次有多个作业在忙。对于单核CPU来说,由于一次只能处理一个任务,所以肯定有一个任务在等待,说明系统负载太重,无法调度,有作业需要等待。由上可知,一旦大于1,则表示作业无法及时调度,系统性能会受到影响。对于多核来说,因为一次可以调度多个作业,所以大于1不一定有问题。以4核CPU为例,大于4的值说明CPU太忙.那么要维持的适当平均负载是多少呢?其实并没有标准值,但一般的做法是预留一定的空间来应对系统负载的波动。建议控制在“0.7*核数”以内,比如4核,那么0.7*4=2.8比较合适。一旦超过这个值,就需要分析原因,着手解决。%Cpu(s)loadaverage通过统计平均等待运行的作业数来推断CPU的繁忙程度,而%Cpu(s)直接统计CPU处于不同状态的时间,比上面的loadaverage更直观,所以在实践中也用的比较多。一般来说,CPU会处于以下三种状态之一:Idle:处于空闲状态,不需要调度任何任务Userspace:代码运行在用户空间(用户态)Kernel:代码运行在内核(inkernelState)针对以上三种状态,内核进一步细分为很多状态。这里我们以上面输出的8个状态为例来说明:2.5us:表示CPU花费了2.5%的时间运行用户态代码(即运行用户态程序)1.8sy:表示CPU花费1.8%的时间运行内核模式代码。内核负责管理系统的所有进程和硬件资源。所有内核代码都在内核模式下运行。当用户态进程需要访问硬件资源时,如分配内存、读写I/O等,也需要通过系统调用进入内核态。运行内核代码。%sy高表示内核占用资源过多,或者用户进程发起的系统调用过多。3.1ni:表示CPU花费3.1%的时间运行niceness不为0的进程代码。默认情况下,一个进程的niceness值为0,但是你可以通过nice命令启动一个进程并指定它的niceness值,niceness的取值范围是-20到19,值越小,优先级越高内核调度的优先级。90.5id:表示CPU有90.5%的时间是空闲的。1.7wa:表示CPU有1.7%的时间处于I/O等待状态。通常情况下,当CPU遇到I/O操作时,会先触发I/O操作,然后再做其他事情。I/O操作完成后,CPU会继续工作,但是如果此时系统比较空闲,CPU没有别的事情可做,那么CPU就会处于等待状态,此时的时间waiting状态会被计入I/Owait,也就是说CPU处于I/Owait状态,即CPU空闲,无事可做。等待I/O操作结束几乎和空闲一样。值高表示CPU空闲,I/O操作多或I/O操作慢,值低不代表没有I/O操作或I/O操作快。可能是CPU忙于其他事情,所以这只是一个参考值,需要和其他统计项一起分析。0.0hi&0.4si: 这两个值反映了CPU在中断处理上花费了多少时间,hi(hardwareinterrupts)是硬件中断,si(softirqs)是软件中断。硬件中断一般是由I/O设备引起的,比如网卡、磁盘等,硬件中断发生后,需要CPU立即处理。当硬件中断中需要处理的事情较多时,内核会产生相应的软中断,然后将需要时间且不需要立即处理的操作放在软中断中执行。例如,当网卡收到一个网络包时,CPU需要立即将数据拷贝到内存中,因为网卡的缓存很小。如果不及时处理,后续的数据包就进不来,造成丢包。数据复制到内存后,就没必要那么急着处理了。此时可以在软中断中执行处理数据包(协议栈)的代码。本人非内核专家,请参考UnderstandingtheLinuxKernel,3rdEdition0.0st 关于软中断:%st与虚拟机有关,当系统运行在虚拟机中时,当前虚拟机将连接到主机和其他虚拟机共享CPU,%st表示当前虚拟机等待CPU为其服务的时间。该值越大,物理CPU被宿主机和其他虚拟机占用的时间越长,导致当前虚拟机的CPU资源不足。如果%st长时间大于0,说明CPU资源没有得到满足。这时候可以考虑将虚拟机移到另一台机器上,或者减少当前机器上运行的虚拟机数量。上述统计项目之和等于100%。除了%idle,其他任何值过高都说明系统有问题,需要具体问题具体分析。Troubleshooting%usistoohigh:表示用户态进程占用CPU过多。通过top命令可以清楚的看到是哪个进程。如果这不是预期的行为,您可以杀死相应的进程或通过kill命令重新启动它。它的%sy过高:如果只是偶尔过高,不用担心,但如果持续上升,就需要注意了。可能是某些进程的系统调用过于频繁,比如进程不断向控制台输出日志。但是如果用户态进程没有问题,那么可能是内核中的代码有问题,尤其是驱动模块的代码写得不好。%ni太高:这意味着有人用nice程序运行了一个耗费CPU的进程。如果niceness值大于0,不用担心,因为它的优先级低于默认优先级,不会影响CPU性能,但最好确认进程不会抢占系统其他资源,例如内存、磁盘I/O等,以避免影响系统的整体性能。如果niceness值小于0,说明该进程优先级高,占用CPU资源多。需要保证进程占用的CPU资源符合预期。如果没有,可以使用top命令找到并杀掉或者重启。%wa过高:说明系统中有进程在做大量的I/O操作,或者读写速度慢的I/O设备,比如频繁读写磁盘,可以使用iotop命令查看哪些进程占用了I/O??,然后针对不同的进程做相应的处理;另一种情况是系统频繁使用交换分区,此时需要解决的是内存问题,而不是I/O问题。%hi或%si太高:如果%hi太高,通常是硬件有问题,如果%si太高,通常是内核中的代码有问题%st太高:As上面提到,如果%st过高,说明当前虚拟机没有获得足够的CPU资源。这时候可以考虑将当前的虚拟机移到另一台主机上,或者想办法减轻当前主机的负载,比如关掉一些其他的虚拟机。结论Loadaverage和%Cpu(s)以不同的方式给出主机当前的CPU负载。通过%Cpu(s),我们可以看到系统当前的实时负载情况。现在很多监控系统每隔一段时间就会收集一次数据。%Cpu(s),然后存储起来图形化显示,这样可以很直观的看到CPU负载的变化。当然,如果没有这样的监控系统,你也可以通过loadaverage负载平均值(最多15分钟)大致知道最近一段时间。请参阅了解Linux和其他类Unix系统上的平均负载了解LinuxCPU负载了解LinuxCPU统计信息