系统管理指南:Oracle Solaris Containers-资源管理和 Oracle Solaris Zones

配置资源控制和属性

资源控制功能通过 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/systemproject 数据库中不包含任何非缺省条目。要显示值,请使用 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 

 

KB 

210

 

MB 

220

 

GB 

230

 

TB 

240

 

PB 

250

 

EB 

260

RCTL_GLOBAL_SECONDS 

seconds 

 

Ks 

103

 

Ms 

106

 

Gs 

109

 

Ts 

1012

 

Ps 

1015

 

Es 

1018

RCTL_GLOBAL_COUNT 

count 

无 

 

103

 

106

 

109

 

1012

 

1015

 

1018

标度值可用于资源控制。以下示例显示了标度阈值:

task.max-lwps=(priv,1K,deny)

注 –

单位修饰符由 prctlprojaddprojmod 命令接受。您不能在 project 数据库本身中使用单位修饰符。


资源控制值和权限级别

资源控制的阈值设立了一个执行点,在此点可能会触发本地操作或者发生全局操作(如日志记录)。

资源控制的每个阈值都必须与某个权限级别相关联。权限级别必须为以下三种类型之一。

每个资源控制都保证有一个由系统或资源提供器定义的系统值。系统值表示操作系统的当前实现可以提供的资源量。

可以定义任意数量的权限值,但仅允许定义一个基本值。缺省情况下,将为没有指定权限值时执行的操作指定基本权限。

资源控制值的权限级别在资源控制块(如 RCTL_BASIC、RCTL_PRIVILEGED 或 RCTL_SYSTEM)的权限字段中定义。有关更多信息,请参见 setrctl(2)。您可以使用 prctl 命令来修改与基本级别和特权级别关联的值。

针对资源控制值的全局和本地操作

针对资源控制值可执行两种类别的操作: 全局操作和本地操作。

针对资源控制值的全局操作

全局操作应用于系统中每个资源控制的资源控制值。您可以使用 rctladm(1M) 手册页中所述的 rctladm 命令来执行以下操作:

您可以对资源控制禁用或启用全局日志操作。通过指定严重性级别,您可以将 syslog 操作设置为特定的级别 syslog=levellevel 的可能设置如下:

缺省情况下,没有资源控制违规的全局日志。在 Solaris 10 5/08 发行版中,为无法配置全局操作的资源控制添加了级别 n/a

针对资源控制值的本地操作

本地操作对试图超过控制值的进程执行。对于为资源控制设定的每个阈值,您都可以关联一个或多个操作。有三种类型的本地操作: nonedenysignal=。这三种操作按以下方式使用:

none

对于请求数量大于阈值的资源请求不执行任何操作。在不影响应用程序进度的情况下监视资源的使用情况时,此操作非常有用。虽然超过阈值的进程不会受到影响,但是您还可以启用在超过资源控制时显示的全局消息。

deny

您可以拒绝请求数量大于阈值的资源请求。例如,如果新的进程超过控制值,则带有操作 denytask.max-lwps 资源控制会导致 fork 系统调用失败。请参见 fork(2) 手册页。

signal=

您可以在超过资源控制时启用全局信号消息操作。当超过阈值时,会向进程发送信号。如果进程占用了其他资源,则不会发送其他信号。表 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)

资源控制标志和属性

系统的每个资源控制都有一组特定的关联属性。这组属性定义为一组标志,这些标志与此资源的所有受控实例关联。不能修改全局标志,但是可以使用 rctladmgetrctl 系统调用检索这些标志。

本地标志可为特定进程或进程集合中资源控制的特定阈值定义缺省行为和配置。一个阈值的本地标志不会影响同一资源控制的其他已定义阈值的行为。但是,全局标志会影响与特定控制关联的每个值的行为。可以在本地标志对应的全局标志提供的约束内,使用 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 ]

全局标志表示以下内容。

lowerable

不需要超级用户权限来减小此控制的权限值。

no-deny

即使当超过阈值时,也从不拒绝对资源的访问。

cpu-time

SIGXCPU 可用于在到达此资源的阈值时发送。

seconds

资源控制的时间值。

no-basic

不能设置权限类型为 basic 的资源控制值。只允许有特权的资源控制值。

no-signal

不能对资源控制值设置本地信号操作。

no-syslog

不能为此资源控制设置全局 syslog 消息操作。

deny

超出阈值时总是拒绝资源请求。

count

资源控制的计数(整数)值。

bytes

资源控制大小的单位。

使用 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-timetask.max-cpu-time 这两个控制,则先对前者执行操作。

图 6–1 进程集合、容器关系及其资源控制集

图中显示了每个资源控制在其内嵌项目级别的执行。

全局监视资源控制事件

通常,进程的资源消耗情况是未知的。要获取更多信息,请尝试执行全局资源控制操作,通过 rctladm 命令可实现这些操作。使用 rctladm 可以对资源控制设置 syslog 操作。然后,如果此资源控制管理的任意实体达到阈值,则会在已配置的日志级别上记录系统消息。有关更多信息,请参见第 7 章rctladm(1M) 手册页。