《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #9 RT Group Scheduling 与RT Throttling

时间:2023-01-21 08:52:23

HACK #9 RT Group Scheduling 与RT Throttling

本节介绍对实时进程所使用的CPU时间进行限制的功能RT Group Scheduling和RT Throttling。
RT Group Scheduling和RT Throttling功能是用来限制使用实时调度策略的进程的CPU时间。内核2.6.25以后的版本都可以使用这个功能。
本节将介绍如何使用RT Scheduling和RT Throttling来限制实时进程的CPU时间。
为了让Linux系统能够应用到需要实时性的领域,Linux的进程调度程序采用的是实时调度策略(参考Hack #8)。
实时调度策略具有静态优先级,调度的优先级比其他一般进程高,需要执行时一定会分配CPU时间。如果实时进程陷入无限循环,就会占用CPU,其他处理完全无法运行。
该功能通过限制实时进程的CPU时间,使执行权即使在这种情况下也能切换到其他进程,可以避免产生系统死机的问题。
实时
实时功能的目的是实现满足实时限制的处理,即,在有限时间内得到处理结果。也就是将对特定事件进行处理的延迟控制在一定时间以内,在有意义的时间内一定作出应答的功能。因此,即使在内核运行过程中,也能迅速切换到要处理事件的进程。因此内核内部设置了优先权点(preemption point),可以根据事件立刻切换到实时进程。
要求实时性的处理,如图形处理。在实时图形处理中,画面更新的处理应当配合显示器上显示的刷新来进行。这个实时处理中重要的是要在一定时间(刷新率)内完成图形处理。
分配CPU时间提高吞吐量的目的和实时的目的是不同的,这点经常容易混淆。
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

小结
在需要实时性的领域,必须向进程赋予实时调度策略,将延迟控制在一定数量以下。但是,实时进程因bug等发生不可控错误时,就可能出现系统自身无法应答的情况。
使用RT Group Scheduling功能,可以仅分配实时进程真正需要的CPU时间,从而防止系统进程发生不可控错误等。
参考文献
Documentation/scheduler/sched-rt-group.txt
—Hiroshi Shimamoto