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

第 6 章 资源控制(概述)

按照第 4 章中所述确定系统上工作负荷的资源消耗情况之后,便可对资源的使用情况设定限制。这些限制可防止工作负荷过度消耗资源。资源控制功能是用于此用途的约束机制。

本章包含以下主题:

有关如何管理资源控制的信息,请参见第 7 章

Solaris 10 在资源控制方面的新增功能

以下一组资源控制取代了 System V 进程间通信 (interprocess communication, IPC) /etc/system 可调参数:

已添加了以下事件端口资源控制:

已添加了以下加密资源控制:

已添加了以下其他资源控制:

有关更多信息,请参见可用的资源控制

有关 Solaris 10 新增功能的完整列表以及 Solaris 发行版的说明,请参见《Oracle Solaris 10 9/10 新增功能》

资源控制概念

在 Solaris 操作系统中,每进程资源限制的概念已扩展到第 2 章中所述的任务和项目实体。这些增强功能由资源控制 (resource control, rctl) 功能提供。此外,通过 /etc/system 可调参数设置的分配现在可以自动配置,也可以借助资源控制机制来配置。

资源控制由前缀 zoneprojecttaskprocess 标识。可以查看系统范围的资源控制。可以在正在运行的系统上更新资源控制值。

有关此发行版中提供的标准资源控制的列表,请参见可用的资源控制。有关可用的区域范围的资源控制的信息,请参见资源类型属性

有关此发行版中提供的标准资源控制的列表,请参见可用的资源控制

资源限制和资源控制

UNIX 系统一直以来都提供资源限制功能 (rlimit)。使用 rlimit 功能,管理员可以对进程可占用的资源设置一个或多个数值限制。这些限制包括每个进程使用的 CPU 时间、每个进程的核心转储文件大小以及每个进程的最大堆大小。堆大小是指为进程数据段分配的临时内存量。

资源控制功能提供了用于资源限制功能的兼容性接口。使用资源限制的现有应用程序将继续运行,不会更改。这些应用程序的观察方法,与修改之后可利用资源控制功能的应用程序的观察方法相同。

进程间通信和资源控制

使用几种进程间通信 (interprocess communication, IPC) 之一,进程可以相互通信。使用 IPC,可以在进程之间传输和同步信息。在 Solaris 10 之前的发行版中,IPC 可调参数是通过向 /etc/system 文件中添加条目来设置的。现在,资源控制功能提供了可定义内核的 IPC 功能行为的资源控制。这些资源控制将替换 /etc/system 可调参数。

此 Solaris 系统上的 /etc/system 文件中可能包含过时参数。如果是这样,这些参数将像在以前的 Solaris 发行版中一样用来初始化缺省的资源控制值。但是,不推荐使用过时参数。

要查看哪些 IPC 对象在使用项目资源,请使用带有 -J 选项的 ipcs 命令。要查看示例显示,请参见如何使用 ipcs。有关 ipcs 命令的更多信息,请参见 ipcs(1)

有关 Solaris 系统调优的信息,请参见《Oracle Solaris Tunable Parameters Reference Manual》

资源控制约束机制

资源控制提供了一种系统资源约束机制,可以防止进程、任务、项目和区域占用指定的系统资源量。此机制通过防止占用过多的资源,可使系统更易于管理。

约束机制可用于支持容量规划过程。有一种偶尔会用到的约束,它可以提供有关应用程序资源需求的信息,而不必拒绝为应用程序分配的资源。

项目属性机制

资源控制还可以作为资源管理功能的简单属性机制。例如,可用于公平份额调度器 (fair share scheduler, FSS) 调度类中项目的 CPU 份额数由 project.cpu-shares 资源控制定义。由于此控制为项目指定了固定的份额数,因此,与超过控制有关的各项操作不相关联。在此上下文中,将 project.cpu-shares 控制的当前值视为指定项目的属性。

另一类型的项目属性用于控制附加到项目的进程集合对物理内存资源的消耗。这些属性具有前缀 rcap,例如 rcap.max-rss。与资源控制类似,此类型的属性也在 project 数据库中配置。但是,资源控制由内核同步执行,而资源上限则由资源上限执行守护进程 rcapd 在用户级别上异步执行。有关 rcapd 的信息,请参见第 10 章和 rcapd (1M)。

project.pool 属性用于指定项目的池绑定。有关资源池的更多信息,请参见第 12 章

配置资源控制和属性

资源控制功能通过 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) 手册页。

应用资源控制

在登录或者调用 newtasksu 或项目识别的其他启动程序 at batchcron 时,可以为项目指定表 6–1 中列出的每个资源控制。每个启动的命令都会在发出调用的用户的缺省项目的单独任务中启动。有关更多信息,请参见 login(1)newtask(1)at(1)cron(1M)su(1M)

project 数据库中条目的更新(无论是对 /etc/project 文件还是对网络名称服务中此数据库表示的内容)不会应用于当前活动的项目。更新在新任务通过登录或 newtask 加入项目时应用。

在正在运行的系统上临时更新资源控制值

project 数据库中更改的值仅对项目中启动的新任务有效。但是,您可以使用 rctladm 命令和 prctl 命令在正在运行的系统上更新资源控制。

更新日志状态

rctladm 命令会影响系统范围内每个资源控制的全局日志状态。此命令可用于在超过控制时查看 syslog 日志的全局状态并设置此日志的级别。

更新资源控制

使用 prctl 命令,可以按进程、按任务或按项目查看资源控制值和操作,并临时更改资源控制值和操作。项目、任务或进程的 ID 作为输入提供,并且此命令在定义了控制的级别上针对资源控制运行。

对值和操作所做的修改会立即生效。但是,这些修改仅应用于当前的进程、任务或项目。更改不会在 project 数据库中记录。如果重新启动系统,则修改会丢失。必须在 project 数据库中对资源控制进行永久性更改。

所有可在 project 数据库中修改的资源控制设置也可使用 prctl 命令进行修改。可以添加或删除基本值和权限值,还可以修改其操作。缺省情况下,基本类型可用于所有设置的操作,但是具有超级用户权限的进程和用户还可以修改特权资源控制。不能更改系统资源控制。

用于资源控制的命令

下表显示了用于资源控制的命令。

命令参考 

说明 

ipcs(1)

可用于查看使用项目资源的 IPC 对象 

prctl(1)

可用于对资源控制功能在本地范围进行运行时询问和修改 

rctladm(1M)

可用于对资源控制功能在全局范围进行运行时询问和修改 

resource_controls(5) 手册页介绍了通过项目数据库提供的资源控制,其中包括单位和标度因数。