配置资源控制和属性
通过 project 数据库配置资源控制功能。请参见第 2 章。资源控制和其他属性在 project 数据库条目的最终字段中设置。与每个资源控制关联的值都括在括号中,并显示为用逗号分隔的纯文本。括号中的值构成一条“操作子句”。每条操作子句都包含一个特权级别、一个阈值以及一个与特定阈值关联的操作。每个资源控制可以有多条操作子句,这些子句也用逗号分隔。以下条目定义了项目实体的按任务轻量进程限制和按进程最多 CPU 时间限制。当进程运行 1 小时之后,process.max-cpu-time 将会向此进程发送 SIGTERM;如果此进程持续运行的总时间达到 1 小时 1 分钟,则会向此进程发送 SIGKILL。请参见表 6-3。
使用 rctladm 命令,可以对全局范围的资源控制功能进行运行时询问和修改。使用 prctl 命令,可以对本地范围的资源控制功能进行运行时询问和修改。
有关更多信息,请参见针对资源控制值的全局和本地操作、rctladm(1M) 和 prctl(1)。
注 - 在安装了区域的系统上,不能在非全局区域中使用 rctladm 来修改设置。您可以在非全局区域中使用 rctladm 来查看每个资源控制的全局日志状态。
可用的资源控制
该表介绍了每个控制所约束的资源,还列出了 project 数据库使用的该资源的缺省单位。缺省单位有两种类型:
-
数量代表有限数量。
-
索引代表最大有效标识符。
因此,project.cpu-shares 指定了项目有资格享有的份额数。process.max-file-descriptor 指定了可由 open(2) 系统调用指定给进程的最高文件编号。
表 6-1 标准项目、任务和进程资源控制
|
您可以在未设置或更改任何资源控制的系统上显示资源控制的缺省值。此类系统在 /etc/system 或 project 数据库中不包含任何非缺省条目。要显示值,请使用 prctl 命令。
区域范围的资源控制
区域范围的资源控制可限制区域内所有进程实体总的资源使用情况。也可以使用全局属性名称来设置区域范围的资源控制,如设置区域范围的资源控制和如何配置区域中所述。
表 6-2 区域资源控制
|
有关配置区域范围的资源控制的信息,请参见资源类型属性和如何配置区域。
请注意,可将区域范围的资源控制应用于全局区域。有关其他信息,请参见在安装了区域的 Oracle Solaris 系统上使用公平份额调度器。
单位支持
所有资源控制均定义了标识资源控制类型的全局标志。系统使用这些标志将基本类型信息传递给应用程序(如 prctl 命令)。应用程序使用此信息确定以下内容:
-
适用于每个资源控制的单位字符串
-
解释标度值时要使用的正确标度
以下全局标志均可用:
|
标度值可用于资源控制。以下示例显示了标度阈值:
注 - 单位修饰符由 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
缺省情况下,没有资源控制违规的全局日志。级别 n/a 指示无法对其配置全局操作的资源控制。
针对资源控制值的本地操作
本地操作对试图超过控制值的进程执行。对于为资源控制设定的每个阈值,您都可以关联一个或多个操作。有三种类型的本地操作: none、deny 和 signal=。这三种操作按以下方式使用:
-
none
-
对于请求数量大于阈值的资源请求不执行任何操作。在不影响应用程序进度的情况下监视资源的使用情况时,此操作非常有用。虽然超过阈值的进程不会受到影响,但是您还可以启用在超过资源控制时显示的全局消息。
deny
-
您可以拒绝请求数量大于阈值的资源请求。例如,如果新的进程超过控制值,则带有操作 deny 的 task.max-lwps 资源控制会导致 fork 系统调用失败。请参见 fork(2) 手册页。
signal=
-
您可以在超过资源控制时启用全局信号消息操作。当超过阈值时,会向进程发送信号。如果进程占用了其他资源,则不会发送其他信号。表 6-3 中列出了可用的信号。
并非所有的操作都可应用于每个资源控制。例如,某个进程的 CPU 份额数不能超过为其所属的项目指定的 CPU 份额数。因此,不允许对 project.cpu-shares 资源控制执行拒绝操作。
由于存在实现限制,因此,每个控制的全局属性可以限制可对阈值设置的可用操作的范围。(请参见 rctladm(1M) 手册页。)下表列出了可用信号操作。有关信号的其他信息,请参见signal(3HEAD) 手册页。
表 6-3 可用于资源控制值的信号
|
资源控制标志和属性
系统的每个资源控制都有一组特定的关联属性。这组属性定义为一组标志,这些标志与此资源的所有受控实例关联。不能修改全局标志,但是可以使用 rctladm 或 getrctl 系统调用检索这些标志。
本地标志可为特定进程或进程集合中资源控制的特定阈值定义缺省行为和配置。一个阈值的本地标志不会影响同一资源控制的其他已定义阈值的行为。但是,全局标志会影响与特定控制关联的每个值的行为。可以在本地标志对应的全局标志提供的约束内,使用 prctl 命令或 setrctl 系统调用对本地标志进行修改。请参见 setrctl(2)。
有关本地标志、全局标志及其定义的完整列表,请参见 rctlblk_set_value(3C)。
要确定在达到特定资源控制的阈值时的系统行为,请使用 rctladm 显示此资源控制的全局标志。例如,要显示 process.max-cpu-time 的值,请键入以下内容:
全局标志表示以下内容。
-
lowerable
-
不需要超级用户特权来减小此控制的特权值。
no-deny
-
即使当超过阈值时,也从不拒绝对资源的访问。
cpu-time
-
SIGXCPU 可用于在到达此资源的阈值时发送。
seconds
-
资源控制的时间值。
no-basic
-
不能设置特权类型为 basic 的资源控制值。只允许有特权的资源控制值。
no-signal
-
不能对资源控制值设置本地信号操作。
no-syslog
-
不能为此资源控制设置全局 syslog 消息操作。
deny
-
超出阈值时总是拒绝资源请求。
count
-
资源控制的计数(整数)值。
bytes
-
资源控制大小的单位。
使用 prctl 命令可以显示资源控制的本地值和操作。
为两个阈值都设置了 max (RCTL_LOCAL_MAXIMAL) 标志,并且为此资源控制定义了 inf (RCTL_GLOBAL_INFINITE) 标志。inf 值可以是无穷大,但从不会达到。因此,如同配置的那样,两个阈值都表示从不会超过的无穷大值。
资源控制执行
一个资源可以存在多个资源控制。进程模型中的每个内嵌项目级别均可存在资源控制。如果同一资源的不同容器级别上的资源控制都处于活动状态,则首先执行最小容器的控制。因此,如果同时遇到 process.max-cpu-time 和 task.max-cpu-time 这两个控制,则先对前者执行操作。
图 6-1 进程集合、容器关系及其资源控制集
![图中显示了每个资源控制在其内嵌项目级别的执行。 image:图中显示了每个资源控制在其内嵌项目级别的执行。](https://i-blog.csdnimg.cn/blog_migrate/1554222b7227e4758395d5638f12bba0.png)
全局监视资源控制事件
通常,进程的资源消耗情况是未知的。要获取更多信息,请尝试执行全局资源控制操作,通过 rctladm 命令可实现这些操作。使用 rctladm 可以对资源控制设置 syslog 操作。然后,如果此资源控制管理的任意实体达到阈值,则会在已配置的日志级别上记录系统消息。有关更多信息,请参见第 7 章和 rctladm(1M) 手册页。
转自: http://docs.oracle.com/cd/E26926_01/html/E25831/rmctrls-3.html