Solaris Resource Manager 1.3 系统管理指南

第 7 章 内存限制、进程内存限制和进程计数限制

Solaris Resource Manager 允许管理员控制:

虚拟内存控制属性(总和)

用于记录虚拟内存利用率并向其分配限制的系统属性包括:

memory.myusage

某一 lnode 的 memory.myusage 属性,等于当前附加到该 lnode 的所有进程的虚拟内存利用率的总和。

memory.usage

lnode 的 memory.usage 属性等于它的 memory.myusage 属性及其子 lnode 的 memory.usage 属性的总和。

memory.limit

memory.limit 属性应用于 memory.usage 属性。它对附加到 lnode 及其成员 lnode 的所有进程的内存利用率总和加以限制。

进程内存控制属性(每一进程)

用于记录进程利用率并向其分配限制的系统属性是:

memory.plimit

lnode 的 memory.plimit 属性是针对每一进程的限制,分别应用于附加到该 lnode 或其任意成员的每个进程的内存利用率。

内存限制的技术描述

每当某个进程试图增加其内存大小时,就受制于其所附加的 lnode 的内存限制(总和或者每一进程)。一个进程有五个方法可以用来尝试增加其内存大小:

  1. 调用一个诸如 malloc(3C) 的分配例行程序,可产生对 sbrk(2) 系统调用的调用。如果超过了某个内存限制,该调用就会返回一个错误,并把 errno 设定为 ENOMEM。

  2. 扩充堆栈,促成一个堆栈故障,这样通常会促使向进程提供另外一个内存页。如果超过了内存限制,将会向进程发送一个 SIGSEGV 信号。

  3. 使用 mmap(2)。

  4. 使用 fork(2)。一个子地址空间被复制,但仍被父进程所拥有。在复制过程中,新地址空间不会超过 memory.plimit,因为父节点必须已经在该限制内;但是,分配受 memory.limit 的制约。

  5. 使用 exec(2)。在 exec 过程中,内存利用率将随旧的地址空间被丢弃而首先减小。但如果新程序的地址空间更大,并产生超过限制的情况,则 exec 可能会失败。

动态重新配置和虚拟内存限制

Enterprise 10000 系统所提供的动态重新配置 (DR) 功能对于施加在 lnode 上的虚拟内存限制具有限制影响。特别地,DR 使得在系统运行期间在系统中增加或删除物理内存成为可能。(该系统的虚拟内存集包括所有物理内存,及配置在系统中的交换空间。)此外,可在任何 Solaris 系统上使用 swap(1M) 命令在系统上添加(-a)或删除(-d)交换空间。这样,虚拟内存的总量可在运行过程中增加或减少。

这对 Solaris Resource Manager 所施加的虚拟内存限制有一个间接的影响。因为虚拟内存是用绝对单位(而不是用份额单位)来管理的。有效限制并不随着系统资源在操作过程中的变化而变化。(注意,该性能不同于对进程的动态重新配置,有关讨论见于 动态重新配置。)

进程计数控制属性

用于管理进程利用率(进程数目)的系统属性是:

process.myusage

某个 lnode 的 process.myusage 属性等于附加到该 lnode上的进程数目。

process.usage

lnode 的 memory.usage 属性等于它的 memory.myusage 属性及其子 lnode 的 memory.usage 属性的总和。

process.limit

process.limit 属性是应用于某个 lnode 的 process.usage 属性的一个限制;它可限制能附加到该 lnode 及所有同时运行的成员 lnode 上的进程的数目。

进程计数技术描述

fork(2) 和 vfork(2) 系统调用用于创建新的进程。如果这造成超过进程限制,则该系统调用失败,并返回一个 EAGAIN 错误。多数程序都把 EAGAIN 的含义解释为系统资源的暂时缺乏,并可能在短暂睡眠后再次尝试 fork。如果 fork 失败是因为某个 Solaris Resource Manager 限制造成的,这就会造成在无限长时 间内进行循环,因为在受影响 lnode 的限制被固定之前,每次重新尝试都会返回一个 EAGAIN。