本章介绍 Solaris Resource Manager 的工作原理和重要概念。工作负荷配置 提供了一个补充描述的例子并介绍简单的分层结构。(更复杂的分层结构的例子请参阅 第 10 章,高级用途。)
Solaris Resource Manager 是围绕被称作 lnode(限制节点)的 Solaris 内核的基本附加而建立的。lnode 对应 UNIX 用户 ID (UID),并可代表每个用户、多组用户、应用程序和特殊的要求。lnode 是按照 UID 进行分类索引的;它们用于按用户、组和应用程序级别上的进程来记录资源分配政策和应计资源利用率数据。
虽然 lnode 是由 UID 标识的,但它与影响许可的证明相分离。证明结构可确定一个进程是否能读、写和修改一个文件。lnode 结构用于跟踪资源限制和利用率。
在某些情况下,用户可能希望使用不同组的限制。这可以通过使用 srmuser(1SRM) 附加到一个不同的 lnode 上来实现。请注意,这样的更改不会影响仍与原始 UID 相关联的证明结构,并且所有进程仍保持相同的许可。
Solaris Resource Manager 管理模型将 lnode 组织成一个被称作调度树的分层结构。该调度树是按 UID 进行组织的:每个 lnode 都参照该 lnode 在树中父节点的 UID。
调度树的每个子树被称作一个调度组,在调度组的根部的用户就是组长。(root 用户是整个调度树的组长。)设置了 flag.admin 标志意味着,授权组长管理调度组内资源策略的能力。
lnode 最初是通过对 UID 文件进行分析而创建的。安装了 Solaris Resource Manager 之后,应使用 lnode 管理命令 (limadm(1MSRM)) 创建附加的 lnode,并将它们分配给父节点。调度树数据存储在平面文件数据库中,该数据库可根据需要使用 limadm 进行修改。
虽然由 lnode 使用的 UID 并不一定要与系统帐户相对应,并在系统口令映射中有一个相应的条目,但是我们建议用户为每个 lnode 的 UID 都创建一个系统帐户。在非叶节点的 lnode(在分层结构中下方有附属 lnode 的 lnode)的情况下,有可能与该 lnode 相关联的帐户仅仅是用于管理目的;从未有用户登录过。但是,同样有可能它是真实用户的 lnode,该用户可以登录并运行附加在该非叶节点 lnode 上的进程。
请注意,Solaris Resource Manager 调度组和组长与在 /etc/group 数据库中定义的系统组没有关系。调度树中的每个 lnode(包括组长)都对应使用唯一 UID 的真实系统用户。
如果为某个组长分配了分层结构限制,则该限制将应用于该用户的利用率以及调度组中所有成员的总利用率。这样将使此类限制适用于整个组以及每个成员。资源被分配给组长,组长又将资源分配给属于同一组的用户或多组用户。
每个进程都附加在一个 lnode 上。init 进程始终附加在 root lnode 上。当 fork(2) 系统调用创建进程时,它们将被附加到与其父节点相同的 lnode 上。使用 Solaris Resource Manager 系统调用可以将进程重新附加到任何 lnode 上,并分配足够的特权。特权由中央系统管理员或具备正确管理许可的用户进行设定。
Solaris Resource Manager 软件可对以下系统资源进行控制:CPU(处理器速率)利用率、虚拟内存、物理内存(仅限于 Solaris 8)、进程数目、一个用户和/或一个调度组同时登录的数目,以及终端连接时间。
表 2-1 Solaris Resource Manager 功能
系统 资源 |
分配 政策 |
控制 |
测量 |
利用率数据 |
---|---|---|---|---|
CPU 利用率 |
是 (每个用户 ID) |
是 |
是 (每个用户 ID) |
是 |
虚拟内存 |
是 (每个用户及每个进程) |
是 (每个用户及每个进程) |
是 (每个用户及每个进程) |
是 |
物理内存(仅限于 Solaris 8) |
是 |
是 |
是 |
是 |
进程数目 |
是 |
是 |
是 |
是 |
用户/调度组登录 |
是 |
是 |
是 |
是 |
连接时间 |
是 |
是 |
是 |
是 |
|
|
|
|
|
Solaris Resource Manager 可对每个用户的每个资源利用率进行跟踪。它可硬性限制除 CPU 以外的所有资源的使用率。如果用户使利用率达到限制,则硬限制会造成资源耗用尝试失败。硬限制是由内核或负责管理相应资源的软件直接强制执行的。
限制值为零表示没有限制。root lnode 的所有限制属性都应设定为零。
一般地,所有系统资源都应划分为以下两类之一:固定(不可更新)资源和可更新资源。但是,在 Solaris 8 环境下的 Solaris Resource Manager 1.3 中,还有第三类:软限制。驻留大小 (RSS) 软限制由资源上限执行守护程序间接强制执行,意味着利用率可以临时超过此限制。有关详情,请参阅 第 8 章,使用资源上限守护程序管理物理内存 。
Solaris Resource Manager 不同地管理固定资源和可更新资源。
固定资源或不可更新资源就是数量有限的资源。例如,虚拟内存、进程数目、一个用户和/或一个调度组的同时登录,以及连接时间。固定资源可以耗用(分配)和放弃(撤消分配),但在所有者撤消分配固定资源之前,其它实体不能使用该资源。Solaris Resource Manager 采用利用率和限制模型来控制固定资源的使用量。利用率 定义为当前正在使用的资源,限制是指 Solaris Resource Manager 允许的利用率最大水平。
可更新资源就是可连续供应的资源(如 CPU 时间)。可更新资源只能耗用,一旦耗用,就不能重新获得。可更新资源在任何时间都是有限可用的,如果在该时间没有使用,则不再可用。(一个恰当的比喻就是阳光。在任何给定时刻,来自太阳的光能都只有特定数量,但在今后几百万年里肯定会有更多光能辐射到地球。)因此,可更新资源无需公开重新分配即可重新指定给其他用户,从而确保没有浪费。
Solaris Resource Manager 采用利用率、限制和衰减速率来控制用户对可更新资源的耗用速率。利用率定义为所使用的总资源,并设定利用率与组中其他用户对比的限制。 衰减率是指历史利用率被折算的时期。下一个资源份额(如时钟信号)将被分配给相对其分配的份额具有最低衰减总利用率数值的活动 lnode。衰减利用率值可计算为:单位时间的总利用率与由半衰期模型确定的历史利用率的一部分之差。
可更新 CPU 资源的分配通过一种被称作 Solaris Resource Manager SHR 调度程序的公平份额调度程序进行控制。
每个 lnode 均被分配一定数量的 CPU 份额。根据未决活动份额(活动是指 lnode 附加了正在运行的进程)的总数,按比例将与每个 lnode 相关联的进程分配给 CPU 资源。在分配资源时只考虑活动 lnode,因为只有它们才有正在运行的活动进程,并需要 CPU 时间。
当某个进程耗用 CPU 资源时,其 lnode 的 CPU 利用率属性就会增加。调度程序可定期调节所有进程的优先权,以强制 CPU 利用率的相对比率,将 CPU 份额的相对比率集中在各级别的所有活动 lnode 上。这样,用户至少可以期望最后总能获得使用 CPU 服务的授权,而无需考虑其他用户的行为。
该调度程序采用分层结构,因为它还能确保各组无需考虑其成员的行为而接收组授权。Solaris Resource Manager SHR 调度程序是一种长期运行的调度程序;它可确保所有用户和应用程序都能在该调度程序运行期间接收到公平的份额。这意味着,当一个小负荷用户开始请求 CPU 时,该用户就会收到比大负荷用户更多的资源,直到二者的相对利用率与其相对“公平”份额的分配比率相当为止。所以,您现在对自己的授权使用的越多,将来能使用的授权就越少。
此外,Solaris Resource Manager 有一个由系统管理员设定的、不跟踪过去利用率的衰减期。衰减模型是半衰期模型之一,即在寿命达到一半时有 50% 的资源已经衰减。这就能确保稳定而平均的用户不会受到短期且与进程密切相关的用户的惩罚。半衰期设定了调度程序的响应模式或期限;缺省值为 120 秒钟。长半衰期对较长的批任务等平均利用率更有益,而短半衰期则对交互用户更有益。较短的数值可在系统上产生更平均的响应,但是在系统内资源分配的计算和维护方面精度较低。无论管理设置如何,调度程序都会尝试防止资源缺乏,并确保甚至在极端条件下的合理行为。
Solaris Resource Manager SHR 调度程序相对于标准 Solaris 调度程序的主要优点在于,它是对用户或应用程序而非个别进程进行调度。与 lnode 相关联的每个进程都受到一组限制的制约。对于运行一个活动进程的单个用户的简单情形来说,这就相当于使每个进程都受到相应 lnode 中所列出的限制的制约。当有多个进程附加到一个 lnode 上时,如运行多个进程的组中的成员,则所有进程都受到列出的限制的制约。这样,用户或应用程序耗用的 CPU 不能超过其授权允许的范围,无论他们运行多少个并发进程。以份额数目对授权进行分配的方法既简单又容易理解,而更改某个用户的份额所造成的影响也是可以预测的。
SHR 调度程序的另一个优点就是,在管理各个线程的调度(从技术上看,在 Solaris 中被调度的实体是一个轻量进程 (LWP))的同时,可以在用户之间按比例分配 CPU 资源。
这些概念可通过以下方程进行阐述:
然后,new_SRM_priority 被映射到系统优先权。Solaris Resource Manager 优先权越高,系统优先权就越低,反之亦然。 CPU_usage 等每个衰减期都减少一半,并以最当前的利用率递增。
每个用户还有一组标志,这些标志是类似布尔的变量,可用于启用或禁用所选择的系统优先权(如登录)。这些标志可针对每个用户分别设定,也可从一个父节点 lnode 中继承而来。
某个用户的利用率、限制和标志可被任何用户阅读,但只能由有正确管理优先权的用户修改。
Solaris Resource Manager 从不浪费 CPU 可用性。无论某个用户的分配有多低,只要没有竞争用户,他就能使用所有可用 CPU。这样做的一种结果就是,用户可能会注意到性能不象通常那样平稳。如果某个具有非常低的 有效份额的用户正在没有竞争的条件下运行一个交互进程,则任务看起来会运行的很快。但是,只要有更高有效份额的另一个用户请求 CPU 时间,则该用户就能得到比第一个用户更高的优先权,这样,第一个用户就会注意到任务执行的速度明显放慢。尽管如此,Solaris Resource Manager 仍会继续运行一段时间,以确保合法用户不会被断开,而无法进行任何工作。由 Solaris Resource Manager 调度的所有进程(具有最大 nice 数值的进程除外)都将由该调度程序定时分配 CPU。另外,还有一种逻辑算法可预防刚刚登录的新用户被分配到从数学上看似“公平”,但实际上过多的 CPU 份额,并对现有用户产生影响。
虚拟内存使用固定资源模型进行管理。虚拟内存限制应用于所有附加到 lnode 的进程的内存大小的总和。另外,也有针对每个进程的虚拟内存限制,用于对进程的虚拟地址空间大小的总额加以限制,其中包括所有的代码、数据、堆栈、文件映射以及共享库。两种限制都是分层结构的。限制虚拟内存有助于避免虚拟内存缺乏。例如,对于因消耗未经授权数量的虚拟内存而使内存流失和所有用户受损的应用程序,Solaris Resource Manager 将予以终止。此类进程只会使其自身的资源缺乏,或者更糟的话,也使其资源组内其它进程的资源缺乏。
如果在 Solaris 8 操作环境中使用的是 Solaris Resource Manager 1.3,则可以按附加至 lnode 或项目的进程集合来规定物理内存的资源消耗。有关此功能的详情,请参阅 第 8 章,使用资源上限守护程序管理物理内存 。
用户可以同时运行的进程的数目是借助一种带有分层结构限制的固定资源模型加以控制的。
系统管理员和组长可设置终端登录特权、登录数目、和由 Solaris Resource Manager 以分层结构方式强制的连接时间限制。当某个用户接近连接时间限制时,就会有警告信息发送到该用户的终端。当达到该限制时,用户就会被通知,并在短时间内被强制退出。
Solaris Resource Manager 连续地对以往的连接时间利用率进行衰减,并确保只有最新的利用率可用。系统管理员设定一组能控制衰减速率的半衰期参数。较长的半衰期对平均利用率有益,而较短的半衰期则对交互用户有益。
中央系统管理员 (或超级用户) 可以创建和删除用户 lnodes。该管理员可以修改包括自己在内的任何用户的限制、利用率和标志,他还设置所有 lnode 的管理特权,包括有选择地向用户分配管理特权。
次级管理员可以按 flag.uselimadm 标志来授予这些特权。一个次级管理员可以像 root 用户那样执行任何 limadm 命令,可以被认为是超级用户的助手。
通过设置 flag.admin 标志而被授予分层管理特权的用户叫做组管理员。一个组管理员可以修改一个子树内用户的 lnode,这些用户是此子树的组长,他也管理此组的资源分配和调度策略。组管理员无法更改其自身的限制或标志,且无法通过更改其组内的标志或利用率来绕过其自身的标志或者限制。
系统管理员能看到资源利用率信息,该信息可提供系统利用率信息的两个视图:建立在每个用户上的视图,以及资源利用率的工作负荷视图。
Solaris Resource Manager 系统维护可被管理员用于进行全面系统资源记帐的信息(主要是当前和应计资源利用率)。Solaris Resource Manager 本身并不提供任何会计程序,但其实用程序可提供开发定制资源会计系统的基础。
有关设置会计程序的详情,请参阅第 9 章,利用率数据。
采用 Solaris Resource Manager 进行有效资源管理的关键在于建立设计完美的资源分层结构。Solaris Resource Manager 采用 lnode 树实施资源分层结构。
lnode 树中的每个节点都映射到口令图中的某个 UID,也就是说,工作负荷必须被映射到与口令图的条目相对应的程度。在某些情况下,可能还需要创建附加的用户,以便对应分层结构中的叶节点。这些特殊用户并不真正运行进程或任务,而是作为叶节点的管理点。
这个简单的分层结构是为了控制 Chuck 和 Mark 等两个用户的资源处理而建立的。这两个用户都在不同的点耗用大量 CPU 资源,因此在一天的不同时间互相影响。
为了解决这个问题,专门建立了一个单级分层结构,并向每个用户分配等份额的 CPU。
这种简单的分层结构是采用 limadm 命令,并使 Chuck 和 Mark 成为 root 共享组的子节点而建立的:
# limadm set sgroup=root chuck # limadm set sgroup=root mark |
为了向每个用户分配 50% 的资源,应向每个用户分配相同数目的 CPU 份额。(简单地说,在本例中向每个用户分配了 50 个份额,但向每个用户分配一个份额也可实现同样的目的。)利用 limadm 命令分配份额:
# liminfo -c chuck Login name: chuck Uid (Real,Eff): 2001 (-,-) Sgroup (uid): root (0) Gid (Real,Eff): 200 (-,-) Shares: 50 Myshares: 1 Share: 41 % E-share: 0 % Usage: 0 Accrued usage: 0 Mem usage: 0 B Term usage: 0s Mem limit: 0 B Term accrue: 0s Proc mem limit: 0 B Term limit: 0s Mem accrue: 0 B.s Processes: 0 Current logins: 0 Process limit: 0 Last used: Tue Oct 4 15:04:20 1998 Directory: /users/chuck Name: Hungry user Shell: /bin/csh Flags: |
liminfo 命令所显示的字段在典型的应用程序服务器中有介绍。有关 liminfo( 字段的详情,另请参阅 )liminfo1SRM 手册页。