适用于 Solaris 2.6 (SPARC 平台版) 的 Solaris Resource Manager 1.0 系统管理指南

第 6 章 SHR 调度器

Solaris Resource Manager SHR 调度器用于控制 CPU 资源的分配。份额的概念使得管理员可以轻松地控制用户、组和应用程序对 CPU 资源的相对权利。份额的概念与公司的股份的概念相类似;重要的不是您持有多少,而是与其他股东相比有多少。

技术描述

每个 lnode 有四个与 Solaris Resource Manager 调度器相关联的属性:cpu.sharescpu.mysharescpu.usage 以及 cpu.accrueliminfo(1SRM)的输出所显示的是这些属性以及其它有用的值。

Solaris Resource Manager 调度是借助 SHR 调度类加以实现的。其中包含对dispadmin(1M)priocntl(1)nice(1)以及 renice(1)命令的支持,在系统调用层,SHR 与 TS 调度类兼容。

份额

用户的 cpu.shares 属性用于相对于用户的父节点和活动的同级用户,分配 CPU 权利。用户的 cpu.myshares 属性只在用户拥有活动的子用户时才有意义;用于相对于这些子用户,确定 CPU 权利的比例。

例如,如果用户 A 和 B 是父节点 P 的唯一的两个子用户,则A、B 和 P 每个均拥有组 P 内的一个份额(即,A 和 B 的 cpu.shares 设置为1,而 P 的 cpu.myshares设置为1),因而三方各自均拥有合组的权利合计之三分之一的 CPU 权利。

这样,某一用户的实际 CPU 权利取决于其父节点的相对权利。而后者又取决于父节点相对于父节点的同级用户以及相对于祖父节点的 cpu.myshares 的父节点的 cpu.shares 相对值,依此在调度树往上类推。

出于系统管理的原因,附加到根 lnode 的进程并不受制于份额属性。任何附加到根 lnode 的进程如果要求的话,总是被给予几乎全部的 CPU 资源。

没有将任何 CPU 密集型的进程附加到根 lnode 这一点很重要,否则其它进程的执行会收到严重影响。为了加以避免,应当注意下列事项:

并不是所有的调度树中的组头目都必须代表正在运行进程的实际用户,因而在这种情形下,就没有必要向它们分配 CPU 份额。可以通过将其 cpu.myshares 属性设置为零来指示此类 lnode。此类组头目中的 CPU 应计属性仍旧包含对其组内所有成员所征的收费。

已分配份额

cpu.shares cpu.myshares 属性用于确定每个活动 lnode 的当前分配的 CPU 份额,形式是一个百分比。非活动用户的已分配份额对已分配份额没有任何区别。如果只有一个用户在活动,则该用户将拥有百分之100的可用 CPU 资源。如果只有同一组内份额相等的两个用户在活动,则每个用户将分得百分之50的份额。请参考 "已分配份额的计算",了解更多有关已分配份额的计算方法的信息。

利用率和衰变

每为一个 CPU 周期而对附加到 lnode 的某个进程进行收费时,cpu.usage的属性就随之增加。利用率属性值呈指数性衰变,其速率由利用率衰变的全局 Solaris Resource Manager 参数确定。利用率衰变速率(以半衰期形式以秒钟为单位加以描述)是由 srmadm(1MSRM)命令加以设置的。

尽管所有的进程都拥有一个 lnode,无论其当前的调度类如何,但从来不对 SHR 调度类之外的进程进行收费。

应计利用率

应计利用率属性的增加数量与利用率属性相同,但从不衰变。因此它代表的是从上次属性复位以来附加到 lnode 及其成员的所有进程的累计利用率总额。

有效份额

某一 lnode 的已分配份额,与其 cpu.usage 属性一起,就确定了它的当前有效份额。 Solaris Resource Manager 调度器对附加到某一 lnode 的所有进程的优先权进行调整,使其工作速率与 lnode 的有效份额成正比,与附加到该 lnode 的可运行进程的数目成反比。

每一进程份额优先权(sharepri

每个附加到某一 lnode 的进程,均拥有内部的针对 Solaris Resource Manager 的数据,由操作系统核心为其进行维护。对于调度来讲,这些值中最为重要的是sharepri 值。在任何时候,sharepri 值最低的进程,将最有权得到调度,运行于某一 CPU。

份额分配示样

调度树结构

下面几点讲述调度树的结构,这是一个需要中央管理员予以特别考虑的方面:

树的描述

下面所显示的树定义了一个由多个组头目和多个普通用户组成的结构。树的顶层是根用户。一个组头目 lnode 是用两个整数显示的,分别代表的是它的 shares 和 myshares 属性。叶 lnode 是用单个整数显示的,代表的只是其 shares 属性的值。

图形 6-1 调度树结构

Graphic

已分配份额的计算

lnode A、C 和 N 目前附加有一些进程。在最顶层,CPU只需由 A 和 M 来分享,因为 W 或者调度组 W 的成员都没有任何进程。A 和 M 之间的份额比率为 3:1,所以最顶层处的已分配份额为 A 组百分之75,M 组百分之25。

分配给 A 组的百分之75又会由其活动用户(A 和 C)分享,比率为其在 A 组中的份额(即,1:2)。注意,确定 A 的相对于其子用户的份额时使用的是myshares 属性。A 因而获得组所分配的份额的三分之一,而 C 获得其余的三分之二。为 M 组分配的份额全部归于 lnode N,因为它是唯一带有进程的 lnode。

可用 CPU 的已分配份额的整体分配因此为:A 是0.25,C 是0.5,而 N 是0.25。

请进一步设想 A、C 和 N 进程都不断地要求得到 CPU,而系统最多只有两个CPU。这样, Solaris Resource Manager 就对三方进行调度,以使单个的进程获得整个可用 CPU 的上述的百分比:

单个进程的进度速率得到控制,以满足每个 lnode 的目标。在拥有两个以上 CPU和唯独这六个可运行进程的系统上,C 进程将无法消耗其百分之50的权利,剩余权利由 A 和 N 按比例分享。

Solaris Resource Manager 与 Solaris nice 程序的关系

Solaris 中的 nice 程序使得用户可以降低某一进程的优先权,从而正常的进程不会被不紧急的进程拖后腿。借助 Solaris Resource Manager ,激励用户使用该程序的地方在于,在较低优先权条件下使用 CPU 时间,其收费速率降低。

Solaris Resource Manager 允许中央管理员偏爱受优待的进程的 sharepri 衰变速率,从而取得上述效果。srmadm(1MSRM)命令中的 pridecay 全局 Solaris Resource Manager 参数,用于为拥有常规和最大 nice 值的进程的优先权设置衰变速率。所有介入nice 值的速率均内插其间,并外推至最低的 nice。例如,常规进程的优先权(例如,sharepri)可能会以两秒钟的半衰期得到衰变,而拥有最大 nice 值的进程的优先权可能会以六十秒钟半衰期得到衰变。

其结果就是,受到优待的进程所得的 CPU 份额比同一 lnode 上的其它进程要小。在 Solaris Resource Manager 下,nice 对不同 lnode 上的进程的执行速率几乎没有影响,除非可运行进程的队列超过 CPU 的数目。

Solaris Resource Manager 特别对待拥有一个最大的 nice 值的进程(例如,那些用 nice-19 命令起动的进程)。只有在没有其它进程请求周期的情况下才将周期给予此类进程;否则此类进程只能空闲下来。

如要了解有关 Solaris Resource Manager 与其它资源控制特性之间关系的信息,请参阅 "与其它 Solaris Resource Manager 控制特性的关系"

动态重新配置

Sun Enterprise 服务器的动态重新配置(DR)特性使得用户可以动态添加和删除系统插板,这些插板包含硬件资源,诸如处理器、内存以及 IO 设备。出于调度目的, Solaris Resource Manager 保持对可用处理器资源的跟踪,并适当处理所发生的变化,公平地将目前可用的处理器资源重新分配给合格用户/进程。

鉴于 Solaris Resource Manager 控制的只是进程的虚拟内存的大小,而不是进程和用户所使用的实在内存,针对内存进行的某一 DR 操作的作用,对 Solaris Resource Manager 的进程限制核对并不构成任何影响。

空闲 lnode

空闲 lnode(srmidle)是中央管理员所指派的 lnode,用于为核心所有的空闲CPU费用进行收费。安装时,空闲用户(username srmidle)是以41的值创建的。空闲 lnode 应当拥有零个份额,以确保只在没有其它进程在活动时才运行附加到该 lnode 的进程。空闲 lnode 是用 srmadm(1MSRM)命令指派的。

在启动时,默认的空闲 lnode 是根 lnode。而在向多用户模式过渡时,init.d(4)正文将把空闲 lnode 设置为 srmidle 帐户的 lnode,如果该帐户存在的话。可以对该特性进行定制,方法是在 /etc/init.d/init.srm 正文中指定使用一个不同的 lnode。

如果空闲 lnode 不是根,则其必须为根的一个直接子用户。

其它 lnode

其它 lnode(srmother)是系统管理员所指派的 lnode,用作初始安装后所创建的新用户的默认父 lnode(初始安装时,根为默认的父 lnode)。另外一个 lnode 是在安装时由系统自动创建的,其默认值为1个份额,以便附加到该 lnode 的 lnode 可以访问 CPU。

另外一个 lnode 应当没有资源限制,拥有1个或者更多的 CPU 份额,且没有特别的特权。

丢失 lnode

在 Solaris Resource Manager 下,setuid(2SRM)系统调用有一个副作用,就是将调用进程附加到一个新的 lnode。如果附加更改失败,典型原因是新的 lnode 并不存在,则该进程被附加到丢失 lnode(srmlost),后者是在您安装 Solaris Resource Manager 时创建的。如果此次附加也失败了,或者没有命名任何丢失lnode,则 setuid(2SRM)功能未受影响,而进程继续在其当前的 lnode上运行。

init.srm 正文在向多用户模式过渡的过程中设置丢失 lnode。可以对该性能进行覆盖,方法是在 /etc/init.d/init.srm 文件中指定使用一个 lnode。为了避免安全出现缺口,丢失 lnode 应当拥有一个 CPU 份额,且没有特别特权(如果您要更改这些值,请在进行更改时考虑该用户的要求。)