zoukankan      html  css  js  c++  java
  • 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #9 RT Group Scheduling 与RT Throttling

    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

  • 相关阅读:
    (C#基础) byte[] 之初始化, 赋值,转换。
    System.IO.IOException: The handle is invalid.
    .NET 自动内存管理(垃圾收集GC)
    Inconsistent accessibility
    有用的网址
    dw添加emmet
    行内标签,怎么取消两个标签中间的距离
    2016.6.2近日学习计划
    HTML5 input placeholder 颜色修改示例
    加入收藏和设为首页
  • 原文地址:https://www.cnblogs.com/tcicy/p/8552690.html
Copyright © 2011-2022 走看看