适用于 Solaris 2.6 (SPARC 平台版) 的 Solaris Resource Manager 1.0 系统管理指南

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

Solaris Resource Manager 允许管理员控制:

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

有若干系统属性,可以用于记录虚拟内存的利用率,以及向其指派限制。

用于管理内存利用率的系统属性为

memory.myusage

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

memory.usage

一个 lnode 的 memory.usage attribute 等于它的 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 的 process.usage 属性等于其 process.myusage 属性及其子 lnode 的 process.myusage 属性的总和。

process.limit

process.limit 属性是一个限制,应用于一个 lnode 的process.usage 属性,以便对可以同时附加到该 lnode 及其所有成员 lnode 的进程的数目加以限制。

进程计数技术描述

fork(2)fork1(2)vfork(2)系统调用用于创建新的进程。如果有可能导致超过进程限制,则系统调用失败,返回一个 EAGAIN 错误。大多数程序将 EAGAIN 错误解释为系统资源暂时短缺,请再次尝试 fork,可能需要先睡上一小觉。如果 fork 失败是由于某个 Solaris Resource Manager 限制,则有可能导致无限时间的循环,因为每次尝试都会返回 EAGAIN,一直到为受影响的 lnode 的限制得到固定。