本节中的示例用于示范用来控制系统资源和分配以及显示信息的各种 Solaris Resource Manager 功能。
第一个示例用于解释下面这些命令:
将一个或者多个用户的口令属性和限制信息打印到某个终端窗口
改变一列用户的限制属性或者删除其限制数据库条目
对操作模式以及系统范围的 Solaris Resource Manager 可调节的参数进行显示或者设置
显示 lnode 活动信息
请考虑将两个各自均运行某个数据库应用程序的服务器整合到单个机器的情形。简单地在单个机器上运行上述两个应用程序可以使系统工作起来;如果 没有 Solaris Resource Manager ,Solaris操作系统就将资源平均分配给两个应用程序,且并不对应用程序进行 保护,以使其免遭互相竞争损害。但是,Solaris Resource Manager 提供有用于避免应用程序缺乏资源的机制。 Solaris Resource Manager 启动每个数据库时均将其附加到指向该数据库的 lnode,即 db1 和 db2 ,从而取得上述效果。为此,必须创建三个新的管理性占位用户,例如 databases(数据库)、db1 以及 db2。这些被添加到 lnode 数据库;鉴于 lnode 对应于 UNIX UID,也还必须将其添加到 passwd 文件(如果系统是在运行某个名称服务,诸如 NIS 或者NIS+,则为口令映射)。假设是将 UID 添加到 passwd 文件或者口令映射,就使用下面的命令将占位用户 db1 和 db2 指派给 databases lnode 组:
% limadm set sgroup=0 databases % limadm set sgroup=databases db1 db2 |
其中假设 /usr/srm/bin 是在用户的路径中。
因为没有其它的已定义组,所以当前 databases 组完全使用机器。两个与数据库相关联的 lnode 正在运行,且在该数据库实例的启动正文中使用 srmuser 命令,就可以将运行数据库应用程序的进程附加到适当的lnode,例如:
% srmuser db1 /usr/bin/database1/init.db1 % srmuser db2 /usr/bin/database2/init.db2 |
当其中任何一个数据库,db1 或者 db2 被启动时,请使用 srmuser 命令,以确保该数据库被附加到正确的 lnode,且对其进行正确的收费(srmuser 并不影响进程进行此类操作的拥有权)。如要运行上述命令,用户必须拥有运行 init.db1 所需的许可,以及将进程附加到 lnode db1 的管理许可。随着用户登录并使用数据库,数据库所进行的活动就被计入 lnode db1 和db2。
借助每个 lnode 分配一个份额的默认方式,数据库组的利用率会最终平均开来,从而确保数据库 db1 和 db2 收到平等的机器资源分配。特别是,有一个未决份额-用于 databases 组-,且 databases 拥有它。lnode db1 和db2 中的每一个也会得到一个份额的默认分配。在数据库组内部,有两个未决份额,因而 db1 和 db2 获得 databases 的资源的平等分配(在上述简单示例中,没有竞争分配,因而 数据库可以访问整个系统)。
如果结果是 Database1 上的活动需要机器的 CPU 容量的百分之60,而 Database2 需要上述容量的百分之20,则管理员可以通过增加分配给 db1的 cpu.shares 的数目,指定系统至少提供上述数量(假设应用程序要求得到该数量):
% limadm set cpu.shares=3 db1 |
目前在 databases 组中有四个未决份额;db1 有三个,而 db2 有一个。一旦执行上述命令,则该变更立即生效。还将有一个决算期,lnode db1(Database1)才会真正收到比其应得的百分之60多的机器资源,因为 Solaris Resource Manager 将随着时间的推移对利用率进行平均,但是,该时间不会太长,这取决于衰变全局参数。
如要在任意点对该活动进行监测,请在不同的窗口中使用 liminfo 和 srmstat 命令:
% liminfo -c db1 # limit information shows all the data and # settings for the lnode db1. |
参阅 "典型的应用程序服务器"。
另外,srmstat 提供了一个定期更新的显示:
% srmstat -ac # srmstat shows the server activity and the # flag -ac sets a screen default update period # of 4 seconds to display the results. |
您现在拥有一个运行有两个数据库应用程序的机器,一个程序收到百分之75的资源,另一程序收到百分之25。请记住,超级用户(根)是顶级的组头目用户。因而作为根而运行的进程如果要求的话,就可以访问整个系统。应当相应地为正在运行的备份程序、守护程序以及其它的正文创建附加的 lnode,以使根进程无法接管整个机器,而如果是以传统方式运行的话,则根进程就有可能接管整个机器。
本示例介绍的是下列命令:
用于中止附加到某一 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 logins=0 batch 0 18 * * */usr/srm/bin/limadm set logins=100 batch |
在早晨6点钟,batch 的登录限制减少为0,而在18点钟(下午6点钟),限制上升为允许多达100个登录。
还可以实现一个更为严格的策略,方法是将另一行添加到 crontab 条目:
01 6 * * * /usr/srm/bin/srmkill joe |
这使用的是 srmkill 命令,用于在早晨6点零1分时中止任何附加到 lnode Joe 的进程,如果该任务所需的唯一资源正是 Solaris Resource Manager 所控制的资源的话,就没有这个必要。如果有理由认为 Joe 的任务可能会独占其它资源从而对正常工作造成干扰的话,就可以使用上述操作。例如某个任务使某个关键性的数据库锁定或者独占某个 I/O 通道。
现在 Joe 只能在夜间登录运行其任务了。由于 Joe(以及整个 batch 组)所拥有的份额比其它应用程序少得多,他的应用程序运行时只能使用百分之5的机器。同理,nice(1)可以用来降低附加在该任务上的进程的优先级,从而使其运行时所拥有的优先级低于正在运行的其它拥有同等 Solaris Resource Manager 份额的任务。
现在,财务部门就确信其数据库应用程序可以对其系统进行足够的访问,且其工作不会互相干扰了。他们在提供 Joe 连夜批处理负载的同时,还确保他的工作不会干扰其关键任务的处理。
假设业已决定在 Database1 上放置一个万维网前端,但将该应用程序限制为只能10个用户同时登录。使用进程限制功能就能办到。
首先,创建一个名为 ws1 的新 lnode。您通过在 ws1lnode 下启动Webserver (万维网服务器)应用程序,就可以控制其可用的进程的数目,也就是活动 http 会话期间的数目。
鉴于 Webserver 是 Database1 应用程序的一部分,您可以给予它一个 db1lnode 份额,并允许它与 Database1 争用资源。给 Webserver 分配百分之50 的计算机资源,而给 Database1 应用程序自身分配百分之40:
# limadm set cpu.shares=6 ws1 # limadm set sgroup=db1 ws1 # limadm set cpu.myshares=4 db1 # srmuser ws1 /etc/bin/Webserver1/init.webserver |
最后一行启动 Webserver,并将应用程序装载到 ws1lnode。注意,为Database1 的 cpu.myshares 分配了4。这就为 db1 与其子进程 Webserver竞争份额设置了4:6的比率。
cpu.shares 显示分层结构中同级资源分配的比率,而 cpu.myshares 显示的是父节点正在积极运行应用程序时父:子节点的资源分配比率。 Solaris Resource Manager 根据所有活动 lnode 在其各自层次上的未决份额的比率来进行资源分配,其中"各自层次"包括所有组父节点和所有子节点的 my.shares。
如要控制 Webserver 可以运行的进程的数目,就为 ws1lnode 放置一个进程限制。示例使用的是20,因为一个 Webserver 查询通常产生2个进程,因而这实际上将活动 Webserver 查询的数目限制在10:
# limadm set process.limit=20 ws1 |
现在业已将又一应用程序作为某个活动 lnode 下的一个叶节点添加到了调度树。如要在活动的父节点和子节点之间分布 CPU 资源,就使用 cpu.myshares 来将某些部分的可用资源分配给父节点,将某些分配给子节点。采用了进程限制,以便对一个 lnode 上的活动会话期间的数目加以限制。
本示例实现的是 CPU 共享、进程限制和登录控制等资源控制机制,并涉及到用于打印 lnode 和显示活动 lnode 的显示工具。
管理 Solaris Resource Manager
输出关于所选用户的信息
指示守护程序在到达任何限制时发送消息
另一用户 Sally,也为其应用程序要求在夜间使用机器。鉴于她的应用程序是 CPU 密集型的,为确保 Joe 的应用程序不受损害,需给 Sally 的虚拟内存利用率放置一个限制,既包括她的总利用率,也包括她的"每一进程"利用率。
% limadm set memory.limit=50M sally % limadm set memory.plimit=25M sally |
如果 Sally 的应用程序试图超过她的总虚拟内存限制或者进程内存限制,limdaemon 命令将通过控制台通知 Sally 和系统管理员,业已超过了限制。
使用 limreport(1MSRM) 命令来生成一个报告,显示正在系统上的人及其到目前为止的利用率。limreport 的一个典型运用就是在任意时刻查看谁在使用机器及其在用户分层结构中的状态如何。
% limreport 'flag.real' - uid sgroup lname cpu.shares cpu.usage |sort +1n +0n |
limreport 拥有多个参数。在本示例中,对 "flag.real" 进行了检查(只寻找"真"的 lnode/UID),然后又使用了破折号(-),指示输出格式应当使用默认的最佳的猜测,而列表"uid sgroup lname cpu.shares cpu.usage"指示 limreport 应当为"flag.real"设置为"真"的每个 lnode 输出这5个参数。输出在第二列上被导向一个 UNIX 主排序,而在第一列上被导向一个次排序,从而提供一个谁正在使用服务器的简单报告。
任何拥有正确路径和许可的人,均可以在任意时刻借助 srmadm show 命令来检查 Solaris Resource Manager 的状态。这将输出一个格式化报告,显示 Solaris Resource Manager 及其主要配置参数的当前操作状态。这可以用于检查 Solaris Resource Manager 正在活动且所有的控制参数正在活动。还可以用于显示全局参数的值,诸如衰变速率以及 Solaris Resource Manager 数据仓库的位置。
在不让限制活动以及不让 CPU 调度活动的情况下,是有可能运行 Solaris Resource Manager的,这一点对在启动时对 Solaris Resource Manager 进行调试和初始配置很有价值:
# srmadm set share=n:limits=n, - |
一个不同的开发组想要花钱为该机器升级(增加处理器和内存),以便可以在系统空闲时进行访问。两个组都可以从中受益。如要进行设置,需再建立一个新的组,名为 development,且是在与 databases 和 batch 相同的层次上。为 development 分配机器的百分之33,因为是他们为原来的系统添置了另外百分之50的 CPU 能力和内存:
开发组拥有成百上千的用户。为了避免卷入对其资源的分散,需使用 Solaris Resource Manager 的管理标志功能,以便使开发系统管理员可以分配其资源。您依照多方联合商定的方案对操作和开发层次的限制加以设置,然后你们双方开始操作,对各自部分的机器进行控制。
如要为分层结构添加新的层次,请作为一个新的 lnode 添加 operations组,并将 batch 和 databases 的父组改为 operations:
% limadm set sgroup=operations batch databases |
如要设置管理标志:
% limadm set flag.admin=set operations development |
鉴于在正常的环境下,所有的服务器都需要运行守护程序和备份程序,因而应当在另外的高层 lnode 上进行上述添加。
不要使用根,因为根没有限制。
正如在示例中所看到的那样,您可以使用 Solaris Resource Manager 来将多个不同类型的用户和应用程序整合在同一机器上。通过审慎使用 CPU 份额控制、虚拟内存限制、进程限制以及登录控制,您可以确保这些各式各样的应用程序只收到其需要且要求得到的资源。限制用于确保没有任何应用程序或者用户会对任何其他用户的或者用户组的应用程序构成不良影响。 Solaris Resource Manager 支持一些简单的汇报工具,用于向用户和系统管理员显示任意时刻以及一段时间以来所发生的确切情况。报告生成功能可以用来跨应用程序和组显示资源利用的细节,以便进行容量规划和记费。