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

第 3 章 配置

Solaris Resource Manager 在其配置中为中央管理员(例如,根用户)提供了大量的灵活性。本章描述下列配置区:

核心启动参数

核心拥有某些 Solaris Resource Manager 参数,中央管理员可以在核心启动时对其进行设置。 Solaris 在启动时读取 /etc/system 文件,并用来配置核心模块(有关细节请参阅 system(4))。可以在 SHR 模块中设置的用于覆盖 Solaris Resource Manager 默认性能的参数(均为32位整数)有:

SRMLnodes

要在核心中进行高速缓存的 lnode 的数目。在 Solaris系统上,每个核心 lnode 需要大约3千字节。零值(默认值)意思是核心将确定其值。所采用的试探方法为:

(nproc / SRMProcsPerUid ) + SRMLnodesExtra 

其中,nproc 是系统中所允许的同时进程的最大数目。最小值6覆盖这一计算。 SRMMemoryMax 所指定的最大值也将覆盖这一计算。

SRMProcsPerUid

所期待的每个用户所使用的进程的平均数目。默认值为4。

SRMLnodesExtra

试探方法中所使用的一个边缘数,用于确定内存内 lnode 数组的大小。默认值为20。

SRMNhash

散列表中的条目的数目,用于将 UID 值映射到核心中的 lnode。在 Solaris 上,每个条目为4字节长。默认值为零,意思是使用与 lnode数目一样的值。

SRMMemoryMax

该值的倒数是一个分数,指定用于 Solaris Resource Manager lnode和散列表两者的真实内存的最大百分比。默认值为20,意思是最大百分之5的真实内存将用于 Solaris Resource Manager 数据结构。

SRMMemWarnFreq

单一 lnode 的"内存超出"通知警告的最小间隔,以秒为单位。默认值为4。

例如,在 /etc/system 文件中,

set srmlim:SRMMemWarnFreq=10 

行将确保内存针对任意单个用户的超出消息的发出频率不得超过每10秒钟一次。

另外还有一些 Solaris Resource Manager 中没有的参数,对 Solaris Resource Manager 的性能构成影响。这些参数包括:

initclass

这是 init(1M)进程启动时所在的调度类的名称。在 Solaris Resource Manager 下,所给出的参数应当是字符串 "SHR"(包含双引号字符)。默认的 Solaris值为 "TS"。如要将 Solaris Resource Manager 用于 CPU 资源控制,则 /etc/system 文件中应当包含下列一行:

set initclass="SHR"

用于覆盖默认值:

extraclass

这是一个要加载的调度类模块的名称,不必非要将其用作默认的调度类。如要只是将 Solaris Resource Manager 用于非 CPU 资源控制,则/etc/system文件中应当包含下列一行:

set extraclass="SHR"

如要启动系统时根本不加载任何 Solaris Resource Manager ,就使用一个替用的 /etc/system,其名称为 /etc/system.noshrload。请参阅 "启动时不带 Solaris Resource Manager "了解有关该进程的操作指示。

多用户启动配置

在正常的系统启动过程中,当系统从单用户模式变为多用户模式时,就运行一个 Solaris Resource Manager 初始化正文,对各种 Solaris Resource Manager 参数进行设置。该正文的动作细节,见于 第 4 章,启动过程

如果初始化正文自身(/etc/init.d/init.srm)被修改,则原来的和修改的版本的一个副本应当分开保存。应用 Solaris Resource Manager 更新程序,则不一定会保留当前的初始化正文。

借助 Srmadm 设置全局 Solaris Resource Manager 参数

srmadm(1MSRM)命令允许管理设置、修改或者显示全局 Solaris Resource Manager 参数。如要了解所有参数的完整细节,请参考手册页。

srmadm(1MSRM)命令用于设置各种参数,可以调用任意次数。不必将其全部包含在单一的调用上。这也意味着 srmadm(1MSRM)可以用来随时对一个正在运行的 Solaris Resource Manager 系统的操作参数进行更改,但需要注意一些事项。

对管理员来讲尤其重要的是 srmadm(1MSRM)选项,用来启用或者禁用 Solaris Resource Manager 的主要特性。其中有:

fileopen[={y|n}]

默认的数据库为 /var/srm/srmDB,可以用-f选项对其进行覆盖。注意,在操作中间关闭 Solaris Resource Manager 数据库文件应当视作一项紧急行动。这有多个不良后果:所有的进程将继续在替代根 lnode 上运行,从而获得比平常更多的特权;CPU 调度器遭到禁用; Solaris Resource Manager 限制强制执行终止。如果被启用, Solaris Resource Manager当前就没有打开任何的限制数据库,其高速缓存只包含所有进程所附加的替代根 lnode。

share[={y|n}]

如果被启用,就使用 Solaris Resource Manager CPU 调度器,且根据 Solaris Resource Manager 的动态使用和衰变算法进行 CPU 调度。除非 fileopen(文件打开)模式被启用,否则无法设置该模式。如果被禁用,就冻结 Solaris Resource Manager CPU 调度器的利用率算法,且进程被调度为"不分先后",拥有固定平等优先权。

limits[={y|n}]

如果被启用, Solaris Resource Manager 就强制执行虚拟内存和进程限制。除非 fileopen(文件打开)模式被启用,否则无法设置该模式。如果被禁用, Solaris Resource Manager 将使利用率属性保持为最新,但不强制执行限制。

adjgroups[={y|n}]

如果被启用,就使用 Solaris Resource Manager CPU 调度器的全局组有效份额调整。建议在大多数情形下使用启用状态。在每次运行的间隔,所有限制条目的正常化使用得到重新计算。如果 adjgroups 调度模式被启用,则对正常化使用进行如下的附加处理。调度器在调度树上进行逾越,将每个组最近所收到的有效份额与其权利进行比较。所收到的比其组权利少的组受到特别对待,将在下一个运行间隔收到较多的有效份额。这就确保组尽可能地收到其应得的 CPU 服务,而不论其成员有何操作。

limshare[={y|n}]

如果被启用, Solaris Resource Manager CPU 调度器就应用其特权高限特性,对所有用户的有效份额加以限制,以防止使用极端低下的用户短暂地获得 CPU 的百分之100。建议使用启用状态。

某个用户的 CPU 服务的比率,大体与该用户的利用率成反比。如果用户处于活动状态已有较长一段时间,则其利用率衰变到接近零。当这样的一个用户登录(或者无论如何 lnode 成为活动)时,则在下次运行间隔期间,该用户的进程可以拥有极高的优先权,乃至垄断 CPU。

启用 limshare 调度标志,会促使调度器对某一 lnode 在下个运行间隔之前对要收到的有效份额进行估算。如果结果超过某一因素所赋予用户的权利(参阅 maxushare),则对用户的正常化使用进行调整,以避免超过。

用于 srmadm(1MSRM)的可选参数有两个,对管理员来讲也很有用。它们是:

下面是典型 srmadm(1MSRM)命令的示例。

如要开启 Solaris Resource Manager ,启用 CPU 调度器和资源限制:

# srmadm set -f /var/srm/srmDB fileopen=y:share=y:limits=y 

如要将 CPU 利用率衰变速率设置为5分钟的半衰期:

# srmadm set usagedecay=300s 

如要显示当前的标志设置和收费:

% srmadm 

如要显示所有的默认设置:

% srmadm show -dv

禁用 Solaris Resource Manager

srmadm(1MSRM)命令可以清除 fileopen 标记,从而禁用 Solaris Resource Manager ;所有的进程均被移到替代根 lnode 上,高速缓存中其它改变了的 lnode 被写到磁盘,且关闭 lnode 文件。这自动强制关闭份额和限制标志,从而分别禁用 Solaris Resource Manager CPU 调度器和限制强制执行。可以根据需要单独关闭份额和限制标志,同时还让 lnode 文件保持为开。关闭文件最好使用这一方法,因为进程可以保持附加到其正确的 lnode。

注意:如果在操作中间单独关闭 Solaris Resource Manager 调度器,则结果只是暂停利用率和衰变算法。调度器仍旧继续处理 SHR 调度类中的进程,但是由于向其中每个指派了更新的优先权,使用的是同样的值,导致简单的"不分先后"调度。

在文件业已关闭后,通过打开文件并设置份额和/或限制标志来重新启用 Solaris Resource Manager ,并不会促使现有的进程从根 lnode 移开。不建议在正常操作过程中关闭 Solaris Resource Manager 数据库。如果这样做了,则应得重新启动系统,以便确保进程正确附加到 lnode。

使用 limdaemon 选项

limdaemon(1MSRM)拥有多个选项,可以在其启动时进行配置。

管理员应当确定连接时间利用率属性快速更新所导致的附加开销和随较低频率更新而来的较大间隔尺寸之间所需的平衡。请参阅 limdaemon(1MSRM)手册页,了解有关这些及其它选项的更多信息。

举例来讲,命令:

% limdaemon -g300 

启动守护程序并将宽限时间设置为五分钟。注意,不必在命令后面跟一个 shell "&"字符。limdaemon 启动时,会变为一个守护程序。也就是说,一个子进程分叉,从控制终端分离开来,将自身放在其自己的一个进程组里。

PAM 子系统

Solaris 2.6 系统支持可插鉴别模块 (PAM)。每当某个用户请求一个涉及改变或者设置用户身份的操作时(诸如登录到系统,调用一个"r"命令,诸如 rcp 或者 rsh,使用 ftp,或者使用 su),就会使用一组可配置的模块,进行鉴别,帐户管理,资格管理以及会话期间管理。 Solaris Resource Manager 提供有一个模块,用于登录记帐和修改 su 的性能。

用于请求操作的程序称作服务。

PAM系统作为一个整体,在手册页 pam.conf(4)pam(3)pam_unix(5)pam_srm(5SRM)中有描述。

Solaris Resource Manager PAM 模块提供有帐户管理和会话期间管理模块。可以通过编辑 /etc/pam.conf 文件来对 PAM 的性能进行控制。如要获得常规的 Solaris Resource Manager 性能,就应当将 Solaris Resource Manager PAM 模块配置为是所有会话期间管理的登录类型服务所必需的,以及所有 PAM服务的帐户管理所必需的。通常, Solaris Resource Manager 模块应当放置在所有其它所需的和必需的模块之后,而再任何其它充足或者可选模块之前。

安装时, Solaris Resource Manager 对 /etc/pam.conf 进行编辑,以提供合适的性能。它为每种会话期间或帐户管理业已得到配置的服务插入类似于下面的命令行(其中包括 other):

login account requisite pam_srm.so.1
nolnode=/etc/srm/nolnode 
login session requisite pam_srm.so.1
other account requisite pam_srm.so.1 nolnode=/etc/srm/nolnode

第一行是说,出于服务登录目的,要使用模块 pam_share.so.1 来提供帐户管理功能,如果要使登录取得成功,就必须允许登录,以及要向其发送 nolnode=/etc/srm/nolnode 变元。请参阅 pam.conf(4),就会得到对各种控制标志的完整解释(required, requisite, optional,sufficient)。

第二行是说,登录服务将使用 pam_share.so.1 模块来进行会话期间管理。

所支持的用于 Solaris Resource Manager 帐户和会话期间管理模块的变元的完整列表,见于 pam_srm(5SRM)

帐户管理

Solaris Resource Manager 帐户管理 PAM 模块获得控制时,就:

  1. 确定是否已安装和启用 Solaris Resource Manager;如果没有,就告诉 PAM 系统忽略该模块,

  2. 确定是否用户拥有一个 lnode,如果没有,就调用一个管理员可配置的 "no lnode"正文,

  3. 确定是否用户拥有使用所请求的服务和设备的许可,

  4. 确定是否用户业已超过警告限制;如果是,就拒绝其登录,

  5. 调用一个管理员可配置的"every login"正文。

如果上述步骤中有任何一个失败,则其余的步骤就不再执行,且 Solaris Resource Manager 帐户管理 PAM 模块拒绝使用服务。在可能的情况下,会通过服务向用户传递一个解释性的消息。

正文

默认的"missing lnode"正文将为用户创建一个 lnode,并发出邮件,将此动作通知给系统管理员。默认的正文为/etc/srm/nolnode,但可以对此进行更改,方法是编辑 /etc/pam.conf 文件,以及改变 Solaris Resource Manager 帐户管理模块行上的 nolnode 选项的值。通常没有配置"every login"正文。可以通过向/etc/pam.conf 中的任意 Solaris Resource Manager 帐户管理模块添加一个 everylogin=pathname 选项来对此进行配置。正文是作为根用户而调用的。标准输入、输出和错误被关闭。如果某个正文以非零状态退出,则访问将遭到拒绝。所有的信息均作为环境变量而得到传递,这些变量可以直接从服务传递给 PAM 的信息推导得出:

USER

提供给程序的登录名称。业已通过在口令映射中检索加以鉴别;如果不存在,帐户管理模块则向 PAM 返回一个错误代码。

UID

正在进行鉴别的用户的 UID。对于更改 UID 的服务(诸如 su),则是调用服务的用户的 UID;对于设置 UID 的服务(诸如 login),则是目标 UID(例如,USER 的 UID)。

RHOST

对于跨网络的访问企图,其中所包含的是作出该企图的主机的名称。否则其值取决于实现过程。

SERVICE

访问服务的名称,例如,rshloginftp。等等。

TTY

服务被调用时所在的 TTY 的名称。(严格来讲)某些没有控制终端的服务(诸如ftp),将用一些意思含糊的内容填充该变量(例如,ftp12345,其中12345ftpd 的进程识别符(PID));其它程序则保持其为空或者用服务名称代替。

DEBUG

如果在 pam.conf 文件中指定了 debug,则 DEBUG 设置为真;否则设置为假。没有设置任何其它的环境变量,所有任何正文必须根据需要设置其自己的 PATH 变量。

默认的"no lnode"正文在默认的调度组创建 lnode(other,如果一个此类的用户在口令映射中存在的话;否则,root),并向系统管理员发出邮件,提醒其将新的 lnode 移到调度分层结构中的适当的位置。如要了解正文示例,请参阅 "默认 "no lnode" 正文"

PAM与设备组的交互

Solaris Resource Manager PAM 模块在设备分层结构中检索终端和服务名称;如果超过显示或者某一设备标志值为"set",就向其调用者返回一个"permission denied"(拒绝许可)。

所检查的设备类别为 terminal,指的是终端名称,以及 services 指的是所请求的服务的种类。例如,某一登录企图可能会尝试使用网络设备组中的某个文件,因而为该用户所测试的标志为如下所示(假设所有的标志均设置为 group)。这些标志的检查顺序为:

如果其所有的值均为"set",则许可访问;另外,还要为相对应的类别检查限制(terminalservices)。

会话期间管理

对于类似于 login 的服务(即在 utmp 文件中创建一个条目的服务),如果 PAM 的会话期间管理工具和帐户管理工具两者均在 /etc/pam.conf 中得到配置的话,就全部加以调用。

Solaris Resource Manager 产品的会话期间管理负责设备收费。它查看是否用户业已超过连接时间限制,或者 onelogin 标志值为 set而业已登录;如果是的话,则阻止其登录。

否则,会向 limdaemon 进程生成一条消息,将登录以及登录所在的终端的配置费用通知给它。然后就告知核心,当前的进程是一个"login header process"(登录头目进程),必须告知 limdaemon 进程,当前的进程何时消亡。

limdaemon 进程然后就对连接时间限制进行跟踪,并在其将要被超过时发出警告。