TOP CPU占用率原理及与实时线程的冲突

linux下通过top或vmstat查看系统CPU占用率,在大多数情况下测得的CPU占用率是准确的,但在时间精度较高的实时linux系统中,top测量的CPU占用率可能会不准确,下面结合top原理和实时linux实例分析在实时系统中top的使用情况。

统计CPU占用率的时候,大致统计以下几个时间:

用户时间(User time)、系统时间(System time)、等待时间(Waiting time)、空闲时间(Idle time)、Nice时间、硬件终端处理时间等

其中主要计算用户时间、系统时间和空闲时间,基本上这三个时间的百分比之和就是100%。我们知道使用top统计CPU占用率时,top的刷新频率是可以更改的,默认情况下是3s刷新一次,也可以改为1s、0.1s等,既然top的刷新频率可以更改,那么top的最高刷新频率是多少,CPU的占用率又是怎样计算的呢?实际使用中,top中的数据是读取/proc/stat文件获得的,/proc/stat文件被读取时会自动更新,从而top获得最新的CPU占用率情况,但是/proc/stat文件也有刷新精度,它的刷新精度为每个时钟中断周期,即/proc/stat文件中的数据最快可以每个tick更新一次,每个时钟中断到来,系统查看当前CPU正在运行的进程,如果是用户态进程,kernel_stat数据成员中对应的用户态记录数据增加一个tick,如果是内核态,则对应内核态成员记录增加,top占用率的由来就是通过统计当前CPU每个tick运行进程种类得出来的,如用户时间CPU占用率=用户进程tick/总tick。正常情况下,我们知道linux是以时钟周期为基础进行进程调度,基本上在一个时钟周期中不会发生进程调度,所以用top统计CPU占用率不会出错。

但是在rt-linux中,时间颗粒精度不再是tick,有可能比tick更小,这个时候有可能出现一些进程或线程,它们的调度更加频繁,例如在tick=2ms的实时linux中,有一个以1ms为周期的实时进程,这个时候我们用top统计实时进程所用CPU的CPU占用率的时候,就有可能得到不准确的结果。如下图所示,当前CPU运行以1ms为周期的实时进程,红色表示进程在处理数据,CPU忙,白色表示进程没有处理数据,CPU空闲。因为实时进程和tick都是周期性的,且实时进程周期小于tick,所以有可能出现下面两种情况。第一种是启动实时进程的时刻,恰好时钟中断在CPU忙时统计当前CPU占用情况,又因为tick为实时进程周期的整数倍,所以时钟中断统计到的永远都是CPU忙的时刻,这个时候反映在top上的结果就是当前CPU占用率为100%。而第二种情况,恰好时钟中断在CPU空闲时刻统计当前CPU占用情况,得到的结果永远都是CPU处于空闲状态,反映在top上时CPU占用率为0,。由上面的例子可以看出,当linux的始终粒度小于tick的时候,top的统计结果有可能是不准确的


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值