RT Throttling

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秒。


$sysctl-n kernel.sched_rt_period_us

1000000

$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