resource-controls - 通过项目数据库提供的资源控制
资源控制工具通过项目数据库进行配置。请参见 project(5)。您可以通过以下实用程序设置和修改资源控制:
在程序中,您可以使用 setrctl(2) 来设置资源控制值。
除了前述资源控制以外,还存在可通过 pooladm(8) 和 poolcfg(8) 实用程序访问的资源池。在程序中,可通过 libpool(3LIB) 库操作资源池。
下面列出了一些可用的资源控制:
此进程可用的最大地址空间量,即段大小的总和,以字节数表示。
用于存储可能写入后备存储的页面的 ADI 元数据的内存总量,以字节数表示。The maximum amount of metadata needed for each ADI page is determined by sysconf(_SC_ADI_METADATA_MAX).对于从不写入后备存储的页面(例如,创建时使用了 SHM_SHARE_MMU 标志的共享内存页面),不保留元数据内存。是否为 mlock() 页面保留元数据与实现相关。有关更多信息,请参见 sysconf(3C) 和 mlock(3C) 手册页。
此进程创建的最大核心文件大小,以字节数表示。
此进程可用的最长 CPU 时间,以秒数表示。
此进程可用的最大堆内存,以字节数表示。
此进程可用的最大文件描述符索引,以整数表示。
此进程可写入的最大文件偏移,以字节数表示。
允许的最大间隔计时器数,以整数表示。
Minimum timer interval, expressed as microseconds.If the value is less than 100 microseconds, the system will use the larger value.
消息队列中的最大消息数(在 msgget() 时间从资源控制复制的值),表示为整数。
消息队列中消息的最大字节数(在 msgget() 时间从资源控制复制的值),以字节数表示。
每事件端口允许的最大事件数,以整数表示。
每信号集允许的最大信号数目,以整数表示。
每 semop 调用允许的最大信号操作数(在 semget() 时间从资源控制复制的值)。以整数表示,用于指定操作数目。
进程可具有的待处理排队信号最大数目。
此进程可用的最大栈内存区段,以字节数表示。
项目可以使用的 CPU 资源最大量。使用的单位是项目中所有用户线程可使用的单个 CPU 的百分比。以整数表示。上限不适用于实时调度类中运行的线程。此资源控制不支持 syslog 操作。
授予项目的 CPU 份额数,用于公平份额调度器(请参见 FSS(4))。使用的单位是共享数目(整数)。此资源控制不支持 syslog 操作。
项目中允许的最大合同数目,以整数表示。
可用于加密操作的最大内核内存量。内核中对缓冲区的分配以及与会话相关的结构分配都按照此资源控制执行。
允许的最大延迟发布数目,以整数表示。
设备驱动程序和用户进程(包括 DISM/ISM/OSM)锁定的物理内存总量,以字节数表示。
项目可同时使用的最大 LWP 数目,以整数表示。
项目允许的最大消息队列 ID 数目,以整数表示。
允许的最大事件端口数目,以整数表示。
项目可同时使用的最大进程数目,以整数表示。
项目允许的最大信号 ID 数目,以整数表示。
项目允许的最大共享内存 ID 数目,以整数表示。
项目允许的共享内存总量,以字节数表示。
项目中允许的最大任务数目,以整数表示。
将指定的资源池与项目绑定。
项目中的进程可用的物理内存总量(字节)。
此任务的进程可用的最长 CPU 时间,以秒数表示。
此任务的进程可同时使用的最大 LWP 数目,以整数表示。
任务可同时使用的最大进程数目,以整数表示。
以下是可用的区域范围的资源控制:
用于存储可能写入后备存储的页面的 ADI 元数据的内存总量,以字节数表示。The maximum amount of metadata needed for each ADI page is determined by sysconf(_SC_ADI_METADATA_MAX).对于从不写入后备存储的页面(例如,创建时使用了 SHM_SHARE_MMU 标志的共享内存页面),不保留元数据内存。是否为 formlock() 页面保留元数据与实现相关。有关更多信息,请参见 sysconf(3C) 和 mlock(3C) 手册页。
设置可供某个区域使用的 CPU 时间量的限制。使用的单位是区域中所有用户线程可使用的单个 CPU 的百分比。以整数表示。当设置有上限的区域中的项目有其自己的上限时,优先采用最小值。此资源控制不支持 syslog 操作。
对区域的公平份额调度器 (fair share scheduler, FSS) CPU 份额数设置限制。CPU 份额首先分配给区域,然后在区域内的项目之间进一步分配,如 project.cpu-shares 项中所述。以整数表示。此资源控制不支持 syslog 操作。
区域可用的锁定物理内存的总量
区域可用的最大 lofi(4D) 设备数目。
通过阻止一个区域中的过多 LWP 影响其他区域来增强资源隔离。区域的 LWP 总数可以使用 project.max-lwps 条目在区域内的项目之间进一步细分。以整数表示。
区域允许的最大消息队列 ID 数目,以整数表示。
区域可同时使用的最大进程数目,以整数表示。
区域允许的最大信号 ID 数目,以整数表示。
区域允许的最大共享内存 ID 数目,以整数表示。
区域允许的共享内存总量,以字节数表示。
此区域的用户进程地址空间映射和 tmpfs 挂载可以占用的交换空间(虚拟内存)总量。
请参见 zones(7)。
资源控制可以采用大小(字节)、时间(秒)或计数(整数)单位来表示。这些单位使用以下指定的字符串。
Category Res Ctrl Modifier Scale Type String ----------- ----------- -------- ----- Size bytes B 1 KB 2^10 MB 2^20 GB 2^30 TB 2^40 PB 2^50 EB 2^60 Time seconds s 1 Ks 10^3 Ms 10^6 Gs 10^9 Ts 10^12 Ps 10^15 Es 10^18 Count integer none 1 K 10^3 M 10^6 G 10^9 T 10^12 P 10^15 Es 10^18
标度值可用于资源控制。以下示例显示了标度阈值:
task.max-lwps=(priv,1K,deny)
在 project 文件中,值 1K 扩展为 1000:
task.max-lwps=(priv,1000,deny)
第二个示例使用较大的比例值:
process.max-file-size=(priv,5G,deny)
在 project 文件中,值 5G 扩展为 5368709120:
process.max-file-size=(priv,5368709120,deny)
前述示例使用上表中指定的比例系数。
请注意,prctl(1), projadd(8) 和 projmod(8) 命令接受单位修饰符(例如,5G)。您不能在project数据库本身中使用单位修饰符。
资源控制的阈值相当于可能会引发本地操作或进行全局操作(如记录)的某个点。
资源控制的每个阈值都必须与某个特权级别相关联。特权级别必须为以下三种类型之一:
可由调用进程的所有者修改。
可由当前进程(需要 sys_resource 特权)或由 prctl(1)(需要 proc_owner 特权)修改。
在操作系统实例的持续时间内固定不变。
每个资源控制都保证有一个由系统或资源提供器定义的 system 值。system 值表示操作系统的当前实现可以提供的资源量。
可以定义任意数量的特权值,但仅允许定义一个基本值。缺省情况下,将为没有指定特权值时执行的操作指定基本特权。
资源控制值的特权级别在资源控制块(如 RCTL_BASIC、RCTL_PRIVILEGED 或 RCTL_SYSTEM)的特权字段中定义。有关更多信息,请参见 setrctl(2)。您可以使用 prctl 命令来修改与基本级别和特权级别关联的值。
在指定 privileged 的特权级别时,您可以使用缩写 priv。例如:
task.max-lwps=(priv,1K,deny)
针对资源控制值可执行两种类别的操作:全局操作和本地操作。
全局操作应用于系统中每个资源控制的资源控制值。可以使用 rctladm(8) 执行以下操作:
显示活动系统资源控制的全局状态。
设置全局日志操作。
您可以对资源控制禁用或启用全局日志操作。通过指定严重性级别,您可以将 syslog 操作设置为特定的级别 syslog=level。level 的可能设置如下:
debug
info
notice
warning
err
crit
alert
emerg
缺省情况下,没有资源控制违规的全局日志。
本地操作对试图超过控制值的进程执行。对于为资源控制设定的每个阈值,您都可以关联一个或多个操作。有三种类型的本地操作: none、deny 和 signal=。这三种操作按以下方式使用:
对于请求数量大于阈值的资源请求不执行任何操作。在不影响应用程序进度的情况下监视资源的使用情况时,此操作非常有用。您还可以启用在超过资源控制时显示的全局消息,而同时不会影响超过阈值的进程。
您可以拒绝请求数量大于阈值的资源请求。例如,如果新的进程超过控制值,则带有操作拒绝的 task.max-lwps 资源控制会导致 fork() 系统调用失败。请参见 fork(2)。
您可以在超过资源控制时启用全局信号消息操作。当超过阈值时,会向进程发送信号。如果进程占用了其他资源,则不会发送其他信号。下面列出了可用的信号。
并非所有的操作都可应用于每个资源控制。例如,某个进程的 CPU 份额数不能超过为其所属的项目指定的 CPU 份额数。因此,不允许对 project.cpu-shares 资源控制执行拒绝操作。
由于存在实现限制,因此,每个控制的全局属性可以限制可对阈值设置的可用操作的范围。(请参见 rctladm(8)。)下面列出了可用信号操作。有关信号的其他信息,请参见 signal(3HEAD)。
以下列出了可用于资源控制值的信号:
终止进程。
发送挂起信号。当载波在断开的线路上停止时出现。发送给控制终端的进程组的信号。
终止进程。由软件发送的终止信号。
终止进程并中止程序。
停止进程。作业控制信号。
超过了资源控制限制。由资源控制功能生成。
终止进程。超过了文件大小限制。仅可用于具有 RCTL_GLOBAL_FILE_SIZE 属性的资源控制 (process.max-file-size)。请参见 rctlblk_set_value(3C)。
终止进程。超过了 CPU 时间限制。仅可用于具有 RCTL_GLOBAL_CPUTIME 属性的资源控制 (process.max-cpu-time)。请参见 rctlblk_set_value(3C)。
系统的每个资源控制都有一组特定的关联属性。这组属性定义为一组标志,这些标志与此资源的所有受控实例关联。不能修改全局标志,但是可以使用 rctladm(8) 或 setrctl(2) 系统调用检索这些标志。
本地标志可为特定进程或进程集合中资源控制的特定阈值定义缺省行为和配置。一个阈值的本地标志不会影响同一资源控制的其他已定义阈值的行为。但是,全局标志会影响与特定控制关联的每个值的行为。可以在本地标志对应的全局标志提供的约束内,使用 prctl 命令或 setrctl 系统调用对本地标志进行修改。See setrctl(2).
有关本地标志、全局标志及其定义的完整列表,请参见 rctlblk_set_value(3C)。
To determine system behavior when a threshold value for a particular resource control is reached, use rctladm to display the global flags for the resource control.例如,要显示 process.max-cpu-time 的值,请输入:
$ rctladm process.max-cpu-time process.max-cpu-time syslog=off [ lowerable no-deny cpu-time inf seconds ]
全局标志表示以下内容:
The {PRIV_SYS_RESOURCE} privilege is not required to lower the privileged values for this control.If this flag is not present, then the {PRIV_SYS_RESOURCE} privilege is required to lower the privileged values for this control.
即使当超过阈值时,也从不拒绝对资源的访问。
当达到此资源的阈值时可发送 SIGXCPU。
资源控制的时间值。
使用 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 这两个控制,则先对前者执行操作。
有关以下属性的说明,请参见 attributes(7):
|
prctl(1), memcntl(2), setrctl(2), rctlblk_set_value(3C), libpool(3LIB), lofi(4D), FSS(4), project(5), attributes(7), privileges(7), pooladm(8), poolcfg(8), projadd(8), projmod(8), rctladm(8)
《Administering Resource Management in Oracle Solaris 11.4》
A project is active if and only if there is at least one existing process in it.A project becomes active and is initialized from its entry in the project(5) database when a process joins a project that was not active. When the project(5) database is modified, an active project is not re-initialized unless projmod(8) with the –A option is executed on the project via option –p, or project_update_byname() library function is called with the project name as its argument, see setproject(3PROJECT). Every zone has its own project namespace.