分类: LINUX
2012-02-18 15:42:04
/proc/sys/kernel/sched_rt_runtimes_us,默认:950000
/proc/sys/kernel/sched_rt_period_us,默认:1000000
在使用该功能时,当实时任务的带宽用尽时(sched_rt_runtime_us),内核会将对应的实时运行队列rt_rq给插起来(throttle)即禁止系统调度实时任务;之后不管是否有非实时任务存在,实时任务都禁止运行。
实时任务的带宽用尽后发现没有其它非实时任务可运行便调度到idle任务运行,idle任务运行的过程中rt_rq一直保持着被插状态,内核会维护一个解插hrtimer来负责超时后(sched_rt_period_us)解除rt_rq的被插状态。
如果刚好在rt_rq保持被插状态的过程中,将sched_rt_runtime_us通过/proc接口动态修改为-1表示禁用掉带宽控制功能,内核会配合此操作销毁掉解插hrtimer定时器,这样问题就会出来,导致没有人来解插rt_rq,以致于实时任务一直得不到运行。
从这个角度来讲,实时任务带宽控制功能在设计上有点缺陷,应用起来有些不便,在嵌入式实时系统中建议禁用掉此功能,标准Linux这样设置默认值是为了应用于服务器领域。如果需要禁用,必须在kernel/sched.c中:修改“int sysctl_sched_rt_runtime = 950000;”为“int sysctl_sched_rt_runtime = -1;”