cpu使用率分析

发布于 2013-07-06 16:35:14
各位好!
在近在用RT的时候需要在里面添加查看CPU使用率,找到了rt自带的cpu使用率的历程,自己对比源码分析了一下其实现的思路,如有不对的地方欢迎指正,再次谢谢各位!

RT里面提供的CPU使用率函数,
首先把cpu_usage_idle_hook函数添加到RT空闲钩子函数上,通过rt_thread_idle_sethook(cpu_usage_idle_hook); 函数实现,在添加钩子函数之后只有在进入空闲线程的时候才会执行此钩子函数cpu_usage_idle_hook,
然后在钩子函数里面,首先在进入 rt_enter_critical(); (关闭中断和调度)相当于CPU全速模式,计算total_count 在一个相对时间 rt_tick_get() - tick < CPU_USAGE_CALC_TICK 10个时钟周期(100ms) 累加的数值, 把这个累加出来的数值作为CPU在100ms 关闭中断和调度的情况下能够处理数据的”标准“ ,

这部分源码:
if (total_count == 0)
{
/* get total count */
rt_enter_critical();//进入临界区

tick = rt_tick_get(); //得到当前系统时钟节拍

//10个时钟周期 100ms
while(rt_tick_get() - tick < CPU_USAGE_CALC_TICK)
{
total_count ++;
loop = 0;

while (loop < CPU_USAGE_LOOP)
loop ++;
}

rt_exit_critical();//离开临界区
}


接着计算 count 数据,这个count 数据每个调度周期都是变化的,根据空闲线程被调度的时间,同样是在10个系统时钟周期100ms的时间,计算出在不关闭中断和调度的情况下,count数据能够累加的数据,通过这个累加的数值反映出空闲线程的执行时间,然后通过total_count数值就可以计算出系统在一个相对时间的使用率,

count = 0;

tick = rt_tick_get();//得到当前系统时钟节拍
//10个时钟周期 100ms
while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK)
{
count ++;
loop = 0;
while (loop < CPU_USAGE_LOOP)
loop ++;
}


最后根据total_count 和count数值计算cpu使用率
计算公式:
count = total_count - count;
cpu_usage_major = (count * 100) / total_count;
cpu_usage_minor = ((count * 100) % total_count) * 100 / total_count;


如total_count = 100;count = 80;

则可以计算出CPU在一个相对时间内占用率是20%.
主要思路是根据在一个相对时间(100ms)空闲线程执行的时间来计算,空闲线程执行的时间越长,证明CPU使用率越低,反之亦然。

查看更多

关注者
0
被浏览
10.2k
15 个回答
prife
prife 2013-07-06
赞一下,学习。
ufbycd
ufbycd 2013-07-06
为何不计算每个线程的CPU使用率呢?
aozima
aozima 2013-07-07
拒绝白嫖,拒绝键盘侠!
为何不计算每个线程的CPU使用率呢?

有道理,感觉很有用。
grissiom
grissiom 2013-07-07
total_count 是不变的吧,或许应该在初始化的时候校准一下就行。而且这个校准应该是在中断关闭的情况下进行的?

如果在 TCB 里加一些统计量,统计各个线程所使用的时间片,那么 CPU 使用率就可以不用这种方式计算了~
bernard
bernard 2013-07-07
计算每个任务的CPU占用率就不是这么计算的了
weiyuliang
weiyuliang 2013-07-08
total_count 是不变的吧,或许应该在初始化的时候校准一下就行。而且这个校准应该是在中断关闭的情况下进行的?

如果在 TCB 里加一些统计量,统计各个线程所使用的时间片,那么 CPU 使用率就可以不用这种方式计算了~

total_count就是在关闭中断和调度的情况下进行一次累加,
查看每个线程CPU使用率是不是在每个线程的TCB里面添加一个时间片信息。等所有线程调度完之后,根据每个TCB里面时间片和调度一次总的时间片,两个比值就可以计算所占用的比例那?
E.G:系统调度完成一次所用的时间片是100,一个线程TCB统计的这个线程的时间片是10 则可以表明此线程在上个调度周期CPU使用率10%?
weiyuliang
weiyuliang 2013-07-08
计算每个任务的CPU占用率就不是计算的了


看每个线程CPU使用率是不是在每个线程的TCB里面添加一个时间片信息。等所有线程调度完之后,根据每个TCB里面时间片和调度一次总的时间片,两个比值就可以计算所占用的比例那?
E.G:系统调度完成一次所用的时间片是100,一个线程TCB统计的这个线程的时间片是10 则可以表明此线程在上个调度周期CPU使用率10%?

能否提供一个思路?
bernard
bernard 2013-07-08
时间片的粒度太粗,所以不能够使用时间片的方式进行。
ufbycd
ufbycd 2013-07-08
时间片的粒度太粗,所以不能够使用时间片的方式进行。

嗯。FreeRTOS的做法是用一个比时间片更快的物理定时器来进行计算的。
有空可以研究下FreeRTOS的 configGENERATE_RUN_TIME_STATS 宏,及 void vTaskGetRunTimeStats( portCHAR *pcWriteBuffer ) 函数。
sunnydragon
sunnydragon 2013-08-03
建议在新版本中能集成获取当前CPU总利用率功能~要是能再获取每个线程的CPU利用率就更好了~
jimoom
jimoom 2018-11-28
统计CPU使用率,进入临界区,等待100ms,这个100ms不是白白浪费了,这个统计方法只能零时用下。放下系统下运行,CPU白白被浪费,而且严重影响实时性。
黄河馨
黄河馨 2018-12-23
我使用CM3例程,仿写利用率,使用浮点数,为什么显示不了呢
li_23
li_23 2019-07-07
好像有个错误,rt_enter_critical();只能关闭调度,中断是能响应的
通宵敲代码
通宵敲代码 2020-09-09

分析的很详细,学习了

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友