外国服务器,香港服务器,美国服务器,高防服务器,服务器租用,服务器托管
首页 > 新闻资讯 > 极客学院
如何了解CPU使用率
2019-01-06 13:45:11 | 来源:极客网络 | 作者:liuchuang

      也许您看到本节的标題就会感到莫名其妙,什么!CPU利用率我都不知道?我用了这么多年的计算机,无论是 Windows、 MAC OS还是Linux,看过系统无数的我熟知这个概念,还经常用top等命令查看CPU利用率呢!

      好吧,那您先淡定,您说说看,什么是CPU利用率?我估计大多数的答案应该类似:CPU利用率是单位时间内的CPU使用量与全部CPU资源之比。其实这个答案是差不多的,但还是有些不完美。由于服务器中CPU核心个数很多,每个CPU都是独立运作的,它们是真正意义上的并行(这是多处理器架构的意义),因此各CPU的使用率是独立的,即可以存在这样的情况:有的CPU很忙,有的CPU很闲。但作为整体来看,服务器上所有CPU的利用率可以反映出整机的繁忙程度,我们同样需要从整体上把握CPU的使用情况。最重要的是,CPU是给软件服务的,这是指用户进程等调度单元,我们最关心的是菜个进程使用了多少CPU资源,也就是进程的CPU利用率是多少,因此CPU利用率其实分为3个粒度来考虑:

      (1)单个CPU核心的利用率

      (2)整机CPU利用率

      (3)进程的CPU利用率。

      这3种CPU利用率有各自的算法,通过下面的讨论您便了解各个粒度的CPU利用率的概念。

      操作系统是以时间片来为系统记时的,它是最本质的时间单位,我们看到的其他更人性化的时间格式都是通过它转换的。需要注意的是,时间片是个累积量,无论是针对CPU级别还是进程级别,从操作系统被加載到内存并掌权后,操作系统为它们记录各自的时间片累积数,这个量会一直累积增长,直到关机或进程结束生命周期。比如在A时刻,CPU运行了10个时间片,在B时刻,CPU运行了16个时间片,在B-A这段时间内,CPU运行了6个时间片的时间。对于进程也一样,我们在ps命令中看到的进行运行时间,它最初也是时间片,操作系统在进程的PCB中用专门的一个字段(通常是64位宽度)来记录进程运行的时间片,顺便提一句,这个功能称为进程记账,ps命令将它获取后再将其转换成我们更熱悉的时间格式。

      CPU利用率是指一段时间内CPU消耗的度量,强调的是经过一段时间内测出来的,就像速度一样,其概念是单位时间内移动的距离,即使给飞速行驶的F1方程式赛车拍照,也无法从静止的照片上获取其速度,这是同一个道理,这也解释了为什么top命令要有个时间间隔,默认是2秒。总的来说CPU利用率的实现原理是:在单位时间内连续两次采样CPU的时间片数,由于其是累积量,因此要取其差以获取增量,然后再经过后续处理得到不同级别的CPU利用率。具体是怎样的后续处理,下面分别讨论一下。讨论仅是在原理层面,后面我们有实践的部分.

      1.单个CPU核心的利用率

      通过一定的时间间隔,周期地对某个CPU核心上的idle线程运行的时间片数和该CPU运行的时间片数进行两次采样,分别将两次采样值各自取其差,然后进行环比,最后再将比值乘以100%,所得的百分比便是该CPU的空闲率。

      服务器中有多个CPU,我们用其中的一个CPU-CPU1来举例说在时间A对CPU1的idle线程运行的时间片数和CPU1的总运行时间片数采样,采样值分别为 cpu1_ idle_ slices_A和cpul_ total sices A然后在时间B同样对CPU1的idl线程运行的时间片数和CPU1的总运行时间片数采样,采样值分别是 cpu1_idle_ slices_B和cpul_total_ slices_B。那么在B-A这段时间里,CPU1的空闲率公式便为:

                 (cpu1_idle_slicesB- cpu1_idle_slices_A)/(cpu1_total_slices_Bcpu1_total_slices_)"100%

      相应CPU1的利用率便为100减去上面公式的结果。如果CPU1很繁忙,idle线程一直未被调度运行,CPU1的空闲率便是0%,即利用率是100%。

      2.整机CPU利用率

      通过一定的时间间隔周期对所有CPU上idle线程运行的时间片数和所有CPU运行的时间片数进行两次采样,分别将两次采样值各自取其差,然后进行环比,也就是用这段采样周期内所有CPU核心上idl线程运行的时间片数之和,比上这段采样周期内所有CPU运行的时间片数之和,最后再将比值乘以100%,所得的百分比便是所有ile线程在所有CPU上的利用率,也就是系统的整体空闲率。这就是我们在top命令中显示的xxid,如90%id。这表示整机的空闲率是90%,即利用率是100%90%=10%。

      假设服务器上有8个CPU,各CPU繁忙程度不一致,有的CPU很闲,又运行idle线程,有的CPU很忙没有闲暇运行idle。不过这不重要,我想和大家说的是,虽然是计算idle的利用率,但与idl是否正在运行关系不大,我们只要获取到idle的时间片就行,如果哪个CPU没有运行idle,在该CPU上获取的idle累积量和上次获取的累积量是相同的也就是增量为0,即没有运行,这在后面会给大伙介绍。

      假如在时间A对所有CPU上的idle线程运行的时间片数和所有CPU运行的时间片数采样,采样值分别是 cpuall_idle_ slices_A和 cpual_total_ slices_A,然后在时间B同样对所有CPU上的idle线程运行的时间片数和所有CPU运行的时间片数采样,采样值分别是 cpuall_idle_ slices_B和 cpuall_total slices_B,那么在B-A这段时间里,整机CPU空闲率公式便为:
(cpuall _idle_slices_b-cpuall idle_slices_A)/(cpuall_totalslices_b-cpualltotallslices_A)*100%同样,相应整机的CPU利用率便为100去上面公式的结果。

      以上两类CPU利用率主要是看CPU是否运行了idle线程,属于CPU级别的。由于运行哪个任务是由操作系统的任务调度器决定的,换句话说,只有当操作系统发现没有任务可运行时才会去执行idle线程,因此但凡idle在运行,就表示CPU有多余的空闲资源。

      3.进程的CPU利用率

      进程的CPU利用率同样是需要两次采样才能得到,但却与前两种CPU利用率有很大不同,我们好好聊聊这件事。

      也许有读者说了:“不是很简单吗,按道理应该是用进程消耗的时间片数比上CPU运行的时间片数,是这样吧?”不得不承认,按理说确实是这样,但是,前面和大家强调过,进程在任意时刻只会在一个CPU上运行,当服务器上有多个CPU时,保不准进程会在多个CPU之间来回转移,比如当前CPU负載已经很高了,利用率已接近100%了,当下一次该进程重新运行在CPU上时,调度器会根据实际CPU负载情况,将其换到另一个负載较轻的CPU上执行,也就是很可能并不是之前的CPU了,换了一个CPU。尽管切换CPU这在一定程度上会影响性能,但由于进程之前所在的CPU的利用率已经是100%了,换到新的空闲CPU上对进程来说,得到了更多的执行机会,可以更早的结束运行,因此,利大于弊。除非所有CPU都比较繁忙,这时候保持CPU“亲和力”还是有意义的。说到这我猜您已经知道原因了,我们无法获知在两次采样期间,进程被换了多少个CPU运行,多个CPU是并行的,它们各自独立运行了一定的时间片数,虽然我们可以获取进程运行的时间片数,但没办法知道进程经过了哪些CPU(仅能知道最后一次是在哪个CPU上执行),因此不知道去获取哪些CPU在这段采样周期内运行的时间片数。当然,倘若是在单核。
       CPU上这还是行得通的,毕竟进程所在的CPU是明确的。

       基于这个原因,进程CPU利用率的计算原理采用了“时间比”,也就是进程的执行时间比上采样周期时间,所得的比值再乘以100%。但操作系统为用户进程记录的是进程的时间片数,因此,我们要将时间片数转换为时间。转换的方法也很简单,将时间片数除以 syscon_SC_ CLK TCK换成以秒为单位的时间,然后再除以以秒为单位的采样时间。当然,如果是以秒这种粗粒度的时间去比较,在取整时将丢掉syscon_SC_CLK_TCK)以内的精度,必然会造成一定的误差,因此,常常换算为以毫秒为单位的时间比。原理是这样的,具体取决于实现,如果要以微秒为单位采样也是可以的。

最新新闻

查看更多

相关新闻

查看更多

推荐优选服务器

国内外服务器租用、服务器托管,365天24小时极致服务体验~认准极客网络!
在线咨询
24H在线售后
11082052
24H服务热线
0769-88836624
IDC/ISP/IRCS/增值电信业务经营许可证号:粤B1-20190887
COPYRIGHT © 2010-2018 广东极客网络科技有限公司 版权所有.粤ICP备18157343号
极客网络提供:服务器租用,服务器托管,高防服务器,香港服务器,美国服务器,韩国服务器,日本服务器,台湾服务器,免备案服务器,bgp高防服务器,站群服务器,等外国服务器IDC服务;敬请放心选购!

在线
客服

客服
热线

0769-88836624
7*24小时服务热线

关注
微信

马上推出关注官方微信
顶部