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

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

  1. 《Linux内核精髓:精通Linux内核必会的75个绝技》目录

    1章 内核入门HACK #1 如何获取Linux内核HACK #2 如何编译Linux内核HACK #3 如何编写内核模块HACK #4 如何使用GitHACK #5 使用checkpatch.pl检 ...

  2. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核

    HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法.“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各 ...

  3. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #15 ramzswap

    HACK #15 ramzswap 本节介绍将一部分内存作为交换设备使用的ramzswap.ramzswap是将一部分内存空间作为交换设备使用的基于RAM的块设备.对要换出(swapout)的页面进行 ...

  4. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #10 Fair Group Scheduling

    HACK #10 Fair Group Scheduling 本节介绍Cgroup之一.管理CPU资源的Fair Group Scheduling.Fair Group SchedulingFair ...

  5. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块

    HACK #3 如何编写内核模块 本节将介绍向Linux内核中动态添加功能的结构—内核模块的编写方法.内核模块Linux内核是单内核(monolithic kernel),也就是所有的内核功能都集成在 ...

  6. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #21FUSE

    HACK #21FUSE 本节将介绍使用用户进程的文件系统框架—FUSE.FUSE概要FUSE(Filesystem in Userspace,用户空间文件系统),是用来生成用户空间的一般进程的框架. ...

  7. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #20 使用fio进行I/O的基准测试

    HACK #20 使用fio进行I/O的基准测试 本节介绍使用fio进行模拟各种情况的I/O基准测试的操作方法.I/O的基准测试中有无数需要考虑的因素.是I/O依次访问还是随机访问?是通过read/w ...

  8. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #17 如何使用ext4

    HACK #17 如何使用ext4 本节介绍ext4的编写和挂载方法.开发版ext4的使用方法.ext4是ext3的后续文件系统,从Linux 2.6.19开始使用.现在主要的发布版中多数都是采用ex ...

  9. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #16 OOM Killer的运行与结构

    HACK #16 OOM Killer的运行与结构(1) 本节介绍OOM Killer的运行与结构. Linux中的Out Of Memory(OOM) Killer功能作为确保内存的最终手段,可以在 ...

随机推荐

  1. 流行得前端构建工具比较,以及gulp配置

    前端现在三足鼎立的构建工具(不算比较老的ant,yeoman),非fis,grunt,gulp莫属了. fis用起来最简单,我打算自己得项目中使用一下fis. 先说一下gulp安装吧. 第一步:安装n ...

  2. apache配置文件详解与优化

    apache配置文件详解与优化 一.总结 一句话总结:结合apache配置文件中的英文说明和配置详解一起看 1.apache模块配置用的什么标签? IfModule 例如: <IfModule ...

  3. Android之利用JSBridge库实现Html,JavaScript与Android的所有交互

    java 和 js互通框架 WebViewJavascriptBridge是移动UIView和Html交互通信的桥梁,用作者的话来说就是实现java和js的互相调用的桥梁. 替代了WebView的自带 ...

  4. 局域网内web地图的简单实现

    首先,我先说一下这次的主要目的.我们的想法是在不连互联网的局域网中搭起来一个地图服务,类似于百度地图的网页版本,功能最少要有看地图.放缩.标记.批量标记.实时经纬度坐标.这个东西还是让我费了一番力气( ...

  5. Gitlab项目用ssh克隆

    Gitlab项目用ssh克隆 1.  新建一个文件夹并用git bash here 打开 2.  在git bash here 输入命令行 ssh-keygen –t rsa –C“邮箱名” 3.  ...

  6. python批量给云主机配置安全组

    python批量给云主机配置安全组 用公有云的思路去思考去实现一个安全稳定.可伸缩和经济的业务构架,云运维是有别与传统运维的,比如说了解公有云的都知道安全组的概念,安全组跟防火墙功能很相似,那我的机器 ...

  7. qt Cannot connect creator comm socket /tmp/qt_temp.S26613/stub-socket: No such

    Tool->Options->Environment->General 将terminal改为 xterm -e

  8. 在Google Maps中导出KML文件

    教你一招:在Google Maps中导出KML文件 2011-07-11 15:24:49 4819 人阅读 作者:上方文Q 编辑:上方文Q [复制链接] [爆料] Google Earth的一大乐趣 ...

  9. SQL中注意数据类型对性能的影响

    在数据存储的时候有时我们不太注意字符编码对性能影响,但小问题往往造成很大的影响.在数据量小的时候感觉不出来,一旦上到百万级以上的时候就非常明显了 看下面两个SQL语句 ---SQL1 SELECT * ...

  10. vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb

    vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb << 返回vim使用进阶: 目录 本节所用命令的帮助入口: :help vimgdb 在UNIX系统最初设计时,有一 ...