Solaris Resource Manager 1.3 系统管理指南

示例

这一部分的示例说明 Solaris Resource Manager 的系统资源及分配控制功能和信息显示功能。

服务器合并

第一个示例说明这些命令:

liminfo

打印一名或多名用户的属性以及限制终端窗口

limadm

为一组用户改变限制属性或为其删除限制在数据库中的入口

srmadm

显示或设定操作模式和 Solaris Resource Manager 系统级别的可调节参数

srmstat

显示 lnode 节点活动信息

假设有两个服务器,每一个都在运行一个数据库应用程序,现在要将这两个服务器合并在一台机器上。简单地运行单台机器上的两个应用程序会得到工作系统。在没有 Solaris Resource Manager 的情况下,Solaris 系统在平等使用的基础上将资源分配给应用程序,而且并不保护一个应用程序不受另一个应用程序所提出的竞争请求的影响。Solaris Resource Manager 却可提供适当机制,防止应用程序遭受资源缺乏。若使用 Solaris Resource Manager,可通过启动附加到与数据库( db1db2)相关的 lnode 节点的每一个数据库来达到此目的。若要这样做,必须创建三个新的管理位置标识符用户,例如, databasesdb1db2。这三个用户被添加到限制数据库;由于 lnode 与 UNIX UID 对应,因此也必须将这三个用户添加到 passwd 文件(如果系统使用 NIS 或 NIS+ 之类的名称服务,则添加到口令映射)。假定 UID 被添加到 passwd 文件或口令映射,则使用以下命令将位置标识符用户 db1db2 分配到 databases lnode 组:

# limadm set sgroup=0 databases
# limadm set sgroup=databases db1 db2

并假设 /usr/srm/bin 在用户路径中。

图形 10-1 服务器合并

图中说明了将两台各自都在运行数据库应用程序的服务器合并到一台机器上的情况。

由于没有其它被定义的组,databases 组目前占用整台机器。与数据库关联的两个 lnode 在运行,而运行数据库应用程序的进程则通过数据库例程的启动脚本中的 srmuser 命令附加到相应的 lnode。

# srmuser db1 /usr/bin/database1/init.db1
# srmuser db2 /usr/bin/database2/init.db2

当启动数据库 db1db2 时,请使用 srmuser 命令以确保数据库附加到正确的 lnode 并正确收费(srmuser 不影响执行此操作的进程的拥有权)。要运行以上命令,用户必须拥有运行 init.db1 所需的 UNIX 许可和将进程附加到 lnode db1 的管理许可。当用户登入和使用数据库时,数据库执行的活动被传送至 lnode 节点 db1db2

使用每个 lnode 节点一个共享权的缺省分配,databases 组的使用将会逐渐平均,以便确保数据库 db1db2 平均分配机器的使用。尤其是,有一个剩余共享权-适用于 databases 组-;而且 databases 拥有该共享权。lnode 节点 db1db2 也被分别给予一个共享权的缺省分配。在 databases 组内,有两个剩余共享权,因此 db1db2 获得 databases 资源之外的平等分配(在这个简单的示例中,没有竞争分配,因此 databases 拥有对整个系统的访问权)。

如果 1 号数据库需要机器 CPU 容量的 60%,而 2 号数据库需要其容量的 20%,管理员可以规定系统必须至少提供这些容量(假设应用程序有这样的要求),其方法是增加 cpu.shares 的数目,分配给 db1:

# limadm set cpu.shares=3 db1

现在,有四个剩余共享权在 databases 组;db1 有三个,而 db2 有一个。执行上述命令之后,这个改变立即生效。将有一段过渡时间,然后 lnode 节点 db1(1 号数据库)才会真正得到大于机器资源 60% 的分配部分,因为 Solaris Resource Manager 需要逐步平均机器使用。但是,视乎衰变总参数,这段时间不会太长。

若要在任何时候监视这项活动,可使用命令 liminfo(请参阅典型的应用程序服务器)和 srmstat,它们在不同的窗口里。注意,命令 srmstat 定期提供更新的显示。有关 srmstat 的更多信息,请参阅 srmstat(1SRM)

现在,一台机器运行两个数据库应用程序,一个得到 75% 的资源,另一个得到 25% 的资源。请记住,root 是最高层群组长用户。处理程序作为 root 运行,若有需要,可使用整个系统。因此,应该建立更多的 lnode 节点,用于运行后援程序、守护程序和其它脚本,使 root 处理程序不能占用整个机器。若按传统方式运行,则有可能占用。

添加计算批处理应用程序用户

本示例介绍的是下列命令:

srmkill

用于中止附加到某一 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

图形 10-2 添加计算批处理应用程序

图表显示了将调用批处理的新组添加到 lnode 数据库和服务器分层,以及将用户 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 时,就没有必要对 db1db2 的份额分配进行任何更改。在 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 连夜批处理负载的同时,还确保他的工作不会干扰其关键任务的处理。

增加万维网前端进程

假设业已决定在 Database1 上放置一个万维网前端,但将该应用程序限制为只能 10 个用户同时登录。使用进程限制功能就能办到。

首先,创建一个名为 ws1 的新 lnode。您通过在 ws1 lnode 下启动 Webserver(万维网服务器)应用程序,就可以控制其可用的进程的数目,也就是活动 http 会话的数目。

图形 10-3 添加万维网前端进程

图表显示在 db1 lnode 之下添加万维网前端进程。

鉴于 Webserver 是 Database1 应用程序的一部分,您可以给予它一个 db1 lnode 份额,并允许它与 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,并将应用程序装载到 ws1 lnode。注意,为 Database1 的 cpu.myshares 分配了 4。这就为 db1 与其子进程 Webserver 竞争份额设置了 4:6 的比率。


注意:

cpu.shares 显示分层结构中同级资源分配的比率,而 cpu.myshares 显示的是父节点正在积极运行应用程序时父:子节点的资源分配比率。Solaris Resource Manager 根据所有活动 lnode 在其各自层次上的未决份额的比率来进行资源分配,其中“各自层次”包括所有组父节点和所有子节点的 my.shares


如要控制 Webserver 可以运行的进程的数目,就为 ws1 lnode 放置一个进程限制。示例使用的是 20,因为一个 Webserver 查询通常产生 2 个进程,因而这实际上将活动 Webserver 查询的数目限制在 10:

# limadm set process.limit=20 ws1

现在业已将又一应用程序作为某个活动 lnode 下的一个叶节点添加到了调度树。如要在活动的父节点和子节点之间分布 CPU 资源,就使用 cpu.myshares 来将某些部分的可用资源分配给父节点,将某些分配给子节点。采用了进程限制,以便对一个 lnode 上的活动会话期间的数目加以限制。

添加更多有特殊内存要求的用户

本示例实现的是 CPU 共享、进程限制和登录控制等资源控制机制,并涉及到用于打印 lnode 和显示活动 lnode 的显示工具。

srmadm

管理 Solaris Resource Manager

limreport

输出关于所选用户的信息

limdaemon

指示守护程序在到达任何限制时发送消息

另一用户 Sally ,也为其应用程序要求在夜间使用机器。鉴于她的应用程序是 CPU 密集型的,为确保 Joe 的应用程序不受损害,需给 Sally 的虚拟内存利用率放置一个限制,既包括她的总利用率,也包括她的“每一进程”利用率:

# limadm set memory.limit=50M sally
# limadm set memory.plimit=25M sally

图形 10-4 添加更多的用户

图表显示在指定的内存限制范围内添加更多用户。

如果 Sally 的应用程序试图超过她的总虚拟内存限制或者进程内存限制,limdaemon 命令将通过控制台通知 Sally 和系统管理员,业已超过了限制。

使用 limreport 命令来生成一个报告,显示正在系统上的人及其到目前为止的利用率。limreport 的一个典型运用就是在任意时刻查看谁在使用机器及其在用户分层结构中的状态如何。

% limreport 'flag.real' - uid sgroup lname cpu.shares cpu.usage |sort +1n +0n


注意:

limreport 拥有多个参数。在此示例中,对 'flag.real' 执行检查(仅查找 'real' lnode/UID);破折号 ( -) 用来表示应使用的输出格式的缺省最佳推测,而参数表 'uid sgroup lname cpu.shares cpu.usage' 表示 limreport 应为每个将 flag.real 设为 TRUE 的 lnode 输出这五个参数。输出在第二列上被导向一个 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,且是在与 databasesbatch 相同的层次上。为 development 分配机器的百分之 33,因为是他们为原来的机器添置了另外百分之 50 的 CPU 能力和内存。

图形 10-5 共享机器,步骤 1

图表说明共享一台机器。在周围的文本中提供上下文。

开发组拥有成百上千的用户。为了避免卷入对其资源的分散,需使用 Solaris Resource Manager 的管理标志功能,以便使开发系统管理员可以分配其资源。您依照多方联合商定的方案对操作和开放层次的限制加以设置,然后你们双方开始操作,对各自部分的机器进行控制。

如要为分层结构添加新的层次,请作为一个新的 lnode 添加 operations 组,并将 batchdatabases 的父组改为 operations

# limadm set sgroup=operations batch databases

如要设置管理标志:

# limadm set flag.admin=set operations development

鉴于在正常的环境下,所有的服务器都需要运行守护程序和备份程序,因而应当在另外的高层 lnode 上进行上述添加。


注意:

不要使用 root lnode,因为其没有限制。


图形 10-6 共享机器,步骤 2

图表继续显示共享一台机器的示例。在周围段落中提供上下文。

正如在示例中所看到的那样,您可以使用 Solaris Resource Manager 来将多个不同类型的用户和应用程序整合在同一机器上。通过审慎使用 CPU 份额控制、虚拟内存限制、进程限制以及登录控制,您可以确保这些各式各样的应用程序只收到其需要且要求得到的资源。限制用于确保没有任何应用程序或者用户会对任何其他用户的或者用户组的应用程序构成不良影响。Solaris Resource Manager 支持一些简单的汇报工具,用于向用户和系统管理员显示任意时刻以及一段时间以来所发生的确切情况。报告生成功能可以用来跨应用程序和组显示资源利用的细节,以便进行容量规划和计费。