python多进程cpu利用率高,shell和python哪个执行效率高
在Linux下,可以通过top命令检查CPU负载。其输出大致如下(
top - 01:24:41最多6分钟,2个用户,平均负载:00,0.03,0.00
CPU百分比:2.5美国、1.8 sy、3.1 ni、90.5 id、1.7 wa、0.0 hi、0.4 si、0.0 st
这里的负载平均和缩写us,sy,ni,id,wa,hi,si,st是什么意思?这些数值在什么范围内是合理的?如果数值超出合理范围,怎么办?这些问题我以后会讲。
平均负载
load average表示CPU的平均负载值,上例中的loadaverage3360.00、0.03、0.00分别表示当前CPU 1分钟、5分钟、15分钟的平均负载。这些载荷值是怎么来的?
这些数据来自文件/proc/loadavg,内核对它们进行汇总。
top uptime命令显示的内容来自这个文件。这里的平均负载是什么概念?根据proc帮助文件,这里的值是单位时间内处于运行状态和磁盘I/o等待状态的平均作业数。这里的运行状态和作业是内核的概念。现在我们简单解释一下:
对于内核来说,进程和线程就是作业。
正在运行的作业是指作业在内核运行队列中,等待或等待CPU调度。(用户空间进程正在运行,并不意味着它必须由CPU调度。它可能正在等待I/O,也可能处于睡眠状态,等等。)
某一时刻(瞬间)等待时刻表的过程多少不能反映整个系统的压力,所以这里取1、5、15分钟的平均值。
这个数值反映了一种什么样的压力状态?以这里的单核CPU为例。
小于1:表示一次忙的作业少于一个,单核CPU可以处理。
1)平均每次正好有一个作业忙,说明单核CPU可以处理。
(大于(1))表示平均一次有多个作业在忙,单核CPU一次只能处理一个任务,所以一定有一些任务在等待,系统负载重,情况
从上面可以看出,当大于1时,作业将不会被及时调度,会受到系统的影响。对于多核,大于1不一定是问题,因为可以一次调度多个作业。以4核CPU为例。如果值大于4,CPU就束手无策了。
什么是合适的平均负载?虽然实际上没有参考值,但是为了应对系统负载的变化,通常会预留一定的空间。建议控制在“0.7*核”以内,比如4核。0.7*4=2.8比较合适。如果超过这个值,就需要分析原因,开始解决。
%CPU
Load average通过统计平均等待运行的作业数来估计CPU繁忙程度,但%CPU(s)直接统计CPU处于不同状态的时间,比上面的load average更直观,所以实际上用的更多。
一般来说,CPU可以处于以下三种状态之一:
空闲:空闲,没有要调度的任务。
用户空间:运行用户空间的代码(用户状态)
内核:运行内核的代码(内核状态)
关于以上三种状态,内核又细分为更多的状态。这里以上面输出的八种状态为例进行说明:
2.5%:表示CPU运行用户状态代码的时间为2.5%。也就是说,用户状态程序正在运行。
1.8%:意味着CPU花1.8%的时间运行内核状态代码。内核管理系统的所有进程和硬件资源,所有内核代码都在内核状态下运行。此外,当一个用户态进程(如内存分配、I/O读写等。)需要访问硬件资源,它还需要从系统调用进入内核状态,执行内核代码。%sy高表示内核占用太多资源,或者用户进程启动太多系统调用。
3.1%:表示CPU在3.1%的时间内运行精度不为0的进程代码。默认情况下,进程的所有niceness值都是0,但是您可以命令nice来启动进程并指定一个niceness值。niceness的值范围从-20到19。值越小,优先级越高,由内核先调度。
90.5%:表示CPU有90.5%的时间处于空闲状态。
1.7%:表示CPU有1.7%的时间处于I/O等待状态。一般CPU进行I/O操作时,先触发I/O操作,再进行其他操作。I/O操作完成后,CPU继续工作。但是,如果系统空闲,CPU无法执行其他操作,CPU将处于等待状态,等待时间将被计为I/o等待。也就是说,CPU的I值高表示CPU忙,I/O操作多或者I/O操作慢,而I/O值低表示没有I/O操作或者I/O操作快,所以CPU可能忙。
0.0 hi 0.4 si:这两个值反映了CPU在中断处理上花了多少时间。硬件。
中断)是硬件中断,si(软中断)是软件中断。硬件中断一般是由I/O设备引起的,比如网卡、磁盘等。硬件中断发生后,CPU需要立即处理。当硬件中断中有很多事情需要处理时,内核会产生相应的软中断,然后把不需要马上处理的耗时操作放到软中断中执行。例如,当网卡接收到一个网络数据包时,CPU需要立即将数据复制到内存中,因为网卡的缓存很小。如果不及时处理,后面的数据包就进不来,造成丢包。当数据复制到内存中时,就不需要这么匆忙地处理了。此时,用于处理数据包的代码(协议栈)可以在软中断中执行。我不是内核专家。关于软中断的部分,请参考《了解Linux内核,第三版》。
0.0st: %st与虚拟机相关。当系统在虚拟机中运行时,当前虚拟机将与主机和其他虚拟机共享CPU。% st表示当前虚拟机正在等待CPU为其服务。该值越大,主机和其他虚拟机占用物理CPU的时间越长,导致当前虚拟机的CPU资源不足。如果%st长时间大于0,CPU资源得不到满足。此时,请考虑将虚拟机移动到另一台计算机上,或者减少当前计算机上运行的虚拟机数量。
以上统计项目之和等于100%。除了%idle,其他任何一项数值过高都说明系统有问题,需要具体分析。
解决纷争
%us太高:这意味着用户模式进程占用了太多的CPU。通过top命令可以清楚的看到是哪个进程。如果这不是预期的行为,您可以通过kill命令终止相应的进程或重新启动它。
%sy过高:如果只是偶尔过高,不用担心,但如果一直高下去,就要注意了。可能是一些进程频繁的进行系统调用,比如进程不断的向控制台输出日志,但是如果用户态的所有进程都没有问题,可能是内核的代码出了问题,尤其是驱动模块的代码写的很差。
%ni太高:意味着有人用一个好看的程序运行了一个消耗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太高:如上所述,%st太高,这意味着当前虚拟机没有获得足够的CPU资源。这时,可以考虑将当前的虚拟机迁移到另一台主机上,或者尝试降低当前主机的负载,比如
平均负载和CPU百分比以不同的方式给出了当前主机的Cpu负载。通过%Cpu(s ),我们可以看到系统当前的实时负载。现在很多监控系统每隔一段时间就会采集%Cpu(s),然后存储起来图形化显示,这样我们就可以直观的看到Cpu负载的变化。当然,如果没有这样的监控系统,我们大概可以通过负载平均了解一下。
涉及
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。