资源控制功能通过 project 数据库来配置。请参见第 2 章。资源控制和其他属性在 project 数据库条目的最终字段中设置。与每个资源控制关联的值都括在括号中,并显示为用逗号分隔的纯文本。括号中的值构成一条“操作子句”。每条操作子句都包含一个权限级别、一个阈值以及一个与特定阈值关联的操作。每个资源控制可以有多条操作子句,这些子句也用逗号分隔。以下条目定义了项目实体的按任务轻量进程限制和按进程最多 CPU 时间限制。当进程运行 1 小时之后,process.max-cpu-time 将会向此进程发送 SIGTERM;如果此进程持续运行的总时间达到 1 小时 1 分钟,则会向此进程发送 SIGKILL。请参见表 6–3。
development:101:Developers:::task.max-lwps=(privileged,10,deny); process.max-cpu-time=(basic,3600,signal=TERM),(priv,3660,signal=KILL) typed as one line |
在启用了区域的系统上,使用稍有不同的格式在区域配置中指定整个区域范围的资源控制。有关更多信息,请参见区域配置数据。
使用 rctladm 命令,可以对全局范围的资源控制功能进行运行时询问和修改。使用 prctl 命令,可以对本地范围的资源控制功能进行运行时询问和修改。
有关更多信息,请参见针对资源控制值的全局和本地操作、rctladm(1M) 和 prctl(1)。
在安装了区域的系统上,不能在非全局区域中使用 rctladm 来修改设置。您可以在非全局区域中使用 rctladm 来查看每个资源控制的全局日志状态。
该表介绍了每个控制所约束的资源,还列出了 project 数据库使用的该资源的缺省单位。缺省单位有两种类型:
数量代表有限数量。
索引代表最大有效标识符。
因此,project.cpu-shares 指定了项目有资格享有的份额数。process.max-file-descriptor 指定了可由 open(2) 系统调用分配给进程的最高文件编号。
表 6–1 标准资源控制
控制名称 |
说明 |
缺省单位 |
---|---|---|
project.cpu-cap |
Solaris 10 8/07:项目可以占用的 CPU 资源量的绝对限制。值 100 表示将一个 CPU 的 100% 用作 project.cpu-cap 设置。值 125 表示 125%,因为在使用 CPU 上限时,100% 对应于系统中的一个 CPU。 |
数量(CPU 数目) |
project.cpu-shares |
授予此项目的 CPU 份额数,用于公平份额调度器(请参见 FSS(7))。 |
数量(份额) |
project.max-crypto-memory |
libpkcs11 用于加速硬件加密的内核内存总量。内核缓冲区分配以及与会话相关的结构分配都按照此资源控制执行。 |
大小(字节) |
project.max-locked-memory |
允许的锁定物理内存总量。 如果将 priv_proc_lock_memory 指定给用户,请考虑同时设置此资源控制,以防止该用户锁定所有内存。 Solaris 10 8/07:请注意,在 Solaris 10 8/07 发行版中,此资源控制取代了 project.max-device-locked-memory,后者已被删除。 |
大小(字节) |
project.max-port-ids |
允许的最大事件端口数。 |
数量(事件端口数) |
project.max-sem-ids |
此项目允许的最大信号 ID 数。 |
数量(信号量 ID) |
project.max-shm-ids |
此项目允许的最大共享内存 ID 数。 |
数量(共享内存 ID) |
project.max-msg-ids |
此项目允许的最大消息队列 ID 数。 |
数量(消息队列 ID) |
project.max-shm-memory |
此项目允许的 System V 共享内存总量。 |
大小(字节) |
project.max-lwps |
此项目可同时使用的最大 LWP 数。 |
数量 (LWP) |
project.max-tasks |
此项目中允许的最大任务数。 |
数量(任务数) |
project.max-contracts |
此项目中允许的最大合同数。 |
数量(合同) |
task.max-cpu-time |
此任务进程可用的最多 CPU 时间。 |
时间(秒) |
task.max-lwps |
此任务的进程可同时使用的最大 LWP 数。 |
数量 (LWP) |
process.max-cpu-time |
此进程可用的最长 CPU 时间。 |
时间(秒) |
process.max-file-descriptor |
此进程可用的最大文件描述符索引。 |
索引(最大文件描述符) |
process.max-file-size |
此进程可写入的最大文件偏移。 |
大小(字节) |
process.max-core-size |
此进程创建的最大核心转储文件大小。 |
大小(字节) |
process.max-data-size |
此进程可用的最大堆栈缓冲池内存。 |
大小(字节) |
process.max-stack-size |
此进程可用的最大堆栈缓冲池内存段。 |
大小(字节) |
process.max-address-space |
此进程可用的最大地址空间量,即段大小的总和。 |
大小(字节) |
process.max-port-events |
每事件端口允许的最大事件数。 |
数量(事件数) |
process.max-sem-nsems |
每信号集允许的最大信息数。 |
数量(每集合中的信号数) |
process.max-sem-ops |
每 semop 调用允许的最大信号操作数(在 semget() 时间从资源控制复制的值)。 |
数量(操作数) |
process.max-msg-qbytes |
消息队列中消息的最大字节数(在 msgget() 时间从资源控制复制的值)。 |
大小(字节) |
process.max-msg-messages |
消息队列中的最大消息数(在 msgget() 时间从资源控制复制的值)。 |
数量(消息数) |
您可以在未设置或更改任何资源控制的系统上显示资源控制的缺省值。此类系统在 /etc/system 或 project 数据库中不包含任何非缺省条目。要显示值,请使用 prctl 命令。
区域范围的资源控制可限制区域内所有进程实体总的资源使用情况。也可以使用全局属性名称来设置区域范围的资源控制,如设置区域范围的资源控制和如何配置区域中所述。
表 6–2 区域范围的资源控制
控制名称 |
说明 |
缺省单位 |
---|---|---|
zone.cpu-cap |
Solaris 10 5/08:非全局区域可以占用的 CPU 资源量的绝对限制。值 100 表示将一个 CPU 的 100% 用作 project.cpu-cap 设置。值 125 表示 125%,因为在使用 CPU 上限时,100% 对应于系统中的一个 CPU。 |
数量(CPU 数目) |
zone.cpu-shares |
此区域的公平份额调度器 (fair share scheduler, FSS) CPU 份额数 |
数量(份额) |
zone.max-locked-memory |
区域可用的锁定物理内存的总量 在将 priv_proc_lock_memory 指定给区域时,请考虑同时设置此资源控制,以防止该区域锁定所有内存。 |
大小(字节) |
zone.max-lwps |
此区域可同时使用的最大 LWP 数 |
数量 (LWP) |
zone.max-msg-ids |
此区域允许的最大消息队列 ID 数 |
数量(消息队列 ID) |
zone.max-sem-ids |
此区域允许的最大信号量 ID 数 |
数量(信号量 ID) |
zone.max-shm-ids |
此区域允许的最大共享内存 ID 数 |
数量(共享内存 ID) |
zone.max-shm-memory |
此区域允许的系统 V 共享内存总量 |
大小(字节) |
zone.max-swap |
可用于此区域的用户进程地址空间映射和 tmpfs 挂载的交换空间总量 |
大小(字节) |
有关配置区域范围的资源控制的信息,请参见资源类型属性和如何配置区域。要在 lx 标记区域中使用区域范围的资源控制,请参见如何配置、检验和提交 lx 标记区域。
请注意,可将区域范围的资源控制应用于全局区域。有关其他信息,请参见第 17 章和在安装了区域的 Solaris 系统上使用公平份额调度器。
所有资源控制均定义了标识资源控制类型的全局标志。系统使用这些标志将基本类型信息传递给应用程序(如 prctl 命令)。应用程序使用此信息确定以下内容:
适用于每个资源控制的单位字符串
解释标度值时要使用的正确标度
以下全局标志均可用:
全局标志 |
资源控制类型字符串 |
修饰符 |
标度 |
---|---|---|---|
RCTL_GLOBAL_BYTES |
bytes |
B |
1 |
|
KB |
210 |
|
|
MB |
220 |
|
|
GB |
230 |
|
|
TB |
240 |
|
|
PB |
250 |
|
|
EB |
260 |
|
RCTL_GLOBAL_SECONDS |
seconds |
s |
1 |
|
Ks |
103 |
|
|
Ms |
106 |
|
|
Gs |
109 |
|
|
Ts |
1012 |
|
|
Ps |
1015 |
|
|
Es |
1018 |
|
RCTL_GLOBAL_COUNT |
count |
无 |
1 |
|
K |
103 |
|
|
M |
106 |
|
|
G |
109 |
|
|
T |
1012 |
|
|
P |
1015 |
|
|
E |
1018 |
标度值可用于资源控制。以下示例显示了标度阈值:
task.max-lwps=(priv,1K,deny)
单位修饰符由 prctl、projadd 和 projmod 命令接受。您不能在 project 数据库本身中使用单位修饰符。
资源控制的阈值设立了一个执行点,在此点可能会触发本地操作或者发生全局操作(如日志记录)。
资源控制的每个阈值都必须与某个权限级别相关联。权限级别必须为以下三种类型之一。
基本,此类型的权限级别可由调用过程的属主修改
特权,此类型的权限级别仅可由特权(超级用户)调用方修改
系统,此类型的权限级别在操作系统实例的持续时间内固定不变
每个资源控制都保证有一个由系统或资源提供器定义的系统值。系统值表示操作系统的当前实现可以提供的资源量。
可以定义任意数量的权限值,但仅允许定义一个基本值。缺省情况下,将为没有指定权限值时执行的操作指定基本权限。
资源控制值的权限级别在资源控制块(如 RCTL_BASIC、RCTL_PRIVILEGED 或 RCTL_SYSTEM)的权限字段中定义。有关更多信息,请参见 setrctl(2)。您可以使用 prctl 命令来修改与基本级别和特权级别关联的值。
全局操作应用于系统中每个资源控制的资源控制值。您可以使用 rctladm(1M) 手册页中所述的 rctladm 命令来执行以下操作:
显示活动系统资源控制的全局状态
设置全局日志操作
您可以对资源控制禁用或启用全局日志操作。通过指定严重性级别,您可以将 syslog 操作设置为特定的级别 syslog=level。level 的可能设置如下:
debug
info
notice
warning
err
crit
alert
emerg
缺省情况下,没有资源控制违规的全局日志。在 Solaris 10 5/08 发行版中,为无法配置全局操作的资源控制添加了级别 n/a。
本地操作对试图超过控制值的进程执行。对于为资源控制设定的每个阈值,您都可以关联一个或多个操作。有三种类型的本地操作: none、deny 和 signal=。这三种操作按以下方式使用:
对于请求数量大于阈值的资源请求不执行任何操作。在不影响应用程序进度的情况下监视资源的使用情况时,此操作非常有用。虽然超过阈值的进程不会受到影响,但是您还可以启用在超过资源控制时显示的全局消息。
您可以拒绝请求数量大于阈值的资源请求。例如,如果新的进程超过控制值,则带有操作 deny 的 task.max-lwps 资源控制会导致 fork 系统调用失败。请参见 fork(2) 手册页。
您可以在超过资源控制时启用全局信号消息操作。当超过阈值时,会向进程发送信号。如果进程占用了其他资源,则不会发送其他信号。表 6–3 中列出了可用的信号。
并非所有的操作都可应用于每个资源控制。例如,某个进程的 CPU 份额数不能超过为其所属的项目指定的 CPU 份额数。因此,不允许对 project.cpu-shares 资源控制执行拒绝操作。
由于存在实现限制,因此,每个控制的全局属性可以限制可对阈值设置的可用操作的范围。(请参见 rctladm(1M) 手册页。)下表列出了可用信号操作。有关信号的其他信息,请参见 signal(3HEAD) 手册页。
表 6–3 可用于资源控制值的信号
信号 |
说明 |
说明 |
---|---|---|
SIGABRT |
终止进程。 |
|
SIGHUP |
发送挂起信号。当载波在断开的线路上停止时出现。发送给控制终端的进程组的信号。 |
|
SIGTERM |
终止进程。由软件发送的终止信号。 |
|
SIGKILL |
终止进程并中止程序。 |
|
SIGSTOP |
停止进程。作业控制信号。 |
|
SIGXRES |
超过了资源控制限制。由资源控制功能生成。 |
|
SIGXFSZ |
终止进程。超过了文件大小限制。 |
仅可用于具有 RCTL_GLOBAL_FILE_SIZE 属性的资源控制 (process.max-file-size)。有关更多信息,请参见 rctlblk_set_value(3C)。 |
SIGXCPU |
终止进程。超过了 CPU 时间限制。 |
仅可用于具有 RCTL_GLOBAL_CPUTIME 属性的资源控制 (process.max-cpu-time)。有关更多信息,请参见 rctlblk_set_value(3C)。 |
系统的每个资源控制都有一组特定的关联属性。这组属性定义为一组标志,这些标志与此资源的所有受控实例关联。不能修改全局标志,但是可以使用 rctladm 或 getrctl 系统调用检索这些标志。
本地标志可为特定进程或进程集合中资源控制的特定阈值定义缺省行为和配置。一个阈值的本地标志不会影响同一资源控制的其他已定义阈值的行为。但是,全局标志会影响与特定控制关联的每个值的行为。可以在本地标志对应的全局标志提供的约束内,使用 prctl 命令或 setrctl 系统调用对本地标志进行修改。请参见 setrctl(2)。
有关本地标志、全局标志及其定义的完整列表,请参见 rctlblk_set_value(3C)。
要确定在达到特定资源控制的阈值时的系统行为,请使用 rctladm 显示此资源控制的全局标志。例如,要显示 process.max-cpu-time 的值,请键入以下内容:
$ rctladm process.max-cpu-time process.max-cpu-time syslog=off [ lowerable no-deny cpu-time inf seconds ] |
全局标志表示以下内容。
不需要超级用户权限来减小此控制的权限值。
即使当超过阈值时,也从不拒绝对资源的访问。
SIGXCPU 可用于在到达此资源的阈值时发送。
资源控制的时间值。
不能设置权限类型为 basic 的资源控制值。只允许有特权的资源控制值。
不能对资源控制值设置本地信号操作。
不能为此资源控制设置全局 syslog 消息操作。
超出阈值时总是拒绝资源请求。
资源控制的计数(整数)值。
资源控制大小的单位。
使用 prctl 命令可以显示资源控制的本地值和操作。
$ prctl -n process.max-cpu-time $$ process 353939: -ksh NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT process.max-cpu-time privileged 18.4Es inf signal=XCPU - system 18.4Es inf none |
为两个阈值都设置了 max (RCTL_LOCAL_MAXIMAL) 标志,并且为此资源控制定义了 inf (RCTL_GLOBAL_INFINITE) 标志。inf 值可以是无穷大,但从不会达到。因此,如同配置的那样,两个阈值都表示从不会超过的无穷大值。
一个资源可以存在多个资源控制。进程模型中的每个内嵌项目级别均可存在资源控制。如果同一资源的不同容器级别上的资源控制都处于活动状态,则首先执行最小容器的控制。因此,如果同时遇到 process.max-cpu-time 和 task.max-cpu-time 这两个控制,则先对前者执行操作。
通常,进程的资源消耗情况是未知的。要获取更多信息,请尝试执行全局资源控制操作,通过 rctladm 命令可实现这些操作。使用 rctladm 可以对资源控制设置 syslog 操作。然后,如果此资源控制管理的任意实体达到阈值,则会在已配置的日志级别上记录系统消息。有关更多信息,请参见第 7 章和 rctladm(1M) 手册页。