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的统计结果有可能是不准确的

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

TOP CPU占用率原理及与实时线程的冲突,布布扣,bubuko.com

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

上一篇:Android入门学习教程PDF免费下载


下一篇:服务端新开多线程使用HibernateSession 杜绝No session