实时任务带宽控制

来源:互联网 发布:四大公司人工智能 编辑:程序博客网 时间:2024/06/05 16:03

/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;”


RT Throttling是对分配给实时进程的CPU时间进行限制的功能。使用实时调度策略的进程由于bug等出现不可控错误时,完全不调度其他进程,系统就会无响应。通过限制分配给实时进程的每个单位时间的CPU时间,就可以防止使用实时调度策略的进程出现bug。

还可以指定单位时间内分配多少CPU时间给实时进程。标准设置的单位时间是1秒,CPU分配时间是0.95秒,非实时进程每1秒也可以使用CPU 0.05秒。

可是对分配给实时进程的CPU时间进行限制,会不会对实时处理造成影响呢?答案是不会。正如在关于实时性的介绍中提到的,对某个处理使用实时策略,是为了满足实时限制,即在一定时间内完成处理。如果对实时性有要求的进程占用CPU时间,就不能实现实时性。

为使用实时调度策略的进程的处理分配所必需的或实时限制量的CPU时间,就可以防止系统的实时进程出现不可控错误等意外情况。

系统的整体设置

整个系统的CPU时间设置可以使用sysctl来获取、设置。最近的内核都可以通过sysctl来限制实时进程能够使用的CPU时间。

下列为获取当前值的例子。这个例子中使用的是标准设置,单位时间为1秒,CPU分配时间为0.95秒。
sysctlnkernel.schedrtperiodus1000000sysctl−nkernel.schedrtperiodus1000000 sysctl -n kernel.sched_rt_runtime_us
950000

设置示例

要将CPU分配时间改为0.9秒,可以执行下列操作。
# sysctl -w kernel.sched_rt_runtimes_us=900000

另外,将CPU分配时间指定为–1,对实时进程的CPU时间限制就会消失。这与内核导入该功能之前的行为是一样的。
# sysctl -w kernel.sched_rt_runtime_us=-1

当然,也可以从proc文件系统存取。
/proc/sys/kernel/sched_rt_period_us
/proc/sys/kernel/sched_rt_runtime_us

当CONFIG_RT_GROUP_SCHED有效时,受到Cgroup设置值的限制,不能进行与Cgroup中的有效值相矛盾的设置。但是在这里,将sched_rt_runtime_us设置为–1,是用来使RT Throttling失效的设置。

一般来说,sysctl中的设置仅用于有效(启用)与无效(关闭)的切换,单个设置需要使用Cgroup来进行。

Cgroup中的设置

RT Group Scheduling是Cgroup的子系统。要使用RT Group Scheduling,必须启用CONFIG_RT_GROUP_SCHED。可以与其他Cgroup一样通过cgroup文件系统进行设置(参考Hack #7)。
# mount -t cgroup cgroup /cgroup

与RT Group Scheduling相关的项目有下面两个。可以对每个分组分别设置RT throttling的单位时间与CPU分配时间。
cpu.rt_period_us
cpu.rt_runtime_us


原创粉丝点击