本示例介绍的是下列命令:
用于中止附加到某一 lnode 的所有活动进程
财务部门拥有数据库系统,但来自工程部门的一个用户 (Joe) 必须运行一个计算任务,想在系统通常空闲的非高峰时间使用财务部门的机器。财务部门断定 Joe 的任务没有数据库重要,同意只在其不干扰系统的主要工作的条件下才可以运行他的工作。如要强制执行该策略,需将一个新的组 (batch) 加到 lnode database,并将 Joe 添加到服务器 lnode 分层结构中的新的 batch 组:
# limadm set cpu.shares=20 databases # limadm set cpu.shares=1 batch # limadm set cpu.shares=1 joe # limadm set sgroup=batch joe |
该命令序列改变份额分配,以使 databases 组拥有 20 个份额,而使 batch 组只拥有一个。这就指定 batch 组的成员(只有 Joe),在 databases 组活动时最多只能使用机器的 1/21。而 databases 组收到 20/21 或者说百分之 95.2,多于以前确定为足够用来处理数据库工作的 60% + 20% = 80%。如果 databases 没有要求得到其全部分配,则 Joe 所收到的将多于分配给他的百分之 4.8。如果 databases 完全不活动,则 Joe 的分配可能会达到百分之 100。但分配给 databases 的未决份额的数目从 1 增加到 20 时,就没有必要对 db1 和 db2 的份额分配进行任何更改。在 databases 组内部,仍然有四个未决份额,其分配比率为 3:1。调度树的不同层次之间是完全独立的;关键是同级组之间的份额比率。
即使有了这些把握,财务部门仍旧想确保 Joe 无法在白天高峰时间登录。这在 batch 组上放置一些控制就可以办到。鉴于控制对一天内的时间敏感,实现起来可以是在一天开始和结束时运行一个脚本,从而改变 batch 组所允许的登录数目。例如,可以借助 crontab 条目加以实现,诸如:
0 6 * * * /usr/srm/bin/limadm set flag.nologin=set batch 0 18 * * * /usr/srm/bin/limadm set flag.nologin=clear batch |
在早晨 6 点钟,batch 没有登录的许可,而在 18 点钟(下午 6 点钟),该限制被去除。
还可以实现一个更为严格的策略,方法是将另一行添加到 crontab 条目:
01 6 * * * /usr/srm/bin/srmkill joe |
这使用的是 srmkill(1MSRM) 命令,用于在早晨 6 点零 1 分时中止任何附加到 lnode Joe 的进程。如果该任务所需的唯一资源正是 Solaris Resource Manager 所控制的资源的话,就没有这个必要。如果有理由认为 Joe 的任务可能会独占其它资源从而对正常工作造成干扰的话,就可以使用上述操作。例如某个任务使某个关键性的数据库锁定或者独占某个 I/O 通道。
现在 Joe 只能在夜间登录运行其任务了。由于 Joe(以及整个 batch 组)所拥有的份额比其它应用程序少得多,他的应用程序运行时只能使用百分之 5 的机器。同理, nice(1) 可以用来降低附加在该任务上的进程的优先级,从而使其运行时所拥有的优先级低于正在运行的其它拥有同等 Solaris Resource Manager 份额的任务。
现在,财务部门就确信其数据库应用程序可以对其系统进行足够的访问,且其工作不会互相干扰了。他们在提供 Joe 连夜批处理负载的同时,还确保他的工作不会干扰其关键任务的处理。