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

第 1 部分 资源管理

此部分介绍 Solaris 10 资源管理,您可以使用此软件控制应用程序使用可用系统资源的方式。

第 1 章 Solaris 10 资源管理介绍

资源管理功能是 Solaris Container 环境的一个组件。使用资源管理,您可以控制应用程序如何使用可用系统资源。其中包括:

本章包含以下主题:

资源管理概述

现代计算环境必须针对系统上不同应用程序产生的不同的工作负荷做出灵活的响应。工作负荷是一个或一组应用程序的所有进程的集合。如果没有使用资源管理功能,Solaris 操作系统通过动态适应新的应用程序请求来对工作负荷需求做出响应。该缺省响应通常表示系统上的所有活动都对资源具有同等的访问权。使用 Solaris 资源管理功能,您可以分别对待各个工作负荷。其中包括:

最大限度地减少工作负荷之间的性能影响以及监视资源使用情况和利用率的功能,称为资源管理。资源管理通过一组算法来实现。算法处理应用程序在执行过程中提出的一系列功能请求。

使用资源管理功能,您可以针对不同的工作负荷修改操作系统的缺省行为。行为主要是指应用程序向操作系统提出一个或多个资源请求时操作系统算法所做出的一组决定。可以使用资源管理功能进行以下操作:

实现使用资源管理功能的系统配置的目的有若干种。其中包括:

在规划资源管理配置时,主要要求如下:

识别合作的工作负荷和冲突的工作负荷后,可以在系统功能允许的范围内,创建对业务服务目标影响最小的资源配置。

通过提供控制机制、通知机制和监视机制,可在 Solaris 系统中实现有效资源管理。上述许多功能都是通过增强现有机制来提供的,例如 proc(4) 文件系统、处理器集和调度类。而其他功能是资源管理所特有的。这些功能将在后续章节中介绍。

资源分类

资源是可进行处理以更改应用程序行为的计算系统的任何方面。因此,资源就是应用程序隐式或显式请求的功能。如果拒绝或约束了此类功能,则强大的应用程序在执行时会慢很多。

相对于资源标识,可以按多种标准对资源进行分类。这些标准可以是隐式请求相对于显式请求,基于时间(例如 CPU 时间)相对于与时间无关(例如指定的 CPU 份额等)。

一般情况下,基于调度器的资源管理应用于应用程序可隐式请求的资源。例如,要继续执行,应用程序会隐式请求更多 CPU 时间。要将数据写入网络套接字,应用程序会隐式请求带宽。可针对隐式请求的资源的总使用量设置约束。

也可提供其他接口,以便显式协商带宽或 CPU 服务级别。明确请求的资源(例如请求附加线程)可以通过约束进行管理。

资源管理控制机制

Solaris 操作系统可用的三种控制机制为约束、调度和分区。

约束机制

使用约束,管理员或应用程序开发者可以对工作负荷所占用的特定资源设置限定。限制已知时,建立资源占用方案模型变得简单得多。也可使用限定控制不良应用程序,否则它们会通过发出无法控制的资源请求影响系统的性能或可用性。

约束确实给应用程序带来了复杂因素。它有可能会修改应用程序和系统之间的关系,导致应用程序无法再正常工作。降低这种风险的一种途径是用未知的资源行为逐渐减少对应用程序的约束。第 6 章中介绍的资源控制功能提供了一种约束机制。可通过编写新的应用程序来了解其资源约束,但是并不是所有应用程序编写者都选择这样做。

调度机制

调度是指按特定间隔做出一系列分配决定。所做的决定基于可预测的算法。不需要当前分配的应用程序会将资源留给其他应用程序使用。基于调度的资源管理可确保在配置的资源充裕时全部进行利用,在配置的资源处于临界或过量使用状态时提供控制分配。基础算法定义了如何解释术语“控制”。在某些情况下,调度算法可能会保证所有应用程序都对资源具有一定的访问权限。第 8 章中介绍的公平份额调度器 (fair share scheduler, FSS) 能够以可控的方法管理应用程序对 CPU 资源的访问权限。

分区机制

分区用于将工作负荷绑定到系统可用资源的子集。该绑定保证工作负荷总是能够使用一定量的资源。使用第 12 章中介绍的资源池功能,您可以将工作负荷限定为使用计算机的特定资源部分。

使用分区的配置可避免整个系统的资源缺乏。但是,避免资源缺乏的同时,也降低了实现高利用率的能力。对于保留的资源组(例如处理器),即使其绑定的工作负荷处于闲置状态,也不能由其他工作负荷使用。

资源管理配置

部分资源管理配置可能位于网络名称服务中。该功能允许管理员在一组计算机集合中应用资源管理约束,而不是专门基于单个计算机应用。相关工作可共享一个通用标识符,可以通过记帐数据将此工作的总使用量制成表格。

第 2 章中更加全面地介绍了资源管理配置和面向工作负荷的标识符。第 4 章中介绍了将这些标识符与应用程序资源使用相链接的扩展记帐功能。

与 Solaris Zones 交互

资源管理功能可与 Solaris Zones 结合使用来进一步完善应用程序环境。将在本指南的适当章节中介绍这些功能与 Solaris Zones 之间的交互。

何时使用资源管理

使用资源管理可以确保应用程序获得所需的响应时间。

资源管理也可增加资源利用率。通过对使用权分类和划分优先级,可在非高峰期有效使用保留资源,这样通常可避免对额外处理能力的需求。您还可以确保资源不会因负荷的改变而浪费。

服务器整合

资源管理非常适合于在单个服务器上整合多个应用程序的环境。

管理大量计算机所带来的成本和复杂性促使在更大、更具伸缩性的服务器上整合多个应用程序。您可以使用资源管理软件在一个系统上分别运行多个工作负荷,而不是通过对单独系统资源的完全访问权限,在每个单独的系统上运行一个工作负荷。使用资源管理,您可以通过在单个 Solaris 系统上运行和控制多个不同应用程序来降低总体拥有成本。

如果您提供 Internet 和应用程序服务,则可以使用资源管理来执行以下操作:

支持大规模或变动的用户群体

可以在任何拥有大规模、多样化用户基础的系统(例如教育机构)中使用资源管理功能。如果您有多个工作负荷,则可以将软件配置为赋予特定项目优先权。

例如,在大型的经纪公司里,贸易商需要不时地通过快速访问来执行查询或计算。而其他系统用户的工作负荷相对稳定。如果为贸易商的项目分配了较大比例的处理能力,则贸易商就可获得所需的响应能力。

资源管理也非常适用于支持瘦客户机系统。这些平台为无态控制台提供了帧缓冲区和输入设备,例如智能卡。实际的计算在共享服务器上完成,形成了分时型环境。使用资源管理功能可以隔离服务器上的用户。这样,导致过载的用户就不会独占硬件资源并明显影响使用该系统的其他用户。

建立资源管理(任务图)

以下任务图高度概括了在您的系统上建立资源管理的步骤。

任务 

说明 

参考 

识别系统上的工作负荷并按项目对每个工作负荷进行分类。 

/etc/project 文件、NIS 映射或 LDAP 目录服务中创建项目条目。

project 数据库

设置系统上工作负荷的优先级。 

确定哪些是关键的应用程序。这些工作负荷可能需要对资源的优先访问权。 

请参考您的业务服务目标。 

监视系统上的实时活动。 

使用性能工具查看系统上正在运行的工作负荷的当前资源占用。然后评估是否必须限制对给定资源的访问或将特定工作负荷与其他工作负荷隔离开来。 

按系统进行监视cpustat(1M)iostat(1M)mpstat(1M)prstat(1M)sar(1)vmstat(1M) 手册页

对系统上正在运行的工作负荷进行临时修改。 

要确定可以更改哪些值,请参考 Solaris 系统中的可用资源控制。当任务或进程正在运行时,可从命令行更新值。 

可用的资源控制针对资源控制值的全局和本地操作在正在运行的系统上临时更新资源控制值rctladm(1M)prctl(1) 手册页。

project 数据库或命名服务项目数据库中为每个项目条目设置资源控制和项目属性。

/etc/project 文件或命名服务项目数据库中的每个项目条目都可包含一个或多个资源控制或属性。资源控制会约束附加到该项目上的任务和进程。对于为资源控制设置的每个阈值,您都可以关联一个或多个在达到该阈值时采取的操作。

您可以使用命令行界面来设置资源控制,也可以使用 Solaris Management Console 设置某些配置参数。 

project 数据库本地 /etc/project 文件格式可用的资源控制针对资源控制值的全局和本地操作第 8 章

为项目附加的进程集所占用的物理内存资源设置上限。 

资源上限执行守护进程将执行在 /etc/project 文件中为项目的 rcap.max-rss 属性定义的物理内存资源上限。

project 数据库第 10 章

创建资源池配置。 

资源池提供了一种对系统资源(例如处理器)进行分区的途径,并在多次重新引导期间维护这些分区。可以在 /etc/project 文件中为每个条目添加一个 project.pool 属性。

project 数据库第 12 章

将公平份额调度器 (fair share scheduler, FSS) 设置为缺省的系统调度器。 

确保所有用户进程位于一个单独的 CPU 系统中,或者位于属于同一调度类的处理器集中。 

配置 FSSdispadmin(1M) 手册页

激活扩展记帐功能来监视并记录任务或进程的资源占用情况。 

使用扩展记帐数据可以评估当前资源控制并为将来的工作负荷规划容量要求。可以跟踪整个系统的总使用量。要获取多个系统中相关工作负荷的全部使用情况统计信息,可在多台计算机间共享项目名称。 

如何激活进程、任务和流的扩展记帐acctadm(1M) 手册页

(可选)如果需要对配置做其他调整,可继续从命令行更改值。您可以在任务或进程正在运行时更改值。 

对现有任务所做的修改可以立即生效,无需重新启动项目。调节值,直至您对性能满意。然后,更新 /etc/project 文件或命名服务项目数据库中的当前值。

在正在运行的系统上临时更新资源控制值以及 rctladm(1M)prctl(1) 手册页

(可选)捕获扩展记帐数据。 

针对活动的进程和任务编写扩展记帐记录。生成的文件可用于规划、分摊费用和计费。还可以使用 libexacct 的实用摘录和报告语言 (Practical Extraction and Report Language, Perl) 接口,来开发自定义报告和摘录脚本。

wracct(1M) 手册页和libexacct 的 Perl 接口

第 2 章 项目和任务(概述)

本章讨论 Solaris 资源管理的项目任务功能。项目和任务用于标记工作负荷并将它们彼此分离。

本章包含以下主题:

要使用项目和任务功能,请参见第 3 章

Solaris 10 在项目数据库和资源控制命令方面的新增功能

Solaris 10 增强功能包括:

除了本章和第 6 章中包含的信息外,还可以参见以下手册页:

Solaris 10 5/08 增强功能包括为 projmod 命令添加了 -A 选项。请参见用于项目和任务的命令

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

项目和任务功能

要优化工作负荷响应,必须首先能够识别要分析的系统上运行的工作负荷。此信息可能很难通过单独使用纯粹面向进程或面向用户的方法来获取。在 Solaris 系统中,您可以使用两个附加功能来分离和识别工作负荷: 项目和任务。项目为相关工作提供了网络范围内的管理标识符。任务将一组进程聚集成表示工作负荷组件的可管理实体。

project 名称服务数据库中指定的控制针对进程、任务和项目进行了设置。由于进程和任务控制通过 forksettaskid 系统调用继承,因此,所有在项目内创建的进程和任务都可继承这些控制。有关这些系统调用的信息,请参见 fork(2)settaskid(2) 手册页。

根据其项目或任务的成员关系,可以使用标准 Solaris 命令处理正在运行的进程。扩展记帐功能可以报告进程和任务的使用情况,并使用管理项目标识符标记每个记录。通过此进程,可以将脱机工作负荷分析与联机监视相互关联。项目标识符可以通过 project 名称服务数据库在多台计算机之间共享。这样,在(或跨)多台计算机上运行的相关工作负荷的资源占用情况最终可以在所有计算机上分析出来。

项目标识符

项目标识符是指用于标识相关工作的管理标识符。可以将项目标识符视为等同于用户标识符和组标识符的工作负荷标记。一个用户或组可以属于一个或多个项目。这些项目可用于表示允许用户(或用户组)参与的工作负荷。此成员关系然后可以作为费用分摊(例如基于使用情况或初始资源分配等)的基础。尽管必须为用户指定一个缺省项目,但是用户启动的进程可以与用户参与的任何项目关联。

确定用户的缺省项目

要登录到系统,必须为用户指定一个缺省项目。即使用户不在缺省项目中指定的用户或组列表中,此用户仍会自动成为该项目的成员。

由于系统上的每个进程都具有项目成员资格,因此,必须使用一种算法为登录或其他初始进程指定缺省项目。此算法在 getprojent(3C) 手册页中进行了介绍。系统按照顺序步骤确定缺省项目。如果找不到缺省项目,则会拒绝用户的登录或启动进程的请求。

系统按顺序执行以下步骤,以确定用户的缺省项目:

  1. 如果用户具有在 /etc/user_attr 扩展用户属性数据库中定义了 project 属性的某个条目,则 project 属性的值即为缺省项目。请参见 user_attr(4) 手册页。

  2. 如果 project 数据库中存在名为 user.user-id 的项目,则该项目即为缺省项目。有关更多信息,请参见 project(4) 手册页。

  3. 如果 project 数据库中存在名为 group. group-name 的项目,其中 group-name 是在 passwd 文件中指定的用户缺省组的名称,则该项目即为缺省项目。有关 passwd 文件的信息,请参见 passwd(4) 手册页。

  4. 如果 project 数据库中存在特殊的项目 default,则此项目即为缺省项目。

此逻辑由 getdefaultproj() 库函数提供。有关更多信息,请参见 getprojent(3PROJECT) 手册页。

使用 useraddusermodpassmgmt 命令设置用户属性

您可以使用以下带有 -K 选项和 key=value 对的命令在本地文件中设置用户属性:

passmgmt

修改用户信息

useradd

设置用户的缺省项目

usermod

修改用户信息

本地文件可包括以下内容:

如果正在使用某一网络命名服务(如 NIS)为本地文件补充其他条目,则这些命令不能更改该网络命名服务提供的信息。但是,这些命令确实可以根据外部命名服务数据库验证以下内容:

有关更多信息,请参见 passmgmt(1M)useradd(1M)usermod(1M)user_attr(4) 手册页。

project 数据库

您可以将项目数据存储在本地文件、网络信息服务 (Network Information Service, NIS) 项目映射或轻量目录访问协议 (Lightweight Directory Access Protocol, LDAP) 目录服务中。/etc/project 文件或命名服务在登录时使用,由可插拔验证模块 (pluggable authentication module, PAM) 发出的所有帐户管理请求使用它将用户绑定到缺省项目。


注 –

对项目数据库中条目的更新,无论是对 /etc/project 文件还是对网络命名服务中数据库表示形式的更新,都不会应用于当前活动的项目。使用 loginnewtask 命令时,会将更新应用于加入项目的新任务。有关更多信息,请参见 login(1)newtask(1) 手册页。


PAM 子系统

更改或设置身份的操作包括登录到系统、调用 rcprsh 命令,以及使用 ftp 或使用 su。当操作涉及更改或设置身份时,会使用一组可配置的模块来提供验证、帐户管理、证书管理和会话管理。

项目的帐户管理 PAM 模块在 pam_projects(5) 手册页中进行介绍。有关 PAM 的概述,请参见《系统管理指南:安全性服务》中的第 16  章 “使用 PAM”

命名服务配置

资源管理支持命名服务 project 数据库。/etc/nsswitch.conf 文件中定义了 project 数据库的存储位置。缺省情况下,会先列出 files,但是源可以按任意顺序列出。


project: files [nis] [ldap]

如果列出了多个项目信息源,则 nsswitch.conf 文件会指示例程开始在列出的第一个源中搜索信息,然后搜索后续源。

有关 /etc/nsswitch.conf 文件的更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》中的第 2  章 “名称服务转换器(概述)”nsswitch.conf(4)

本地 /etc/project 文件格式

如果在 nsswitch.conf 文件中选择 files 作为 project 数据库源,则登录进程会在 /etc/project 文件中搜索项目信息。有关更多信息,请参见 projects(1)project(4) 手册页。

对于系统识别的每个项目,project 文件均包含以下形式的单行条目:


projname:projid:comment:user-list:group-list:attributes

字段定义如下:

projname

项目的名称。该名称必须是由字母数字字符、下划线 (_) 字符、连字符 (-) 和句点 (.) 组成的字符串。句点是为对操作系统有特殊意义的项目保留的,只能将其用在用户的缺省项目名称中。projname 不能包含冒号 (: ) 或换行符。

projid

系统内项目的唯一数字 ID (PROJID)。projid 字段的最大值为 UID_MAX (2147483647)。

comment

项目的说明。

user-list

允许参与项目的用户的列表(以逗号分隔)。

此字段中可以使用通配符。星号 (*) 允许所有用户参与项目。感叹号后跟星号 (!*) 可将所有用户排除在项目之外。感叹号 (!)后跟用户名可将指定用户排除在项目之外。

group-list

允许参与项目的用户组的列表(以逗号分隔)。

此字段中可以使用通配符。星号 (*) 允许所有组参与项目。感叹号后跟星号 (!*) 可将所有组排除在项目之外。感叹号 (!)后跟组名可将指定组排除在项目之外。

attributes

用分号分隔的名称-值对列表,如资源控制(请参见第 6 章)。name 是指定与对象相关的属性的任意字符串,value 是该属性的可选值。


name[=value]

在名称-值对中,名称仅可包含字母、数字、下划线和句点。句点通常用作资源控制 (rctl) 的类别和子类别之间的分隔符。属性名称的第一个字符必须是字母。名称区分大小写。

可以在值中使用逗号和括号结构以便确立优先级。

分号用于分隔名称-值对。不能在值定义中使用分号。冒号用于分隔项目字段。不能在值定义中使用冒号。


注 –

如果读取此文件的例程遇到格式错误的条目,则这些例程会停止。不会分配错误条目后指定的任何项目。


以下示例显示了缺省的 /etc/project 文件:


system:0:System:::
user.root:1:Super-User:::
noproject:2:No Project:::
default:3::::
group.staff:10::::

以下示例显示了在结尾添加了项目条目的缺省的 /etc/project 文件:


system:0:System:::
user.root:1:Super-User:::
noproject:2:No Project:::
default:3::::
group.staff:10::::
user.ml:2424:Lyle Personal:::
booksite:4113:Book Auction Project:ml,mp,jtd,kjh::

您还可以将资源控制和属性添加到 /etc/project 文件:

NIS 的项目配置

如果正在使用 NIS,则可以在 /etc/nsswitch.conf 文件中进行指定,以便在 NIS 项目映射中搜索项目:


project: nis files 

NIS 映射(project.bynameproject.bynumber)与 /etc/project 文件具有相同的形式:


projname:projid:comment:user-list:group-list:attributes

有关更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》中的第 4  章 “网络信息服务 (Network Information Service, NIS)(概述)”

LDAP 的项目配置

如果正在使用 LDAP,则可以在 /etc/nsswitch.conf 文件中进行指定,以便在 LDAP project 数据库中搜索项目:


project: ldap files

有关 LDAP 的更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》中的第 8  章 “LDAP 名称服务介绍(概述/参考)”。有关 LDAP 数据库中项目条目结构的更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》中的“Solaris 架构”

任务标识符

每次成功登录到项目时,都会创建一个包含登录进程的新任务。任务是指表示一段时间内一组工作的进程集。任务也可以视为工作负荷组件。会为每个任务自动指定一个任务 ID。

每个进程都是一个任务的成员,而每个任务都与一个项目关联。

图 2–1 项目和任务树

图中显示项目下有三个任务,而每个任务下有两到四个进程。

任务还支持对进程组执行的所有操作,如信号传送。您还可以将任务绑定到处理器集,并为任务设置调度优先级和类,优先级和类会修改任务中的所有当前进程以及后续进程。

每次加入项目时,就会创建任务。以下操作、命令和函数可创建任务:

您可以使用以下方法之一创建最终任务。所有进一步创建新任务的尝试都将失败。

有关更多信息,请参见 login(1)newtask(1)cron(1M)su(1M)setproject(3PROJECT) 手册页。

扩展记帐功能可以为进程提供记帐数据。此数据在任务级别聚合。

用于项目和任务的命令

下表中所示的命令提供了项目和任务功能的主要管理接口。

手册页参考 

说明 

projects(1)

显示用户的项目成员关系。列出 project 数据库中的项目。列显指定项目的信息。如果未提供项目名称,则显示所有项目的信息。使用带有 -l 选项的 projects 命令可列显详细输出。

newtask(1)

执行用户的缺省 shell 或指定命令,将执行命令放在指定项目拥有的新任务中。newtask 还可以用于为正在运行的进程更改任务和项目绑定。与 -F 选项一起使用,以创建最终任务。

passmgmt(1M)

更新口令文件中的信息。与 -K key=value 选项一起使用,可在本地文件中添加或替换用户属性。

projadd(1M)

将新项目条目添加到 /etc/project 文件。projadd 命令仅在本地系统上创建项目条目。projadd 不能更改网络命名服务提供的信息。

可用于编辑除缺省文件 /etc/project 之外的项目文件。为 project 文件提供语法检查。验证和编辑项目属性。支持标度值。

projmod(1M)

在本地系统上修改项目信息。projmod 不能更改网络命名服务提供的信息。但是,此命令确实可以根据外部命名服务验证项目名称和项目 ID 的唯一性。

可用于编辑除缺省文件 /etc/project 之外的项目文件。为 project 文件提供语法检查。验证和编辑项目属性。可用于添加新属性,向属性添加值或者删除属性。支持标度值。

从 Solaris 10 5/08 发行版开始,可与 -A 选项一起使用,以便将在项目数据库中找到的资源控制值应用到活动项目。与 project 文件中定义的值不匹配的现有值(例如通过 prctl 命令手动设置的值)都会被删除。

projdel(1M)

从本地系统中删除项目。projdel 不能更改网络命名服务提供的信息。

useradd(1M)

向本地文件添加缺省项目定义。与 -K key=value 选项一起使用,可添加或替换用户属性。

userdel(1M)

删除本地文件中的用户帐户。 

usermod(1M)

修改系统上的用户登录信息。与 -K key=value 选项一起使用,可添加或替换用户属性。

第 3 章 管理项目和任务

本章介绍如何使用 Solaris 资源管理中的项目和任务功能。

本章包含以下主题:

有关项目和任务功能的概述,请参见第 2 章


注 –

如果在安装了区域的 Solaris 系统上使用这些功能,则当这些功能命令在非全局区域 (non-global zone) 中运行时,只有同一区域中的进程才能通过使用进程 ID 的系统调用界面进行查看。


管理项目和任务(任务图)

任务 

说明 

参考 

查看用于项目与任务的命令和选项的示例。 

显示任务和项目 ID,显示系统上当前所运行进程和项目的各种统计信息。 

命令和命令选项示例

定义项目。 

/etc/project 文件中添加项目条目并修改此条目的值。

如何定义项目和查看当前项目

删除项目。 

/etc/project 文件中删除项目条目。

如何从 /etc/project 文件中删除项目

验证 project 文件或项目数据库。

检查 /etc/project 文件的语法或根据外部命名服务验证项目名称和项目 ID 的唯一性。

如何验证 /etc/project 文件的内容

获取项目成员身份信息。 

显示发出调用的进程的当前项目成员身份。 

如何获取项目成员身份信息

创建新任务。 

使用 newtask 命令在特定项目中创建一项新任务。

如何创建新任务

将正在运行的进程与不同的任务和项目进行关联。 

将进程号与特定项目中的新任务 ID 进行关联。 

如何将正在运行的进程移至新任务

添加并使用项目属性。 

使用项目数据库管理命令添加、编辑、验证和删除项目属性。 

编辑和验证项目属性

命令和命令选项示例

本节提供用于项目与任务的命令和选项的示例。

用于项目和任务的命令选项

ps 命令

使用带有 -o 选项的 ps 命令可显示任务和项目 ID。例如,要查看项目 ID,请键入以下内容:


# ps -o user,pid,uid,projid
USER PID   UID  PROJID
jtd  89430 124  4113

id 命令

使用带有 -p 选项的 id 命令可列显当前的项目 ID,以及用户和组 ID。如果提供了 user 操作数,则还会列显与该用户的正常登录相关联的项目:


#  id -p
uid=124(jtd) gid=10(staff) projid=4113(booksite)

pgreppkill 命令

要仅将进程与特定列表中的项目 ID 进行匹配,请使用带有 -J 选项的 pgreppkill 命令:


# pgrep -J projidlist
# pkill -J projidlist

要仅将进程与特定列表中的任务 ID 进行匹配,请使用带有 -T 选项的 pgreppkill 命令:


# pgrep -T taskidlist
# pkill -T taskidlist

prstat 命令

要显示系统上当前运行的进程和项目的各种统计信息,请使用带有 -J 选项的 prstat 命令:


% prstat -J
	  PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
 21634 jtd      5512K 4848K cpu0    44    0   0:00.00 0.3% prstat/1
   324 root       29M   75M sleep   59    0   0:08.27 0.2% Xsun/1
 15497 jtd        48M   41M sleep   49    0   0:08.26 0.1% adeptedit/1
   328 root     2856K 2600K sleep   58    0   0:00.00 0.0% mibiisa/11
  1979 jtd      1568K 1352K sleep   49    0   0:00.00 0.0% csh/1
  1977 jtd      7256K 5512K sleep   49    0   0:00.00 0.0% dtterm/1
   192 root     3680K 2856K sleep   58    0   0:00.36 0.0% automountd/5
  1845 jtd        24M   22M sleep   49    0   0:00.29 0.0% dtmail/11
  1009 jtd      9864K 8384K sleep   49    0   0:00.59 0.0% dtwm/8
   114 root     1640K  704K sleep   58    0   0:01.16 0.0% in.routed/1
   180 daemon   2704K 1944K sleep   58    0   0:00.00 0.0% statd/4
   145 root     2120K 1520K sleep   58    0   0:00.00 0.0% ypbind/1
   181 root     1864K 1336K sleep   51    0   0:00.00 0.0% lockd/1
   173 root     2584K 2136K sleep   58    0   0:00.00 0.0% inetd/1
   135 root     2960K 1424K sleep    0    0   0:00.00 0.0% keyserv/4
PROJID    NPROC  SIZE   RSS MEMORY      TIME  CPU PROJECT
    10       52  400M  271M    68%   0:11.45 0.4% booksite
     0       35  113M  129M    32%   0:10.46 0.2% system

Total: 87 processes, 205 lwps, load averages: 0.05, 0.02, 0.02

要显示系统上当前运行的进程和任务的各种统计信息,请使用带有 -T 选项的 prstat 命令:


% prstat -T
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
 23023 root       26M   20M sleep   59    0   0:03:18 0.6% Xsun/1
 23476 jtd        51M   45M sleep   49    0   0:04:31 0.5% adeptedit/1
 23432 jtd      6928K 5064K sleep   59    0   0:00:00 0.1% dtterm/1
 28959 jtd        26M   18M sleep   49    0   0:00:18 0.0% .netscape.bin/1
 23116 jtd      9232K 8104K sleep   59    0   0:00:27 0.0% dtwm/5
 29010 jtd      5144K 4664K cpu0    59    0   0:00:00 0.0% prstat/1
   200 root     3096K 1024K sleep   59    0   0:00:00 0.0% lpsched/1
   161 root     2120K 1600K sleep   59    0   0:00:00 0.0% lockd/2
   170 root     5888K 4248K sleep   59    0   0:03:10 0.0% automountd/3
   132 root     2120K 1408K sleep   59    0   0:00:00 0.0% ypbind/1
   162 daemon   2504K 1936K sleep   59    0   0:00:00 0.0% statd/2
   146 root     2560K 2008K sleep   59    0   0:00:00 0.0% inetd/1
   122 root     2336K 1264K sleep   59    0   0:00:00 0.0% keyserv/2
   119 root     2336K 1496K sleep   59    0   0:00:02 0.0% rpcbind/1
   104 root     1664K  672K sleep   59    0   0:00:03 0.0% in.rdisc/1
TASKID    NPROC  SIZE   RSS MEMORY      TIME  CPU PROJECT                     
   222       30  229M  161M    44%   0:05:54 0.6% group.staff                 
   223        1   26M   20M   5.3%   0:03:18 0.6% group.staff                 
    12        1   61M   33M   8.9%   0:00:31 0.0% group.staff                 
     1       33   85M   53M    14%   0:03:33 0.0% system                      

Total: 65 processes, 154 lwps, load averages: 0.04, 0.05, 0.06	

注 –

-J-T 选项不能一起使用。


cronsu 用于项目和任务

cron 命令

cron 命令将发出 settaskid,以确保每个 cronatbatch 作业都是在单独的任务中执行,并对提交用户使用了适当的缺省项目。atbatch 命令也会捕获当前项目 ID,以确保在运行 at 作业时恢复项目 ID。

su 命令

作为模拟登录的一部分,su 命令将通过创建新任务加入目标用户的缺省项目。

要使用 su 命令切换用户的缺省项目,请键入以下内容:


# su user

管理项目

Procedure如何定义项目和查看当前项目

此示例说明如何使用 projadd 命令添加项目条目,以及如何使用 projmod 命令修改此条目。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用 projects -l 查看系统上缺省的 /etc/project 文件。


    # projects -l
    system:0::::
    user.root:1::::
    noproject:2::::
    default:3::::
    group.staff:10::::system
            projid : 0
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    user.root
            projid : 1
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    noproject
            projid : 2
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    default
            projid : 3
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    group.staff
            projid : 10
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
  3. 添加名为 booksite 的项目。将该项目指定给名为 mark 的用户,同时指定项目 ID 号 4113


    # projadd -U mark -p 4113 booksite
    
  4. 再次查看 /etc/project 文件。


    # projects -l
    system
            projid : 0
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    user.root
            projid : 1
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    noproject
            projid : 2
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    default
            projid : 3
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    group.staff
            projid : 10
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    booksite
            projid : 4113
            comment: ""
            users  : mark
            groups : (none)
            attribs: 
  5. 在注释字段中添加描述项目的注释。


    # projmod -c `Book Auction Project' booksite
    
  6. 查看 /etc/project 文件中的更改。


    # projects -l
    system
            projid : 0
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    user.root
            projid : 1
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    noproject
            projid : 2
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    default
            projid : 3
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    group.staff
            projid : 10
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    booksite
            projid : 4113
            comment: "Book Auction Project"
            users  : mark
            groups : (none)
            attribs: 
另请参见

要将项目、任务和进程绑定到池,请参见设置池属性并绑定到池

Procedure如何从 /etc/project 文件中删除项目

此示例显示如何使用 projdel 命令删除项目。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用 projdel 命令删除 booksite 项目。


    # projdel booksite
    
  3. 显示 /etc/project 文件。


    # projects -l
    system
            projid : 0
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    user.root
            projid : 1
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    noproject
            projid : 2
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    default
            projid : 3
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
    group.staff
            projid : 10
            comment: ""
            users  : (none)
            groups : (none)
            attribs: 
  4. 以用户 mark 的身份登录并键入 projects 来查看指定给此用户的项目。


    # su - mark
    # projects
    default

如何验证 /etc/project 文件的内容

如果没有给出编辑选项,projmod 命令便会验证 project 文件的内容。

要验证 NIS 映射,请以超级用户的身份登录,并键入以下内容:


# ypcat project | projmod -f —

注 –

ypcat project | projmod -f — 命令尚未实现。


要检查 /etc/project 文件的语法,请键入以下内容:


# projmod -n

如何获取项目成员身份信息

使用带有 -p 标志的 id 命令显示发出调用的进程的当前项目成员身份。


$ id -p
uid=100(mark) gid=1(other) projid=3(default)

Procedure如何创建新任务

  1. 以目标项目 booksite 的成员身份登录。

  2. 使用带有 -v(详细)选项的 newtask 命令在 booksite 项目中创建新任务,以获取系统任务 ID。


    machine% newtask -v -p booksite
    16

    通过执行 newtask,可以在指定项目中创建新任务并将用户的缺省 shell 置于此任务中。

  3. 查看发出调用的进程的当前项目成员身份。


    machine% id -p
    uid=100(mark) gid=1(other) projid=4113(booksite)

    现在该进程成为新项目的成员。

Procedure如何将正在运行的进程移至新任务

此示例显示如何将正在运行的进程与不同的任务和新项目进行关联。要执行此操作,您必须是超级用户,或者是进程属主并且是新项目的成员。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”


    注 –

    如果您是进程属主或新项目成员,则可以跳过此步骤。


  2. 获取 book_catalog 进程的进程 ID。


    # pgrep book_catalog
    	8100
  3. 将进程 8100booksite 项目中的新任务 ID 进行关联。


    # newtask -v -p booksite -c 8100
    	17

    -c 选项指定 newtask 作用于现有的命名进程。

  4. 确认任务到进程 ID 的映射。


    # pgrep -T 17
    	8100

编辑和验证项目属性

您可以使用 projaddprojmod 项目数据库管理命令来编辑项目属性。

-K 选项指定属性替换列表。属性由分号 (;) 进行分隔。如果将 -K 选项和 -a 选项一起使用,则会添加属性或属性值。如果将 -K 选项和 -r 选项一起使用,则会删除属性或属性值。如果将 -K 选项与 -s 选项一起使用,则会替换属性或属性值。

Procedure如何将属性和属性值添加到项目

可以使用带有 -a-K 选项的 projmod 命令将值添加到项目属性中。如果属性不存在,则会创建一个。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 在项目 myproject 中添加无属性值的资源控制属性 task.max-lwps。加入项目的任务只有系统属性值。


    # projmod -a -K task.max-lwps myproject
    
  3. 然后可以为 myproject 项目中的 task.max-lwps 添加值。此值包含权限级别、阈值以及与达到阈值关联的操作。


    # projmod -a -K "task.max-lwps=(priv,100,deny)" myproject
    
  4. 由于资源控制属性可以具有多个值,因此可以使用同一个选项将其他值添加到现有的值列表中。


    # projmod -a -K "task.max-lwps=(priv,1000,signal=KILL)" myproject
    

    用逗号分隔多个值。现在 task.max-lwps 条目应为:


    task.max-lwps=(priv,100,deny),(priv,1000,signal=KILL)

Procedure如何从项目中删除属性值

此过程假设具有以下值:


task.max-lwps=(priv,100,deny),(priv,1000,signal=KILL)
  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 要删除 myproject 项目中 task.max-lwps 资源控制的属性值,请使用带有 -r-K 选项的 projmod 命令。


    # projmod -r -K "task.max-lwps=(priv,100,deny)" myproject
    

    如果 task.max-lwps 具有多个值,例如:


    task.max-lwps=(priv,100,deny),(priv,1000,signal=KILL)

    则会删除第一个匹配的值。结果将为:


    task.max-lwps=(priv,1000,signal=KILL)

Procedure如何从项目中删除资源控制属性

要删除 myproject 项目中的 task.max-lwps 资源控制属性,请使用带有 -r-K 选项的 projmod 命令。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 从项目 myproject 中删除属性 task.max-lwps 及其所有值:


    # projmod -r -K task.max-lwps myproject
    

Procedure如何替换项目的属性和属性值

要替换项目 myproject 中属性 task.max-lwps 的值,请使用带有 -s-K 选项的 projmod 命令。如果属性不存在,则会创建一个。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用所示的新值替换当前的 task.max-lwps 值:


    # projmod -s -K "task.max-lwps=(priv,100,none),(priv,120,deny)" myproject
    

    结果为:


    task.max-lwps=(priv,100,none),(priv,120,deny)

Procedure如何删除资源控制属性的现有值

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 要从项目 myproject 中删除 task.max-lwps 的当前值,请键入:


    # projmod -s -K task.max-lwps myproject
    

第 4 章 扩展记帐(概述)

通过使用第 2 章中介绍的项目和任务功能对工作负荷进行标记和分隔,可以监视每个工作负荷的资源占用情况。您可以使用扩展记帐子系统捕获一组有关进程和任务的详细资源占用情况的统计信息。

本章包含以下主题:

要开始使用扩展记帐,请跳至如何激活进程、任务和流的扩展记帐

Solaris 10 在扩展记帐方面的新增功能

现在可以生成进程记帐的 mstate 数据。请参见如何查看可用的记帐资源

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

扩展记帐介绍

扩展记帐子系统记录执行工作的项目的资源使用情况。您还可以将扩展记帐与《系统管理指南:IP 服务》中的第 36  章 “使用流记帐和统计信息收集功能(任务)”中所介绍的 Internet 协议服务质量 (Internet Protocol Quality of Service, IPQoS) 流记帐模块结合使用,以捕获系统上的网络流信息。

在应用资源管理机制之前,必须首先能够识别各种工作负荷对系统的资源占用需求。Solaris 操作系统中的扩展记帐功能提供了一种灵活方法,可按任务或进程或者按 IPQoS flowacct 模块提供的选定器来记录系统和网络资源占用情况。有关更多信息,请参见 ipqos(7IPP)。

与可实时度量系统使用情况的联机监视工具不同,通过扩展记帐,可检查历史使用情况。然后,可以对将来工作负荷的容量要求进行评估。

有了扩展记帐数据,便可以开发或购买用于资源费用分摊、工作负荷监视或容量规划的软件。

扩展记帐的工作原理

Solaris 操作系统中的扩展记帐功能使用一种版本化的可扩展文件格式来包含记帐数据。使用附带的库 libexacct(请参见 libexacct(3LIB))中提供的 API,可以访问或创建采用此数据格式的文件。然后,可以在启用了扩展记帐的任何平台上分析这些文件,并且可以使用其数据进行容量规划和费用分摊。

如果扩展记帐处于活动状态,则会收集可由 libexacct API 检查的统计信息。使用 libexacct 可以向前或向后检查 exacct 文件。API 支持由 libexacct 生成的第三方文件以及由内核创建的文件。使用 libexacct 的实用摘录和报告语言 (Practical Extraction and Report Language, Perl) 接口,可以开发自定义报告和摘录脚本。请参见libexacct 的 Perl 接口

例如,如果启用了扩展记帐,则任务会跟踪其成员进程的总体资源使用情况。任务完成时会编写任务记帐记录,还会编写有关正在运行的进程和任务的临时记录。有关任务的更多信息,请参见第 2 章

图 4–1 在激活了扩展记帐情况下的任务跟踪

流程图显示了如何将任务进程的总体资源使用情况捕获到任务完成时编写的记录中。

可扩展的格式

扩展记帐格式实际上比 SunOS 传统系统记帐软件格式(请参见《系统管理指南:高级管理》中的“什么是系统记帐?”)更具可扩展性。扩展记帐允许在不同发行版的系统中添加和删除记帐度量标准,即使在系统操作过程中也是如此。


注 –

系统上的扩展记帐软件和传统系统记帐软件可以同时处于活动状态。


exacct 记录和格式

用于创建 exacct 记录的例程具有两个用途。

此格式允许捕获不同形式的记帐记录,而不要求每次更改都是显式的版本更改。使用记帐数据且编写准确的应用程序必须忽略它们不了解的记录。

libexacct 库可转换和生成格式为 exacct 的文件。此库是 exacct 格式文件支持的唯一接口。


注 –

getacctputacct wracct 系统调用不适用于流。配置 IPQoS 流记帐之后,内核便会创建流记录并将其写入文件。


在安装了区域的 Solaris 系统上使用扩展记帐

当扩展记帐子系统在全局区域中运行时,它会收集和报告整个系统(包括非全局区域)的信息。全局管理员还可以确定每个区域的资源占用情况。有关更多信息,请参见安装了区域的 Solaris 系统上的扩展记帐

扩展记帐配置

/etc/acctadm.conf 文件中包含当前的扩展记帐配置。此文件通过 acctadm 接口而不是用户进行编辑。

目录 /var/adm/exacct 是放置扩展记帐数据的标准位置。您可以使用 acctadm 命令为进程和任务记帐数据文件指定其他位置。有关更多信息,请参见 acctadm(1M)

用于扩展记帐的命令

命令参考 

说明 

acctadm(1M)

修改扩展记帐功能的各种属性,停止和启动扩展记帐,并用于针对进程、任务和流选择要跟踪的记帐属性。 

wracct(1M)

针对活动的进程和任务编写扩展记帐记录。 

lastcomm(1)

显示以前调用的命令。lastcomm 既可以使用标准记帐进程数据,又可以使用扩展记帐进程数据。

有关与任务和项目相关联的命令的信息,请参见命令和命令选项示例。有关 IPQoS 流记帐的信息,请参见 ipqosconf(1M)

libexacct 的 Perl 接口

通过 Perl 接口可以创建 Perl 脚本,该脚本可读取由 exacct 框架生成的记帐文件。您还可以创建编写 exacct 文件的 Perl 脚本。

此接口与基础 C API 在功能上是等效的。如果可能,通过基础 C API 获取的数据将显示为 Perl 数据类型。使用此功能,可以更轻松地访问数据,并且无需进行缓冲区压缩和解压缩操作。此外,所有内存管理均由 Perl 库执行。

各种与项目、任务和 exacct 相关的功能可分为多个组。每个功能组都位于单独的 Perl 模块中。每个模块都以 Sun 标准的 Sun::Solaris:: Perl 软件包前缀开头。Perl exacct 库提供的所有类均位于 Sun::Solaris::Exacct 模块中。

基础 libexacct(3LIB) 库提供针对 exacct 格式文件、目录标记和 exacct 对象的操作。exacct 对象分为两种类型:

下表概述了每个模块。

模块(不应包含空格) 

说明 

更多信息 

Sun::Solaris::Project

此模块提供了访问项目操作函数 getprojid(2)endprojent(3PROJECT)fgetprojent(3PROJECT)getdefaultproj(3PROJECT)getprojbyid(3PROJECT)getprojbyname(3PROJECT)getprojent(3PROJECT)getprojidbyname(3PROJECT)inproj(3PROJECT)project_walk(3PROJECT)setproject(3PROJECT)setprojent(3PROJECT) 的函数。

Project(3PERL)

Sun::Solaris::Task

此模块提供了访问任务操作函数 gettaskid(2)settaskid(2) 的功能。

Task(3PERL)

Sun::Solaris::Exacct

此模块是顶层 exacct 模块。此模块提供了访问与 exacct 相关的系统调用 getacct(2)putacct(2)wracct(2) 的功能。此模块还提供了访问 libexacct(3LIB) 库函数 ea_error(3EXACCT) 的功能。此模块同时也提供了所有 exacct EO_*、EW_*、EXR_*、P_* 和 TASK_* 宏的常量。

Exacct(3PERL)

Sun::Solaris::Exacct:: Catalog

此模块提供了面向对象的方法,以访问 exacct 目录标记中的位字段。此模块还提供了访问 EXC_*、EXD_* 和 EXD_* 宏常量的权限。

Exacct::Catalog(3PERL)

Sun::Solaris::Exacct:: File

此模块提供了面向对象的方法,以访问 libexacct 记帐文件函数 ea_open(3EXACCT)ea_close(3EXACCT)ea_get_creator(3EXACCT)ea_get_hostname(3EXACCT)ea_next_object(3EXACCT)ea_previous_object(3EXACCT)ea_write_object(3EXACCT)

Exacct::File(3PERL)

Sun::Solaris::Exacct:: Object

此模块提供了面向对象的方法,以访问单个 exacct 记帐文件对象。exacct 对象表示为被指定隶属于相应 Sun::Solaris::Exacct::Object 子类的不透明参考。此模块分为项和组两种对象类型。在此级别上提供了访问 ea_match_object_catalog(3EXACCT)ea_attach_to_object(3EXACCT) 函数的方法。

Exacct::Object(3PERL)

Sun::Solaris::Exacct:: Object::Item

此模块提供了面向对象的方法,以访问单个 exacct 记帐文件项。此类型的对象从 Sun::Solaris::Exacct::Object 中继承。

Exacct::Object::Item(3PERL)

Sun::Solaris::Exacct:: Object::Group

此模块提供了面向对象的方法,以访问单个 exacct 记帐文件组。此类型的对象从 Sun::Solaris::Exacct::Object 中继承。这些对象提供了对 ea_attach_to_group(3EXACCT) 函数的访问。组中包含的各项表示为 Perl 数组。

Exacct::Object::Group(3PERL)

Sun::Solaris::Kstat

此模块提供了 kstat 功能的与 Perl 关联的散列接口。/bin/kstat 提供了此模块的使用示例,此示例采用 Perl 编写。

Kstat(3PERL)

有关说明如何使用上表中介绍的模块的示例,请参见使用 libexacct 的 Perl 接口

第 5 章 管理扩展记帐(任务)

本章介绍如何管理扩展记帐子系统。

有关扩展记帐子系统的概述,请参见第 4 章

管理扩展记帐功能(任务图)

任务 

说明 

参考 

激活扩展记帐功能。 

使用扩展记帐监视系统上运行的每个项目的资源消耗情况。可以使用扩展记帐子系统捕获任务、进程和流的历史数据。

如何激活进程、任务和流的扩展记帐如何使用启动脚本激活扩展记帐

显示扩展记帐状态。 

确定扩展记帐功能的状态。 

如何显示扩展记帐状态

查看可用的记帐资源。 

查看系统上的可用记帐资源。 

如何查看可用的记帐资源

取消激活进程、任务和流的记帐功能。 

禁用扩展记帐功能。 

如何取消激活进程记帐、任务记帐和流记帐

将 Perl 接口用于扩展记帐功能。 

使用 Perl 接口开发自定义报告脚本和提取脚本。 

使用 libexacct 的 Perl 接口

使用扩展记帐功能

如果用户拥有要管理的扩展记帐类型的相应权限配置文件,则可以管理扩展记帐(启动记帐、停止记帐和更改记帐配置参数):

Procedure如何激活进程、任务和流的扩展记帐

要激活任务、进程和流的扩展记帐功能,请使用 acctadm 命令。acctadm 的可选最终参数表示此命令是应该针对扩展记帐功能的进程记帐组件、系统任务记帐组件还是流记帐组件执行。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 激活进程的扩展记帐。


    # acctadm -e extended -f /var/adm/exacct/proc process
    
  3. 激活任务的扩展记帐。


    # acctadm -e extended,mstate -f /var/adm/exacct/task task
    
  4. 激活流的扩展记帐。


    # acctadm -e extended -f /var/adm/exacct/flow flow
    
另请参见

有关更多信息,请参见 acctadm(1M)

如何使用启动脚本激活扩展记帐

通过将 /etc/init.d/acctadm 脚本链接到 /etc/rc2.d,可以在运行时激活扩展记帐。


# ln -s /etc/init.d/acctadm /etc/rc2.d/Snacctadm
# ln -s /etc/init.d/acctadm /etc/rc2.d/Knacctadm

n 变量以数字替换。

必须至少手动激活一次扩展记帐以设置配置。

有关记帐配置的信息,请参见扩展记帐配置

如何显示扩展记帐状态

键入不带参数的 acctadm 可以显示扩展记帐功能的当前状态。


# acctadm
                 Task accounting: active
            Task accounting file: /var/adm/exacct/task
          Tracked task resources: extended
        Untracked task resources: none
              Process accounting: active
         Process accounting file: /var/adm/exacct/proc
       Tracked process resources: extended
     Untracked process resources: host
                 Flow accounting: active
            Flow accounting file: /var/adm/exacct/flow
          Tracked flow resources: extended
        Untracked flow resources: none

在前一示例中,系统任务记帐在扩展模式和 mstate 模式下激活。进程记帐和流记帐在扩展模式下激活。


注 –

在扩展记帐的上下文中,微状态 (mstate) 是指与微状态进程转换关联的扩展数据,可从进程使用情况文件(请参见 proc(4))中获取此数据。与基本记录或扩展记录相比,此数据可提供有关进程活动的更多详细信息。


如何查看可用的记帐资源

可用的资源随系统和平台的不同而有所不同。使用带有 -r 选项的 acctadm 命令可以查看系统上的可用记帐资源组。


# acctadm -r
process:
extended pid,uid,gid,cpu,time,command,tty,projid,taskid,ancpid,wait-status,zone,flag,
memory,mstatedisplays as one line
basic    pid,uid,gid,cpu,time,command,tty,flag
task:
extended taskid,projid,cpu,time,host,mstate,anctaskid,zone
basic    taskid,projid,cpu,time
flow:
extended 
saddr,daddr,sport,dport,proto,dsfield,nbytes,npkts,action,ctime,lseen,projid,uid
basic    saddr,daddr,sport,dport,proto,nbytes,npkts,action

Procedure如何取消激活进程记帐、任务记帐和流记帐

要取消激活进程记帐、任务记帐和流记帐,请使用带有 -x 选项的 acctadm 命令分别禁用每个记帐。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 禁用进程记帐。


    # acctadm -x process 
    
  3. 禁用任务记帐。


    # acctadm -x task
    
  4. 禁用流记帐。


    # acctadm -x flow
    
  5. 检验是否已禁用任务记帐、进程记帐和流记帐。


    	# acctadm
                Task accounting: inactive
           Task accounting file: none
         Tracked task resources: extended
       Untracked task resources: none
             Process accounting: inactive
        Process accounting file: none
      Tracked process resources: extended
    Untracked process resources: host
                Flow accounting: inactive
           Flow accounting file: none
         Tracked flow resources: extended
       Untracked flow resources: none

使用 libexacct 的 Perl 接口

如何递归列显 exacct 对象的内容

使用以下代码可以递归列显 exacct 对象的内容。请注意,此功能作为 Sun::Solaris::Exacct::Object::dump() 函数由库提供。此功能还可以通过 ea_dump_object() 公用函数提供。


sub dump_object
     {
             my ($obj, $indent) = @_;
             my $istr = '  ' x $indent;

             #
             # Retrieve the catalog tag.  Because we are 
             # doing this in an array context, the
             # catalog tag will be returned as a (type, catalog, id) 
             # triplet, where each member of the triplet will behave as 
             # an integer or a string, depending on context.
             # If instead this next line provided a scalar context, e.g.
             #    my $cat  = $obj->catalog()->value();
             # then $cat would be set to the integer value of the 
             # catalog tag.
             #
             my @cat = $obj->catalog()->value();

             #
             # If the object is a plain item
             #
             if ($obj->type() == &EO_ITEM) {
                     #
                     # Note: The '%s' formats provide s string context, so
                     # the components of the catalog tag will be displayed
                     # as the symbolic values. If we changed the '%s'
                     # formats to '%d', the numeric value of the components
                     # would be displayed.
                     #
                     printf("%sITEM\n%s  Catalog = %s|%s|%s\n", 
                        $istr, $istr, @cat);
                     $indent++;

                     #
                     # Retrieve the value of the item.  If the item contains
                     # in turn a nested exacct object (i.e., an item or
                     # group),then the value method will return a reference
                     # to the appropriate sort of perl object
                     # (Exacct::Object::Item or Exacct::Object::Group).
                     # We could of course figure out that the item contained
                     # a nested item orgroup by examining the catalog tag in
                     # @cat and looking for a type of EXT_EXACCT_OBJECT or
                     # EXT_GROUP.
                     #
                     my $val = $obj->value();
                     if (ref($val)) {
                             # If it is a nested object, recurse to dump it.
                             dump_object($val, $indent);
                     } else {
                             # Otherwise it is just a 'plain' value, so
                             # display it.
                             printf("%s  Value = %s\n", $istr, $val);
                     }

             #
             # Otherwise we know we are dealing with a group.  Groups
             # represent contents as a perl list or array (depending on
             # context), so we can process the contents of the group
             # with a 'foreach' loop, which provides a list context.
             # In a list context the value method returns the content
             # of the group as a perl list, which is the quickest
             # mechanism, but doesn't allow the group to be modified.
             # If we wanted to modify the contents of the group we could
             # do so like this:
             #    my $grp = $obj->value();   # Returns an array reference
             #    $grp->[0] = $newitem;
             # but accessing the group elements this way is much slower.
             #
             } else {
                     printf("%sGROUP\n%s  Catalog = %s|%s|%s\n",
                         $istr, $istr, @cat);
                     $indent++;
                     # 'foreach' provides a list context.
                     foreach my $val ($obj->value()) {
                             dump_object($val, $indent);
                     }
                     printf("%sENDGROUP\n", $istr);
             }
     }

如何创建新的组记录并将其写入文件

使用以下脚本可以创建新的组记录并将其写入名为 /tmp/exacct 的文件。


#!/usr/bin/perl

use strict;
use warnings;
use Sun::Solaris::Exacct qw(:EXACCT_ALL);
# Prototype list of catalog tags and values.
     my @items = (
             [ &EXT_STRING | &EXC_DEFAULT | &EXD_CREATOR      => "me"       ],
             [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_PID     => $$         ],
             [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_UID     => $<         ],
             [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_GID     => $(         ],
             [ &EXT_STRING | &EXC_DEFAULT | &EXD_PROC_COMMAND => "/bin/rec" ],
     );

     # Create a new group catalog object.
     my $cat = ea_new_catalog(&EXT_GROUP | &EXC_DEFAULT | &EXD_NONE)

     # Create a new Group object and retrieve its data array.
     my $group = ea_new_group($cat);
     my $ary = $group->value();

     # Push the new Items onto the Group array.
     foreach my $v (@items) {
             push(@$ary, ea_new_item(ea_new_catalog($v->[0]), $v->[1]));
     }

     # Open the exacct file, write the record & close.
     my $f = ea_new_file('/tmp/exacct', &O_RDWR | &O_CREAT | &O_TRUNC)
        || die("create /tmp/exacct failed: ", ea_error_str(), "\n");
     $f->write($group);
     $f = undef;

如何列显 exacct 文件的内容

使用以下 Perl 脚本可以列显 exacct 文件的内容。


#!/usr/bin/perl

     use strict;
     use warnings;
     use Sun::Solaris::Exacct qw(:EXACCT_ALL);

     die("Usage is dumpexacct <exacct file>\n") unless (@ARGV == 1);

     # Open the exact file and display the header information.
     my $ef = ea_new_file($ARGV[0], &O_RDONLY) || die(error_str());
     printf("Creator:  %s\n", $ef->creator());
     printf("Hostname: %s\n\n", $ef->hostname());

     # Dump the file contents
     while (my $obj = $ef->get()) {
             ea_dump_object($obj);
     }

     # Report any errors
     if (ea_error() != EXR_OK && ea_error() != EXR_EOF)  {
             printf("\nERROR: %s\n", ea_error_str());
             exit(1);
     }
     exit(0);

Sun::Solaris::Exacct::Object->dump() 的输出示例

以下是对在如何创建新的组记录并将其写入文件中创建的文件运行 Sun::Solaris::Exacct::Object->dump() 时生成的输出示例。


Creator:  root
Hostname: localhost
GROUP
       Catalog = EXT_GROUP|EXC_DEFAULT|EXD_NONE
       ITEM
         Catalog = EXT_STRING|EXC_DEFAULT|EXD_CREATOR
         Value = me
       ITEM
         Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_PID
         Value = 845523
       ITEM
         Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_UID
         Value = 37845
       ITEM
         Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_GID
         Value = 10
       ITEM
         Catalog = EXT_STRING|EXC_DEFAULT|EXD_PROC_COMMAND
         Value = /bin/rec
ENDGROUP

第 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) 手册页介绍了通过项目数据库提供的资源控制,其中包括单位和标度因数。

第 7 章 管理资源控制(任务)

本章介绍如何管理资源控制功能。

有关资源控制功能的概述,请参见第 6 章

管理资源控制(任务图)

任务 

说明 

参考 

设置资源控制。 

/etc/project 文件中的项目设置资源控制。

设置资源控制

获取或修改本地范围的活动进程、任务或项目的资源控制值。 

对与系统上的活动进程、任务或项目关联的资源控制进行运行时询问和修改。 

使用 prctl 命令

在正在运行的系统上,查看或更新资源控制的全局状态。 

查看整个系统范围内每个资源控制的全局日志状态。还在超过控制时设置 syslog 日志的级别。

使用 rctladm

报告活动的进程间通信 (interprocess communication, IPC) 功能的状态。 

显示有关活动的进程间通信 (interprocess communication, IPC) 功能的信息。查看哪些 IPC 对象正在使用项目资源。  

使用 ipcs

确定是否为 Web 服务器分配了足够的 CPU 容量。 

设置对资源控制执行的全局操作。通过此操作,可以接收任何所设资源控制值太低的实体的通知。 

如何确定是否为 Web 服务器分配了足够的 CPU 容量

设置资源控制

Procedure如何为项目中的每个任务设置最大 LWP 数

此过程将名为 x-files 的项目添加到 /etc/project 文件,并为在此项目中创建的任务设置最大 LWP 数。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用带有 K 选项的 -projadd 命令创建名为 x-files 的项目。将在此项目中创建的每个任务的最大 LWP 数设置为 3


    # projadd -K 'task.max-lwps=(privileged,3,deny)' x-files
    
  3. 使用以下方法之一查看 /etc/project 文件中的条目:

    • 键入


      # projects -l
      system
              projid : 0
              comment: ""
              users  : (none)
              groups : (none)
              attribs: 
      .
      .
      .
      x-files
              projid : 100
              comment: ""
              users  : (none)
              groups : (none)
              attribs: task.max-lwps=(privileged,3,deny)
    • 键入


      # cat /etc/project
      system:0:System:::
      .
      .
      .
      x-files:100::::task.max-lwps=(privileged,3,deny)

示例 7–1 会话样例

执行完此过程中的步骤后,如果超级用户在项目 x-files 中创建新任务(通过 newtask 加入项目),则无法在运行此任务时创建三个以上的 LWP。以下带有注释的会话样例显示了这一原则。


# newtask -p x-files csh

# prctl -n task.max-lwps $$
process: 111107: csh
NAME    PRIVILEGE    VALUE    FLAG   ACTION            RECIPIENT
task.max-lwps
        privileged       3       -   deny                      -
        system       2.15G     max   deny                      -
# id -p
uid=0(root) gid=1(other) projid=100(x-files)

# ps -o project,taskid -p $$
 PROJECT TASKID
 x-files    73

# csh        /* creates second LWP */

# csh        /* creates third LWP */

# csh        /* cannot create more LWPs */
Vfork failed
#

Procedure如何对一个项目设置多个控制

/etc/project 文件可以包含每个项目的多个资源控制设置,还可包含每个控制的多个阈值。阈值在操作子句中定义,这些子句使用逗号分隔多个值。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用带有 -s-K 选项的 projmod 命令对项目 x-files 设置资源控制:


    # projmod -s -K 'task.max-lwps=(basic,10,none),(privileged,500,deny);
    process.max-file-descriptor=(basic,128,deny)' x-filesone line in file
    

    将设置以下控制:

    • 针对每个任务的最大 LWP 数不采取任何操作的 basic 控制。

    • 针对每个任务的最大 LWP 数的特权 deny 控制。此控制会使所有超过最大值的 LWP 创建都失败,如前一示例如何为项目中的每个任务设置最大 LWP 数所示。

    • basic 级别对每个进程的最大文件描述符数的限制,它会强制任何超过最大数量的 open 调用均失败。

  3. 使用以下方法之一,查看文件中的条目:

    • 键入


      # projects -l
      .
      .
      .
      x-files
              projid : 100
              comment: ""
              users  : (none)
              groups : (none)
              attribs: process.max-file-descriptor=(basic,128,deny)
                       task.max-lwps=(basic,10,none),(privileged,500,deny) one line in file
      
    • 键入


      # cat etc/project
      .
      .
      .
      x-files:100::::process.max-file-descriptor=(basic,128,deny);
      task.max-lwps=(basic,10,none),(privileged,500,deny) one line in file
      

使用 prctl 命令

使用 prctl 命令,可以对与系统上的活动进程、任务或项目关联的资源控制进行运行时询问和修改。有关更多信息,请参见 prctl(1) 手册页。

Procedure如何使用 prctl 命令显示缺省资源控制值

必须在未设置或更改任何资源控制的系统上使用此过程。/etc/system 文件或 project 数据库中只能有非缺省条目。

  1. 在任意进程(如正在运行的当前 shell)中使用 prctl 命令。


    # prctl $$
    process: 100337: -sh
    NAME    PRIVILEGE       VALUE    FLAG   ACTION                   RECIPIENT
    process.max-port-events
            privileged      65.5K       -   deny                             -
            system          2.15G     max   deny                             -
    process.crypto-buffer-limit
            system          16.0EB    max   deny                             -
    process.max-crypto-sessions
            system          18.4E     max   deny                             -
    process.add-crypto-sessions
            privileged        100       -   deny                             -
            system          18.4E     max   deny                             -
    process.min-crypto-sessions
            privileged         20       -   deny                             -
            system          18.4E     max   deny                             -
    process.max-msg-messages
            privileged      8.19K       -   deny                             -
            system          4.29G     max   deny                             -
    process.max-msg-qbytes
            privileged      64.0KB      -   deny                             -
            system          16.0EB    max   deny                             -
    process.max-sem-ops
            privileged        512       -   deny                             -
            system          2.15G     max   deny                             -
    process.max-sem-nsems
            privileged        512       -   deny                             -
            system          32.8K     max   deny                             -
    process.max-address-space
            privileged      16.0EB    max   deny                             -
            system          16.0EB    max   deny                             -
    process.max-file-descriptor
            basic             256       -   deny                        100337
            privileged      65.5K       -   deny                             -
            system          2.15G     max   deny                             -
    process.max-core-size
            privileged      8.00EB    max   deny                             -
            system          8.00EB    max   deny                             -
    process.max-stack-size
            basic           8.00MB      -   deny                        100337
            privileged      8.00EB      -   deny                             -
            system          8.00EB    max   deny                             -
    process.max-data-size
            privileged      16.0EB    max   deny                             -
            system          16.0EB    max   deny                             -
    process.max-file-size
            privileged      8.00EB    max   deny,signal=XFSZ                 -
            system          8.00EB    max   deny                             -
    process.max-cpu-time
            privileged      18.4Es    inf   signal=XCPU                      -
            system          18.4Es    inf   none                             -
    task.max-cpu-time
            system          18.4Es    inf   none                             -
    task.max-lwps
            system          2.15G     max   deny                             -
    project.max-contracts
            privileged      10.0K       -   deny                             -
            system          2.15G     max   deny                             -
    project.max-device-locked-memory
            privileged       499MB      -   deny                             -
            system          16.0EB    max   deny                             -
    project.max-port-ids
            privileged      8.19K       -   deny                             -
            system          65.5K     max   deny                             -
    project.max-shm-memory
            privileged      1.95GB      -   deny                             -
            system          16.0EB    max   deny                             -
    project.max-shm-ids
            privileged        128       -   deny                             -
            system          16.8M     max   deny                             -
    project.max-msg-ids
            privileged        128       -   deny                             -
            system          16.8M     max   deny                             -
    project.max-sem-ids
            privileged        128       -   deny                             -
            system          16.8M     max   deny                             -
    project.max-tasks
            system          2.15G     max   deny                             -
    project.max-lwps
            system          2.15G     max   deny                             -
    project.cpu-shares
            privileged          1       -   none                             -
            system          65.5K     max   none                             -
    zone.max-lwps
            system          2.15G     max   deny                             -
    zone.cpu-shares
            privileged          1       -   none                             -
            system          65.5K     max   none                             -

Procedure如何使用 prctl 命令显示给定资源控制的信息

  1. 显示正在运行的当前 shell 的最大文件描述符。


    # prctl -n process.max-file-descriptor $$
    process: 110453: -sh
    NAME    PRIVILEGE       VALUE    FLAG   ACTION       RECIPIENT
    process.max-file-descriptor
            basic             256       -   deny            110453
            privileged      65.5K       -   deny                 -
            system          2.15G     max   deny     

Procedure如何使用 prctl 临时更改值

此示例过程使用 prctl 命令临时添加一个新的权限值,以便拒绝在每个 x-files 项目中使用三个以上的 LWP。可将此结果与如何为项目中的每个任务设置最大 LWP 数中的结果进行对比。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用 newtask 加入 x-files 项目。


    # newtask -p x-files
    
  3. 使用带有 -p 选项的 id 命令检验是否已加入正确的项目。


    # id -p
    uid=0(root) gid=1(other) projid=101(x-files)
  4. project.max-lwps 添加一个新的权限值,将 LWP 数限制为三个。


    # prctl -n project.max-lwps -t privileged -v 3 -e deny -i project x-files
    
  5. 验证结果。


    # prctl -n project.max-lwps -i project x-files
    process: 111108: csh
    NAME    PRIVILEGE    VALUE    FLAG   ACTION            RECIPIENT
    project.max-lwps
            privileged       3       -   deny                      -
            system       2.15G     max   deny                      -

Procedure如何使用 prctl 降低资源控制值

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用带有 -r 选项的 prctl 命令更改 process.max-file-descriptor 资源控制的最低值。


    # prctl -n process.max-file-descriptor -r -v 128 $$
    

Procedure如何使用 prctl 显示、替换和检验项目的控制值

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 显示项目 group.staffproject.cpu-shares 的值。


    # prctl -n project.cpu-shares -i project group.staff
    project: 2: group.staff
    NAME    PRIVILEGE       VALUE    FLAG   ACTION     RECIPIENT
    project.cpu-shares
            privileged          1       -   none               -
            system          65.5K     max   none 
  3. 将当前 project.cpu-shares1 替换为值 10


    # prctl -n project.cpu-shares -v 10 -r -i project group.staff
    
  4. 显示项目 group.staffproject.cpu-shares 的值。


    # prctl -n project.cpu-shares -i project group.staff
    project: 2: group.staff
    NAME    PRIVILEGE       VALUE    FLAG   ACTION     RECIPIENT
    project.cpu-shares
            privileged         10       -   none               -
            system          65.5K     max   none 

使用 rctladm

如何使用 rctladm

使用 rctladm 命令可以对资源控制功能的全局状态进行运行时询问和修改。有关更多信息,请参见 rctladm(1M) 手册页。

例如,您可以使用带有 -e 选项的 rctladm 来启用资源控制的全局 syslog 属性。当超过控制时,便会在指定的 syslog 级别记录通知。要启用 process.max-file-descriptor 的全局 syslog 属性,请键入以下命令:


# rctladm -e syslog process.max-file-descriptor

在不使用参数的情况下,rctladm 命令将显示每个资源控制的全局标志,包括全局类型标志。


# rctladm
process.max-port-events     syslog=off  [ deny count ]
process.max-msg-messages    syslog=off  [ deny count ]
process.max-msg-qbytes      syslog=off  [ deny bytes ]
process.max-sem-ops         syslog=off  [ deny count ]
process.max-sem-nsems       syslog=off  [ deny count ]
process.max-address-space   syslog=off  [ lowerable deny no-signal bytes ]
process.max-file-descriptor syslog=off  [ lowerable deny count ]
process.max-core-size       syslog=off  [ lowerable deny no-signal bytes ]
process.max-stack-size      syslog=off  [ lowerable deny no-signal bytes ]
.
.
.

使用 ipcs

如何使用 ipcs

使用 ipcs 实用程序可以显示有关活动的进程间通信 (interprocess communication, IPC) 功能的信息。有关更多信息,请参见 ipcs(1) 手册页。

您可以使用带有 -J 选项的 ipcs 来查看分配 IPC 对象所遵循的项目限制。


# ipcs -J
    IPC status from <running system> as of Wed Mar 26 18:53:15 PDT 2003
T         ID      KEY        MODE       OWNER    GROUP    PROJECT
Message Queues:
Shared Memory:
m       3600      0       --rw-rw-rw-   uname    staff    x-files
m        201      0       --rw-rw-rw-   uname    staff    x-files
m       1802      0       --rw-rw-rw-   uname    staff    x-files
m        503      0       --rw-rw-rw-   uname    staff    x-files
m        304      0       --rw-rw-rw-   uname    staff    x-files
m        605      0       --rw-rw-rw-   uname    staff    x-files
m          6      0       --rw-rw-rw-   uname    staff    x-files
m        107      0       --rw-rw-rw-   uname    staff    x-files
Semaphores:
s          0      0       --rw-rw-rw-   uname    staff    x-files

容量警告

通过对资源控制执行全局操作,可以接收任何实体因资源控制值设置太低而失败的通知。

例如,假设您要确定 Web 服务器是否拥有处理一般工作负荷所需的 CPU。您可以分析 sar 数据以了解空闲的 CPU 时间和平均负荷值。您也可以检查扩展记帐数据以确定针对 Web 服务器进程同时运行的进程数。

但是,比较简单的方法是将 Web 服务器置于任务中。然后,可以使用 syslog 设置全局操作,以便在任务超过对应于计算机容量的预定 LWP 数时通知您。

有关更多信息,请参见 sar(1) 手册页。

Procedure如何确定是否为 Web 服务器分配了足够的 CPU 容量

  1. 使用 prctl 命令对包含 httpd 进程的任务设置特权(超级用户拥有)资源控制。将每个任务的 LWP 总数限制为 40,并禁用所有的本地操作。


    # prctl -n task.max-lwps -v 40 -t privileged -d all `pgrep httpd`
    
  2. task.max-lwps 资源控制启用系统日志全局操作。


    # rctladm -e syslog task.max-lwps
    
  3. 查看工作负荷是否导致资源控制失败。

    如果是,将看到 /var/adm/messages,例如:


    Jan  8 10:15:15 testmachine unix: [ID 859581 kern.notice] 
    NOTICE: privileged rctl task.max-lwps exceeded by task 19

第 8 章 公平份额调度器(概述)

对工作负荷数据进行分析可以指明特定工作负荷或工作负荷组是否在独占 CPU 资源。如果这些工作负荷没有违反 CPU 资源使用约束,则可以修改系统上 CPU 时间的分配策略。使用本章所述的公平份额调度类,您可以基于份额而不是分时 (timesharing, TS) 调度类的优先级方案来分配 CPU 时间。

本章包含以下主题:

要开始使用公平份额调度器,请参见第 9 章

调度程序介绍

操作系统的基本工作是仲裁哪些进程可以访问系统资源。进程调度程序,也称为分发程序,是控制为进程分配 CPU 的内核部分。调度程序支持调度类的概念。每个类都定义了调度策略,用于调度类中的进程。Solaris 操作系统中的缺省调度程序(即 TS 调度程序)尝试为每个进程提供相对均等的访问可用 CPU 的权限。但是,您可能要指定为特定进程提供的资源多于为其他进程提供的资源。

可以使用公平份额调度器 (fair share scheduler, FSS),根据工作负荷的重要性控制可用 CPU 资源在工作负荷之间的分配。这种重要性通过您为每个工作负荷指定的 CPU 资源份额来表示。

您为每个项目指定 CPU 份额,以控制该项目访问 CPU 资源的权利。FSS 保证为各项目公平地分配 CPU 资源,这种公平分配基于已分配的份额,而与附加到项目的进程数无关。FSS 通过将某个项目与其他项目比较后,减少此项目对 CPU 的大量使用的权利,同时增加少量使用的权利来达到公平。

FSS 由一个内核调度类模块以及类特定版本的 dispadmin(1M)priocntl(1) 命令组成。FSS 使用的项目份额通过 project(4) 数据库中的 project.cpu-shares 属性指定。


注 –

如果您要在安装了区域的系统上使用 project.cpu-shares 资源控制,请参见区域配置数据在非全局区域中使用的资源控制在安装了区域的 Solaris 系统上使用公平份额调度器


CPU 份额定义

术语“份额”用于定义系统 CPU 资源中分配给某一项目的部分。如果您为某个项目指定的 CPU 份额数多于为其他项目指定的份额数,则此项目将从公平份额调度器中接收更多的 CPU 资源。

CPU 份额并不等同于 CPU 资源的百分比。份额用于定义工作负荷相对于其他工作负荷的相对重要性。为项目指定 CPU 份额时,主要的关注对象并不是项目具有的份额数,更重要的是要知道此项目与其他项目相比具有多少份额。您还必须考虑有多少其他项目与此项目争用 CPU 资源。


注 –

零份额项目中的进程始终以最低的系统优先级 (0) 运行。这些进程仅在非零份额项目不使用 CPU 资源时运行。


CPU 份额和进程状态

在 Solaris 系统中,项目工作负荷通常由多个进程组成。从公平份额调度器的角度来看,每个项目工作负荷可以处于空闲活动状态。如果某个项目的所有进程都没有使用 CPU 资源,则将此项目视为空闲项目。这通常表示此类进程处于休眠状态(等待 I/O 完成)或已停止。如果某个项目中至少有一个进程正在使用 CPU 资源,则将此项目视为活动项目。在计算为项目指定多少 CPU 资源时,将使用所有活动项目的份额总数。

活动项目增多时,为每个项目分配的 CPU 将减少,但是不同项目之间的分配比例并没有更改。

CPU 份额与使用率

份额分配并不等同于使用率。如果将 50% 的 CPU 资源分配给某个项目,它可能平均只使用 20% 的 CPU 资源。此外,仅当与其他项目争用资源时,份额才会限制对 CPU 的使用。如果某个项目在系统上单独运行,则无论为此项目分配多么低的资源百分比,它也始终能使用 100% 的处理能力。可用的 CPU 周期永远不会浪费,它们会分布在项目之间。

为处于忙碌状态的工作负荷分配少量份额可能会降低其性能。但是,只要系统没有过载,就不会阻止工作负荷完成其工作。

CPU 份额示例

假设您的系统具有两个 CPU,并且运行两个并行的计算密集型 (CPU-bound) 工作负荷,分别称为 AB。每个工作负荷都正在作为单独的项目运行。已对这些项目进行了配置,从而为项目 A 指定了 SA 个份额,为项目 B 指定了 S B 个份额。

在传统的 TS 调度程序下,会为系统上正在运行的各个工作负荷平均地提供相同的 CPU 资源量。每个工作负荷将使用 50% 的系统容量。

如果在 FSS 调度程序的控制之下运行,并且 S A=SB ,也会为这些项目提供大致等量的 CPU 资源。但是,如果为项目提供了不同的份额数,则它们的 CPU 资源分配量也就不同。

以下三个示例说明了份额在不同的配置中如何起作用。这些示例显示在可用资源能够满足或无法满足需求的情况下,从使用情况的角度来说,份额仅在算术意义上是精确的。

示例 1:每个项目中有两个计算密集型 (CPU-bound) 进程

如果 AB 各具有两个计算密集型 (CPU-bound) 进程,并且 S A = 1S B = 3,那么份额总数为 1 + 3 = 4。在该配置中,如果 CPU 请求充足,则分别向项目 AB 分配 25% 和 75% 的 CPU 资源。

图例。文中对该图形进行了说明。

示例 2:项目之间没有争用

如果 AB 各自仅有一个计算密集型 (CPU-bound) 进程,并且 S A = 1S B = 100,那么份额的总数为 101。因为每个项目只有一个运行的进程,所以每个项目都不能使用一个以上的 CPU。由于在此配置中项目之间没有争用 CPU 资源,因此,为项目 AB 各分配了全部 CPU 资源的 50%。在此配置中,CPU 份额值无关紧要。即使为两个项目都指定了零份额,项目的资源分配量也相同 (50/50)。

图例。文中对该图形进行了说明。

示例 3:一个项目无法运行

如果 AB 各有两个计算密集型 (CPU-bound) 进程,并且为项目 A 提供 1 个份额,为项目 B 提供 0 个份额,则不会为项目 B 分配任何 CPU 资源,而为项目 A 分配所有 CPU 资源。B 中的进程始终以系统优先级 0 运行,因此它们永远不能运行,这是因为项目 A 中的进程始终具有较高的优先级。

图例。文中对该图形进行了说明。

FSS 设置

项目和用户

项目是指 FSS 调度程序中的工作负荷容器。为项目指定的用户组被视为单个可控制块。请注意,您可以为单个用户创建具有自身份额数的项目。

用户可以是多个指定了不同份额数的项目的成员。通过将进程从一个项目移动到另一个项目,可以为进程指定不同的 CPU 资源量。

有关 project(4) 数据库和名称服务的更多信息,请参见project 数据库

CPU 份额配置

CPU 份额配置作为 project 数据库的一个属性由名称服务来管理。

当通过 setproject(3PROJECT) 库函数创建与项目关联的第一个任务(或进程)时,会将在 project 数据库中定义为资源控制 project.cpu-shares 的 CPU 份额数传递给内核。尚未定义 project.cpu-shares 资源控制的项目将被指定一个份额。

在以下示例中,/etc/project 文件中的这一条目将项目 x-files 的份额数设置为 5


x-files:100::::project.cpu-shares=(privileged,5,none)

如果在进程运行时改变了分配给数据库中某个项目的 CPU 份额数,则此时将不会修改此项目的份额数。为使更改生效,必须重新启动项目。

如果您要临时更改为项目指定的份额数而不在 project 数据库中改变此项目的属性,请使用 prctl 命令。例如,要在与项目 x-files 关联的进程运行时将此项目的 project.cpu-shares 资源控制值更改为 3,请键入以下命令:


# prctl -r -n project.cpu-shares -v 3 -i project x-files

有关更多信息,请参见 prctl(1) 手册页。

-r

替换命名资源控制的当前值。

-n name

指定资源控制的名称。

-v val

指定资源控制的值。

-i idtype

指定下一个参数的 ID 类型。

x-files

指定更改的对象。在此实例中,对象为项目 x-files

项目 ID 为 0 的项目 system 中包括所有由引导时初始化脚本启动的系统守护进程。可以将 system 视为具有无限多个份额的项目。这意味着,无论为其他项目提供多少份额,始终先调度 system。如果您不希望 system 项目具有无限的份额,则可以在 project 数据库中为此项目指定一个份额数。

如前所述,属于零份额项目的进程的系统优先级始终为 0。具有一个或多个份额的项目以 1 或更高的优先级运行。这样,仅当 CPU 资源可用(即非零份额项目没有请求 CPU 资源)时,才会调度零份额项目。

可以为一个项目指定的最大份额数为 65535。

FSS 和处理器集

FSS 可以与处理器集一起使用,与单独使用处理器集相比,这样可更精细地控制 CPU 资源在运行于每个处理器集中的项目之间的分配。FSS 调度程序将处理器集视为完全独立的分区,每个处理器集都单独控制 CPU 的分配。

运行于一个处理器集中的项目的 CPU 分配不会受到运行于另一个处理器集中的项目的 CPU 份额或活动的影响,因为这两个项目没有争用相同的资源。仅当项目在相同的处理器集中运行时,它们才会相互争用资源。

分配给项目的份额数是整个系统范围的份额数。无论项目在哪个处理器集中运行,此项目的每一部分都具有等量份额。

如果使用处理器集,则会针对每个处理器集中运行的活动项目来计算项目的 CPU 分配。

在不同处理器集中运行的项目分区可能具有不同的 CPU 分配。处理器集中每个项目分区的 CPU 分配仅依赖于在同一处理器集中运行的其他项目的分配。

在处理器集边界内运行的应用程序的性能和可用性不会受到新处理器集引入的影响。应用程序也不会受到对其他处理器集中运行的项目的份额分配所做更改的影响。

空处理器集(无处理器的集合)或者没有绑定进程的处理器集不会对 FSS 调度程序行为产生任何影响。

FSS 和处理器集示例

假设配有八个 CPU 的服务器正在项目 ABC 中运行若干个计算密集型 (CPU-bound) 应用程序。项目 A 分配有一个份额,项目 B 分配有两个份额,项目 C 分配有三个份额。

项目 A 只在处理器集 1 上运行。项目 B 在处理器集 1 和 2 上运行。项目 C 在处理器集 1、2 和 3 上运行。假设每个项目都有足够的进程来利用所有可用的 CPU 资源。这样,每个处理器集中始终存在对 CPU 资源的争用。

图显示了在具有八个 CPU 并且在三个项目中运行若干个计算密集型 (CPU-bound) 应用程序的服务器上,系统范围内总的项目 CPU 分配。

下表显示了此类系统上系统范围内总的项目 CPU 分配。

项目 

分配 

项目 A 

4% = (1/6 X 2/8)pset1

项目 B 

28% = (2/6 X 2/8)pset1+ (2/5 * 4/8)pset2

项目 C 

67% = (3/6 X 2/8)pset1+ (3/5 X 4/8)pset2+ (3/3 X 2/8)pset3

这些百分比并没有与为项目提供的相应 CPU 份额量相匹配。但是,在每个处理器集中,每个项目的 CPU 分配率与各自的份额成比例。

没有处理器集的同一系统上,CPU 资源的分配将有所不同,如下表所示。

项目 

分配 

项目 A 

16.66% = (1/6) 

项目 B 

33.33% = (2/6) 

项目 C 

50% = (3/6) 

将 FSS 与其他调度类组合

缺省情况下,FSS 调度类与分时 (timesharing, TS) 调度类、交互式 (interactive, IA) 调度类和固定优先级 (fixed priority, FX) 调度类使用相同的优先级范围(0 到 59)。因此,您应该避免这些调度类中的进程共享同一处理器集。FSS、TS、IA 和 FX 类中的混合进程可能会引起意外的调度行为。

使用处理器集时,您可以将 TS、IA、FX 和 FSS 纳入一个系统中。但是,在每个处理器集中运行的所有进程都必须属于一个调度类,这样它们就不会争用相同的 CPU。特别是,FX 调度程序不应与 FSS 调度类一起使用,除非使用处理器集。此操作防止 FX 类中的应用程序使用过高的优先级运行以至 FSS 类中的应用程序不能运行。

您可以将 TS 和 IA 类中的进程纳入同一处理器集中,也可纳入同一无处理器集的系统中。

Solaris 系统还为拥有超级用户权限的用户提供了实时 (real-time, RT) 调度程序。缺省情况下,RT 调度类使用与 FSS 不同的系统优先级范围(通常从 100 到 159)。由于 RT 和 FSS 使用不相交或不重叠的优先级范围,因此,FSS 可以与 RT 调度类共存于同一处理器集中。但是,FSS 调度类不对运行于 RT 类中的进程进行任何控制。

例如,在具有四个处理器的系统上,如果单线程 RT 进程具有 CPU 限制,则此进程便可占用整个处理器。如果系统也运行 FSS,则常规用户进程便会争用 RT 进程未使用的其余三个 CPU。请注意,RT 进程可能不会持续占用 CPU。当 RT 进程空闲时,FSS 便会使用所有四个处理器。

您可以键入以下命令来查看处理器集在哪些调度类中运行,并确保将每个处理器集配置为运行 TS、IA、FX 或 FSS 进程。


$ ps -ef -o pset,class | grep -v CLS | sort | uniq
1 FSS
1 SYS
2 TS
2 RT
3 FX

设置系统的调度类

要为系统设置缺省调度类,请参见如何将 FSS 设置为缺省调度程序类区域中的调度类dispadmin(1M)。要将正在运行的进程移至其他调度类,请参见配置 FSSpriocntl(1)

安装了区域的系统上的调度类

非全局区域使用系统的缺省调度类。如果使用新的缺省调度类设置更新了系统,则在引导或重新引导后非全局区域会获取新的设置。

在此情况下,使用 FSS 的首选方法是通过 dispadmin 命令将 FSS 设置为系统缺省调度类。这样,所有区域都将从获取系统 CPU 资源的公平份额中受益。有关使用区域时调度类的更多信息,请参见区域中的调度类

有关在不更改缺省调度类和不重新引导的情况下将正在运行的进程移至其他调度类的信息,请参见表 27–5priocntl(1) 手册页。

用于 FSS 的命令

下表中所示的命令提供了公平份额调度器的主要管理接口。

命令参考 

说明 

priocntl(1)

显示或设置指定进程的调度参数,将正在运行的进程移至其他调度类。 

ps(1)

列出有关正在运行的进程的信息,识别运行处理器集所用的调度类。 

dispadmin(1M)

设置系统的缺省调度程序。还用于检查和调整 FSS 调度程序的时间量程值。 

FSS(7)

介绍公平份额调度器 (fair share scheduler, FSS)。 

第 9 章 管理公平份额调度器(任务)

本章介绍如何使用公平份额调度器 (fair share scheduler, FSS)。

有关 FSS 的概述,请参见第 8 章。有关使用区域时调度类的信息,请参见区域中的调度类

管理公平份额调度器(任务图)

任务 

说明 

参考 

监视 CPU 使用情况。 

监视项目以及处理器集中项目的 CPU 使用情况。 

监视 FSS

设置缺省调度程序类。 

将 FSS 等调度程序设置为系统的缺省调度程序。 

如何将 FSS 设置为缺省调度程序类

将正在运行的进程从一个调度程序类移至其他调度类(如 FSS 类)。 

在不更改缺省调度类和不重新引导的情况下,将进程从一个调度类手动移至另一个调度类。 

如何将进程从 TS 类手动移至 FSS 类

将所有正在运行的进程从所有调度类移至其他调度类(如 FSS 类)。 

在不更改缺省调度类和不重新引导的情况下,将所有调度类中的进程手动移至另一个调度类。 

如何将进程从所有用户类手动移至 FSS 类

将项目的进程移至其他调度类(如 FSS 类)。 

将项目的进程从当前调度类手动移至其他调度类。 

如何将项目的进程手动移至 FSS 类

检查和调整 FSS 参数。 

调整调度程序的时间量程值。时间量程是指线程在必须放弃处理器之前可以运行的时间。

如何调整调度程序参数

监视 FSS

您可以使用 prstat(1M) 手册页中所述的 prstat 命令来监视活动项目的 CPU 使用情况。

您可以使用任务的扩展记帐数据来获取每个项目在较长一段时间内占用的 CPU 资源量的统计信息。有关更多信息,请参见第 4 章

Procedure如何按项目监视系统的 CPU 使用情况

  1. 要监视系统上运行的项目的 CPU 使用情况,请使用带有 -J 选项的 prstat 命令。


    % prstat -J
    

Procedure如何按处理器集中的项目监视 CPU 使用情况

  1. 要监视处理器集列表中项目的 CPU 使用情况,请键入:


    % prstat -J -C pset-list
    

    其中,pset-list 是用逗号分隔的处理器集 ID 的列表。

配置 FSS

用于 Solaris 系统中的其他调度类的命令也可用于 FSS。您可以设置调度程序类,配置调度程序的可调参数,以及配置单个进程的属性。

请注意,可以使用 svcadm restart 重新启动调度程序服务。有关更多信息,请参见 svcadm(1M)

Procedure如何将 FSS 设置为缺省调度程序类

FSS 必须是系统上的缺省调度程序才能使 CPU 份额分配生效。

使用 priocntldispadmin 命令的组合确保 FSS 既可立即设置为缺省调度程序,也可在重新引导之后设置为缺省调度程序。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 将系统的缺省调度程序设置为 FSS


    # dispadmin -d FSS
    

    此更改将在下次重新引导时生效。重新引导之后,系统上的每个进程都在 FSS 调度类中运行。

  3. 在不重新引导的情况下,使此配置立即生效。


    # priocntl -s -c FSS -i all
    

Procedure如何将进程从 TS 类手动移至 FSS 类

您可以在不更改缺省调度类和不重新引导的情况下,将进程从一个调度类手动移至另一个调度类。此过程显示了如何将进程从 TS 调度类手动移至 FSS 调度类。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. init 进程 (pid 1) 移至 FSS 调度类。


    # priocntl -s -c FSS -i pid 1
    
  3. 将所有进程从 TS 调度类移至 FSS 调度类。


    # priocntl -s -c FSS -i class TS
    

    注 –

    重新引导之后,所有进程将再次在 TS 调度类中运行。


Procedure如何将进程从所有用户类手动移至 FSS 类

您可以使用 TS 之外的缺省类。例如,您的系统可能正在运行缺省情况下使用 IA 类的窗口环境。您可以在不更改缺省调度类和不重新引导的情况下,将所有进程手动移至 FSS 调度类。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. init 进程 (pid 1) 移至 FSS 调度类。


    # priocntl -s -c FSS -i pid 1
    
  3. 将所有进程从当前调度类移至 FSS 调度类。


    # priocntl -s -c FSS -i all
    

    注 –

    重新引导之后,所有进程将再次在缺省调度类中运行。


Procedure如何将项目的进程手动移至 FSS 类

您可以将项目的进程从当前调度类手动移至 FSS 调度类。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 将使用项目 ID 10 运行的进程移至 FSS 调度类。


    # priocntl -s -c FSS -i projid 10
    

    重新引导之后,项目的进程将再次在缺省调度类中运行。

如何调整调度程序参数

当系统正在运行时,您可以使用 dispadmin 命令来显示或更改进程调度程序参数。例如,您可以使用 dispadmin 来检查和调整 FSS 调度程序的时间量程值。时间量程是指线程在必须放弃处理器之前可以运行的时间。

要在系统正在运行时显示 FSS 调度程序的当前时间量程,请键入:


$ dispadmin -c FSS -g
#
# Fair Share Scheduler Configuration
#
RES=1000
#
# Time Quantum
#
QUANTUM=110

使用 -g 选项时,您还可以使用 -r 选项来指定列显时间量程值所用的精度。如果未指定精度,则缺省情况下时间量程值将以毫秒显示。


$ dispadmin -c FSS -g -r 100
#
# Fair Share Scheduler Configuration
#
RES=100
#
# Time Quantum
#
QUANTUM=11

要为 FSS 调度类设置调度参数,请使用 dispadmin -sfile 中的值必须采用由 -g 选项输出的格式。这些值会覆写内核中的当前值。键入以下命令:


$ dispadmin -c FSS -s file

第 10 章 使用资源上限设置守护进程控制物理内存(概述)

使用资源上限设置守护进程 rcapd,您可以调节已定义资源上限的项目中运行的进程所占用的物理内存。

Solaris 10 8/07: 如果在系统中运行区域,则可以从全局区域中使用 rcapd 来控制非全局区域中物理内存的占用情况。请参见第 18 章

本章包含以下主题:

有关使用 rcapd 功能的过程,请参见第 11 章

在使用资源上限设置守护进程控制物理内存方面的新增功能

Solaris 10: 现在可以使用 projmod 命令在 /etc/project 文件中设置 rcap.max-rss 属性。

Solaris 10 11/06:增加了有关将资源上限设置守护进程作为 Solaris 服务管理工具 (Service Management facility, SMF) 中的一项服务进行启用和禁用的信息。

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

资源上限设置守护进程介绍

资源上限是对资源(如物理内存)占用设定的上限。支持按项目设置物理内存上限。

资源上限设置守护进程及其关联的实用程序提供了物理内存资源上限执行和管理机制。

资源上限与资源控制一样,可以使用 project 数据库中项目条目的属性进行定义。但是,资源控制由内核同步执行,而资源上限由资源上限设置守护进程在用户级别上异步执行。在异步执行过程中,守护进程所用的抽样间隔会导致轻微的延迟。

有关 rcapd 的信息,请参见 rcapd(1M) 手册页。有关项目和 project 数据库的信息,请参见第 2 章project(4) 手册页。有关资源控制的信息,请参见第 6 章

资源上限设置工作原理

守护进程重复对具有物理内存上限的项目的资源利用率进行抽样。它所使用的抽样间隔由管理员指定。有关其他信息,请参见确定抽样间隔。当系统的物理内存使用率超过上限执行的阈值并且满足其他条件时,守护进程便会采取措施将具有内存上限的项目的资源使用率降到等于或低于上限的水平。

虚拟内存系统将物理内存分为多个段,这些段称为页面。在 Solaris 内存管理子系统中,页面是物理内存的基本单元。在将数据从文件读入内存时,虚拟内存系统一次读入文件的一页,或者说对文件执行页入操作。为了减少资源占用,守护进程可以对不常用的页面执行页出操作,即将其重新放置到交换设备中,该设备是位于物理内存以外的区域。

守护进程通过调整项目工作负荷驻留集相对其工作集的大小来管理物理内存。驻留集是驻留在物理内存中的一组页面。工作集是指处理工作负荷过程中实际使用的一组页面。工作集会随着时间的推移发生变化,具体取决于进程的运行模式以及正在处理的数据类型。理想的情况是,每个工作负荷可以访问的物理内存都足以使其工作集一直驻留在物理内存中。但是,工作集还可以使用辅助磁盘存储器来容纳物理内存之外的存储器。

在给定时间只能运行一个 rcapd 实例。

限制项目物理内存使用率的属性

要定义项目的物理内存资源上限,请通过为 project 数据库条目添加以下属性来设定驻留集大小 (resident set size, RSS) 上限:

rcap.max-rss

项目中的进程可用的物理内存总量(字节)。

例如,/etc/project 文件中的以下行将项目 db 的 RSS 上限设置为 10 GB。


db:100::db,root::rcap.max-rss=10737418240

注 –

系统可以将指定的上限值舍入为页面大小。


您可以使用 projmod 命令在 /etc/project 文件中设置 rcap.max-rss 属性:


# projmod -s -K rcap.max-rss=10GB db

然后,/etc/project 文件将包含以下行:


db:100::db,root::rcap.max-rss=10737418240

rcapd 配置

您可以使用 rcapadm 命令配置资源上限设置守护进程。可以执行以下操作:

要配置守护进程,您必须拥有超级用户权限,或您的配置文件列表中有进程管理配置文件。进程管理角色和系统管理员角色都包含进程管理配置文件。

可以根据配置间隔(请参见rcapd 操作间隔)或者在需要时通过发送 SIGHUP(请参见 kill(1) 手册页),将配置更改并入 rcapd

如果使用时不带参数,rcapadm 将显示资源上限设置守护进程(如果已配置)的当前状态。

以下各小节将讨论上限执行、上限值以及 rcapd 操作间隔。

在安装有区域的系统上使用资源上限设置守护进程

可以在配置区域时通过设置 capped-memory 资源,来控制该区域的驻留集大小 (resident set size, RSS) 的使用情况。有关更多信息,请参见Solaris 10 8/07:物理内存控制和 capped-memory 资源。您可以区域(包括全局区域)中运行 rcapd,以便对该区域中的项目执行内存上限。

您可以为指定区域可占用的最大内存量设置一个临时上限(该值可持续到下次重新引导)。请参见如何为区域指定临时资源上限

如果要在某个区域中使用 rcapd 来控制已定义资源上限的项目中运行的进程所占用的物理内存,则必须在此区域中配置该守护进程。

为位于不同的区域中的应用程序选择内存上限时,通常不必考虑这些应用程序驻留在不同的区域中。但每区域服务则例外。每区域服务会占用内存。在确定系统的物理内存量和内存上限时,必须考虑此内存占用情况。


注 –

您不能在 lx 标记区域中运行 rcapd。但是,您可以从全局区域中使用该守护进程来在标记区域中设置内存上限。


内存上限执行阈值

内存上限执行阈值是系统中触发上限执行的物理内存使用百分比。当系统超过此使用率时,便会执行上限。应用程序和内核使用的物理内存包括在此百分比中。此使用百分比确定执行内存上限的方式。

在执行上限时,会对项目工作负荷中的内存执行页出操作。

某个工作负荷最多可以使用大小等于其上限的物理内存。只要系统内存使用率低于内存上限执行阈值,工作负荷便可使用更多的内存。

要设置上限执行值,请参见如何设置内存上限执行阈值

确定上限值

如果项目上限设置得太低,就没有足够的内存来保证工作负荷在正常情况下有效地执行。由于工作负荷需要更多内存而产生的分页操作会对系统性能造成负面影响。

上限设置得太高的项目可能会在超过其上限值之前占用可用物理内存。在这种情况下,物理内存由内核而不是 rcapd 进行有效管理。

在确定项目的上限时,应考虑到以下因素。

对 I/O 系统的影响

守护进程可以尝试在抽样使用率超过项目上限时降低项目工作负荷的物理内存使用率。在上限执行过程中,将使用交换设备和包含工作负荷映射的文件的其他设备。交换设备的性能是确定经常超过其上限的工作负荷的性能的重要因素。执行工作负荷类似于在具有等同于工作负荷上限的物理内存量的计算机上运行该工作负荷。

对 CPU 使用率的影响

守护进程的 CPU 使用率随着它已设置上限的项目工作负荷中的进程数和工作负荷的地址空间大小而变化。

守护进程的少部分 CPU 时间用在对每个工作负荷使用情况进行的抽样上。向工作负荷中添加进程会增加对使用率进行抽样所用的时间。

守护进程的另一部分 CPU 时间用在超过上限时执行上限上。所用的时间与涉及的虚拟内存量成比例。所用的 CPU 时间会根据工作负荷的地址空间总大小的相应更改而延长或缩短。此信息在 rcapstat 输出的 vm 列中显示。有关更多信息,请参见使用 rcapstat 监视资源利用率rcapstat(1) 手册页。

有关共享内存的报告

rcapd 守护进程报告与其他进程共享的内存页的 RSS,或在与合理的准确估算同样的进程中的多次映射。如果不同项目中的进程共享同一内存,那么将为共享该内存的所有项目为 RSS 总数计算该内存。

估算可用于广泛使用共享内存的工作负荷(如数据库)。对于这些数据库工作负荷,您也可以使用 prstat 命令的 -J-Z 选项的输出对项目的常规使用进行抽样,以便确定适当的初始上限值。有关更多信息,请参见 prstat(1M) 手册页。

rcapd 操作间隔

您可以调整 rcapd 所执行的定期操作的间隔。

所有间隔都以秒为单位指定。下表介绍了 rcapd 操作及其缺省间隔值。

操作 

缺省间隔值(秒) 

说明 

scan

15 

对加入或保留项目工作负荷的进程进行扫描的间隔秒数。最小值为 1 秒。 

sample

对驻留集大小和后续上限执行进行抽样的间隔秒数。最小值为 1 秒。 

report

5  

对分页统计信息进行更新的间隔秒数。如果设置为 0,则不更新统计信息,并且 rcapstat 的输出也不是最新的。

config

60 

重新配置的间隔秒数。在重新配置事件中,rcapadm 读取配置文件以获得更新,并扫描 project 数据库以查找新的或已修改的项目上限。向 rcapd 发送 SIGHUP 会立即执行重新配置。

要调整间隔,请参见如何设置操作间隔

确定 rcapd 扫描间隔

扫描间隔控制 rcapd 查找新进程的频率。在运行有多个进程的系统上,完全扫描这些进程列表会花费较多时间,因此,最好可以延长间隔,以便缩短所用的总 CPU 时间。但是,扫描间隔也代表进程为了纳入具有上限的工作负荷而必须存在的最短时间。如果工作负荷运行多个短期进程,则在延长扫描间隔的情况下,rcapd 无法将进程纳入工作负荷。

确定抽样间隔

使用 rcapadm 配置的抽样间隔是指,在对工作负荷使用情况进行抽样和执行上限(如果超过该上限)这两个操作之间 rcapd 等待的最短时间。如果缩短此间隔,在多数情况下,rcapd 会更频繁地执行上限,从而可能会因换页导致 I/O 增加。但是,较短的抽样间隔也可以减小特定工作负荷的物理内存使用率突然增加而给其他工作负荷带来的影响。抽样之间的窗口(其中,工作负荷可能不受限制地占用内存并且可能从其他具有上限的工作负荷中获取内存)会缩小。

如果为 rcapstat 指定的抽样间隔小于使用 rcapadmrcapd 指定的间隔,则某些间隔的输出可能为零。发生这种情况是因为 rcapd 更新统计信息的间隔大于使用 rcapadm 指定的间隔。使用 rcapadm 指定的间隔与 rcapstat 所用的抽样间隔无关。

使用 rcapstat 监视资源利用率

使用 rcapstat 可以监视具有上限的项目的资源利用率。要查看 rcapstat 报告示例,请参见使用 rcapstat 生成报告

您可以为报告设置抽样间隔并指定重复统计信息的次数。

interval

按秒指定抽样间隔。缺省间隔为 5 秒。

count

指定重复统计信息的次数。缺省情况下,rcapstat 会一直报告统计信息,直至收到终止信号或出现 rcapd 进程。

rcapstat 发布的第一个报告中的分页统计信息显示自启动守护进程以来执行的活动。后续报告反映自发布最后一个报告以来执行的活动。

下表定义 rcapstat 报告中的列标题。

rcapstat 列标题

说明 

id

具有上限的项目的 ID。 

project

项目名称。 

nproc

项目中的进程数。 

vm

项目中的进程所用的总虚拟内存大小(包括所有映射的文件和设备),以千字节 (K)、兆字节 (M) 或千兆字节 (G) 为单位。 

rss

项目中进程的总驻留集大小 (resident set size, RSS) 的估算量,以千字节 (K)、兆字节 (M) 或千兆字节 (G) 为单位,没有考虑共享的页面。 

cap

为项目定义的 RSS 上限。有关如何指定内存上限的信息,请参见限制项目物理内存使用率的属性rcapd(1M) 手册页。

at

自上次 rcapstat 抽样以来,rcapd 尝试对其执行页出操作的内存总量。

avgat

自上次 rcapstat 抽样以来,rcapd 在所出现的每个抽样周期中尝试对其执行页出操作的平均内存量。使用 rcapadm 可以设置 rcapd 对集合 RSS 进行抽样的速率。请参见rcapd 操作间隔

pg

自上次 rcapstat 抽样以来,rcapd 成功对其执行页出操作的内存总量。

avgpg

自上次 rcapstat 抽样以来,rcapd 在所出现的每个抽样周期中成功对其执行页出操作的平均内存量估算值。使用 rcapadm 可以设置 rcapd 对进程 RSS 大小进行抽样的速率。请参见rcapd 操作间隔

用于 rcapd 的命令

命令参考 

说明 

rcapstat(1)

监视具有上限的项目的资源利用率。 

rcapadm(1M)

配置资源上限设置守护进程,显示已配置的资源上限设置守护进程的当前状态,以及启用或禁用资源上限设置。 

rcapd(1M)

资源上限设置守护进程。 

第 11 章 管理资源上限设置守护进程(任务)

本章介绍配置和使用资源上限设置守护进程 rcapd 的过程。

有关 rcapd 的概述,请参见第 10 章

配置和使用资源上限设置守护进程(任务图)

任务 

说明 

参考 

设置内存上限执行阈值。 

配置一个将在可用于进程的物理内存很低时执行的上限。 

如何设置内存上限执行阈值

设置操作间隔。 

间隔应用于由资源上限设置守护进程执行的定期操作。 

如何设置操作间隔

启用资源上限设置。 

在系统上激活资源上限设置。 

如何启用资源上限设置

禁用资源上限设置。 

在系统上取消激活资源上限设置。 

如何禁用资源上限设置

报告上限和项目信息。 

查看用于生成报告的示例命令。 

报告上限和项目信息

监视项目的驻留集大小。 

生成有关项目驻留集大小的报告。 

监视项目的 RSS

确定项目的工作集大小。 

生成有关项目工作集大小的报告。 

确定项目的工作集大小

报告内存使用率和内存上限。 

针对每个间隔在报告结尾列显一行有关内存使用率和上限执行的信息。 

报告内存使用率和内存上限执行阈值

使用 rcapadm 管理资源上限设置守护进程

本节介绍了有关使用 rcapadm 命令配置资源上限设置守护进程的过程。有关更多信息,请参见rcapd 配置rcapadm(1M) 手册页。此外,还介绍了使用 rcapadm 为区域指定临时资源上限的过程。

如果使用时不带参数,rcapadm 将显示资源上限设置守护进程(如果已配置)的当前状态。

Procedure如何设置内存上限执行阈值

可以对上限进行配置,以便在可用于进程的物理内存很低时执行。有关更多信息,请参见内存上限执行阈值

最小(和缺省)值为 0,这意味着将始终执行内存上限。要设置不同的最小值,请遵照以下过程执行操作。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关如何创建该角色并将其指定给用户的信息,请参见《系统管理指南:安全性服务》中的“管理 RBAC(任务列表)”。

  2. 使用 rcapadm-c 选项为内存上限执行设置不同的物理内存使用率值。


    # rcapadm -c percent
    

    percent 的范围为 0 至 100。值越高,限制就越小。较高的值表示在系统的内存使用率超过此阈值之前,可以在不执行上限的情况下执行具有上限的项目的工作负荷。

另请参见

要显示当前物理内存使用率和上限执行阈值,请参见报告内存使用率和内存上限执行阈值

Procedure如何设置操作间隔

rcapd 操作间隔介绍了有关由 rcapd 执行的定期操作的间隔的信息。要使用 rcapadm 设置操作间隔,请遵照以下过程执行操作。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关如何创建该角色并将其指定给用户的信息,请参见《系统管理指南:安全性服务》中的“管理 RBAC(任务列表)”。

  2. 使用 -i 选项设置间隔值。


    # rcapadm -i interval=value,...,interval=value 
    

    注 –

    所有间隔值都以秒为单位指定。


Procedure如何启用资源上限设置

可以通过三种方法在系统上启用资源上限设置。启用资源上限设置还可以使用缺省值设置 /etc/rcap.conf 文件。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关如何创建该角色并将其指定给用户的信息,请参见《系统管理指南:安全性服务》中的“管理 RBAC(任务列表)”。

  2. 通过以下方法之一启用资源上限设置守护进程:

    • 使用 svcadm 命令启用资源上限设置。


      # svcadm enable rcap
      
    • 要启用资源上限设置守护进程,以使其现在启动并且也在每次引导系统时启动,请键入:


      # rcapadm -E
      
    • 如果不是现在启用资源上限设置守护进程,而是在引导时启用它,则还应指定 -n 选项:


      # rcapadm -n -E
      

Procedure如何禁用资源上限设置

可以通过三种方法在系统上禁用资源上限设置。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关如何创建该角色并将其指定给用户的信息,请参见《系统管理指南:安全性服务》中的“管理 RBAC(任务列表)”。

  2. 通过以下方法之一禁用资源上限设置守护进程:

    • 使用 svcadm 命令禁用资源上限设置。


      # svcadm disable rcap
      
    • 要禁用资源上限设置守护进程,以使其现在停止并且不会在引导系统时启动,请键入:


      # rcapadm -D
      
    • 要在不停止资源上限设置守护进程的情况下禁用它,还应指定 -n 选项:


      # rcapadm -n -D
      

    提示 –

    安全禁用资源上限设置守护进程


    使用 svcadm 命令或带有 D-rcapadm 命令可以安全地禁用 rcapd。如果中止该守护进程(请参见 kill(1) 手册页),则进程可能处于停止状态,并且需要手动重新启动。要使进程恢复运行,请使用 prun 命令。有关更多信息,请参见 prun(1) 手册页。

Procedure如何为区域指定临时资源上限

此过程用于分配指定区域可占用的最大内存量。此值只会持续到下次重新引导。要设置持久性上限,请使用 zonecfg 命令。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。

  2. 为区域 my-zone 设置 512 MB 的最大内存值。


    # rcapadm -z testzone -m 512M
    

使用 rcapstat 生成报告

使用 rcapstat 可报告资源上限设置统计信息。使用 rcapstat 监视资源利用率说明了如何使用 rcapstat 命令生成报告。此节还介绍了报告中的列标题。rcapstat(1) 手册页也包含此信息。

以下各小节通过示例说明如何生成用于特定用途的报告。

报告上限和项目信息

在此示例中,为与两个用户相关联的两个项目定义了上限。user1 的上限为 50 MB,user2 的上限为 10 MB。

以下命令以 5 秒为抽样间隔生成 5 个报告。


user1machine% rcapstat 5 5
    id project  nproc     vm    rss   cap    at avgat    pg avgpg
112270   user1     24   123M    35M   50M   50M    0K 3312K    0K
 78194   user2      1  2368K  1856K   10M    0K    0K    0K    0K
    id project  nproc     vm    rss   cap    at avgat    pg avgpg
112270   user1     24   123M    35M   50M    0K    0K    0K    0K
 78194   user2      1  2368K  1856K   10M    0K    0K    0K    0K
    id project  nproc     vm    rss   cap    at avgat    pg avgpg
112270   user1     24   123M    35M   50M    0K    0K    0K    0K
 78194   user2      1  2368K  1928K   10M    0K    0K    0K    0K
    id project  nproc     vm    rss   cap    at avgat    pg avgpg
112270   user1     24   123M    35M   50M    0K    0K    0K    0K
 78194   user2      1  2368K  1928K   10M    0K    0K    0K    0K
    id project  nproc     vm    rss   cap    at avgat    pg avgpg
112270   user1     24   123M    35M   50M    0K    0K    0K    0K
 78194   user2      1  2368K  1928K   10M    0K    0K    0K    0K 

输出的前三行构成了第一个报告,此报告包含自启动 rcapd 以来两个项目的上限和项目信息以及换页统计信息。对于 user1atpg 列中的数字大于零,对于 user2,这两列中的数字等于零,这表示在守护进程的历史记录中,有时 user1 超过其上限,但 user2 却没有。

后续各报告没有显示任何重要的活动。

监视项目的 RSS

以下示例显示了项目的 user1,此项目的 RSS 超过其 RSS 上限。

以下命令以 5 秒为抽样间隔生成 5 个报告。


user1machine% rcapstat 5 5

    id project  nproc    vm   rss   cap    at avgat     pg  avgpg
376565   user1      3 6249M 6144M 6144M  690M  220M  5528K  2764K
376565   user1      3 6249M 6144M 6144M    0M  131M  4912K  1637K
376565   user1      3 6249M 6171M 6144M   27M  147M  6048K  2016K
376565   user1      3 6249M 6146M 6144M 4872M  174M  4368K  1456K
376565   user1      3 6249M 6156M 6144M   12M  161M  3376K  1125K

user1 项目具有三个积极使用物理内存的进程。pg 列中的正值表示 rcapd 在尝试通过降低项目进程的物理内存使用率来满足上限要求时,始终对内存执行页出操作。但是,rcapd 无法成功保持 RSS 低于上限值。从不断变化却并未真正减小的 rss 值可以看出这一点。只要从内存中调出页面,工作负荷便会再次使用内存,于是 RSS 值将会再次回升。这意味着项目的所有驻留内存都在被使用,并且工作集大小 (working set size, WSS) 大于上限。因此,将会强制 rcapd 对某些工作集执行页出操作以满足上限要求。在这种情况下,系统将继续频繁出现页面错误,并大量使用关联的 I/O,直到发生以下情况之一:

在这种情况下,缩短抽样间隔可能会减小 RSS 值和上限值之间的差异,因为缩短抽样间隔会使rcapd 更频繁地对工作负荷进行抽样并执行上限。


注 –

必须创建新的页面或者系统必须在交换设备的某页面中进行复制时,便会出现页面错误。


确定项目的工作集大小

以下示例是前一示例的延续,它使用相同的项目。

前一示例显示 user1 项目使用的物理内存超过其上限所允许的内存量。此示例显示了项目工作负荷需要的内存量。


user1machine% rcapstat 5 5
    id project  nproc    vm   rss   cap    at avgat     pg  avgpg
376565   user1      3 6249M 6144M 6144M  690M    0K   689M     0K
376565   user1      3 6249M 6144M 6144M    0K    0K     0K     0K
376565   user1      3 6249M 6171M 6144M   27M    0K    27M     0K
376565   user1      3 6249M 6146M 6144M 4872K    0K  4816K     0K
376565   user1      3 6249M 6156M 6144M   12M    0K    12M     0K
376565   user1      3 6249M 6150M 6144M 5848K    0K  5816K     0K
376565   user1      3 6249M 6155M 6144M   11M    0K    11M     0K
376565   user1      3 6249M 6150M   10G   32K    0K    32K     0K
376565   user1      3 6249M 6214M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K

在循环的中途,user1 项目的上限从 6 GB 增大到 10 GB。此增长会停止上限执行并允许驻留集大小增长(仅受计算机中的其他进程和内存量的限制)。rss 列可能会保持不变,以反映项目工作集大小 (working set size, WSS),在此示例中大小为 6247 M。这是允许项目进程在不会连续出现页面错误的情况下运行的最小上限值。

user1 的上限为 6 GB 时,在每隔 5 秒的抽样间隔内,由于 rcapd 会对某些工作负荷内存执行页出操作,因此 RSS 将减小,而 I/O 将增加。页出操作完成后不久,需要这些页面的工作负荷会在继续运行时再对这些页面执行页入操作。此循环会重复进行,直到在将近此示例的中途,上限增加到 10 GB。之后,RSS 保持在 6.1 GB。由于此时工作负荷的 RSS 低于上限,因此不再发生换页,还会停止与换页关联的 I/O。因此,项目需要 6.1 GB 来执行查看此项目时正在进行的工作。

另请参见 vmstat(1M)iostat(1M) 手册页。

报告内存使用率和内存上限执行阈值

您可以使用 rcapstat-g 选项报告以下内容:

可使用 -g 选项针对每个间隔在报告结尾列显一行有关内存使用率和上限执行的信息。


# rcapstat -g
    id project   nproc    vm   rss   cap    at avgat   pg  avgpg
376565    rcap       0    0K    0K   10G    0K    0K   0K     0K
physical memory utilization: 55%   cap enforcement threshold: 0%
    id project   nproc    vm   rss   cap    at avgat   pg  avgpg
376565    rcap       0    0K    0K   10G    0K    0K   0K     0K
physical memory utilization: 55%   cap enforcement threshold: 0%

第 12 章 资源池(概述)

本章讨论以下功能:

从 Solaris 10 11/06 发行版开始,资源池和动态资源池已成为 Solaris 服务管理工具 (service management facility, SMF) 中的服务。其中,每项服务都是单独启用的。

本章包含以下主题:

有关使用此功能的过程,请参见第 13 章

资源池和动态资源池的新增功能

Solaris 10:现在,资源池提供了一种机制,可调整每个池的资源分配,以响应系统事件和应用程序负荷的变化。动态资源池简化了管理员需要做出的决策并减少了决策数。调整是自动进行的,目的是确保始终达到管理员指定的系统性能目标。

现在,您可以使用 projmod 命令在 /etc/project 文件中设置 project.pool 属性。

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

Solaris 10 11/06: 资源池和动态资源池现在是 SMF 服务。

资源池介绍

通过资源池可以分散工作负荷,以便工作负荷占用的特定资源不会重叠。在具有混合工作负荷的系统上,这种资源预留有助于获得可预测的性能。

资源池提供了一种持久性配置机制,可配置处理器集 (pset),还可选择性分配调度类。

图 12–1 资源池框架

图中显示的池包含一个处理器集和一个调度类(可选)。

可以将池视为系统上可用的各种资源集的特定绑定。您可以创建表示各种可能的资源组合的池:

pool1: pset_default

pool2: pset1

pool3: pset1, pool.scheduler="FSS"

通过对多个分区进行分组,池可以提供一个与已标记的工作负荷关联的句柄。/etc/project 文件中的每个项目条目都可以有一个与其关联的池,该池使用 project.pool 属性指定。

启用池时,缺省池缺省处理器集构成了基本配置。可以创建其他用户自定义的池和处理器集并将它们添加到配置中。一个 CPU 只能属于一个处理器集。可以销毁用户自定义的池和处理器集,不能销毁缺省池和缺省处理器集。

缺省池的 pool.default 属性设置为 true。缺省处理器集的 pset.default 属性设置为 true。因此,即使更改了缺省池和缺省处理器集的名称,仍可以识别它们。

用户自定义的池机制主要用于 CPU 超过四个的大型计算机。但是,小型计算机仍可以利用此功能。在小型计算机上,您可以创建共享非关键资源分区的池。池仅按关键资源进行分隔。

动态资源池介绍

动态资源池提供了一种机制,可动态调整每个池的资源分配,以便响应系统事件和应用程序负荷的变化。DRP 简化了管理员需要做出的决策并减少了决策数。调整是自动进行的,目的是确保始终达到管理员指定的系统性能目标。对配置所做的更改将会记录。这些功能主要通过资源控制器 poold 来实施,它是一种系统守护进程,需要进行动态资源分配时此进程应始终处于活动状态。poold 会定期检查系统负荷,并确定是否需要人为介入,以使系统在资源利用方面保持最佳性能。poold 配置保存在 libpool 配置中。有关 poold 的更多信息,请参见 poold(1M) 手册页。

关于启用和禁用资源池和动态资源池

要启用和禁用资源池和动态资源池,请参见启用和禁用池功能

区域中使用的资源池


提示 –

Solaris 10 8/07: 除了将区域与系统中已配置的资源池建立关联外,还可以使用 zonecfg 命令来创建一个临时池,以在该区域运行时生效。有关更多信息,请参见Solaris 10 8/07:dedicated-cpu 资源


在启用了区域的系统上,可以将非全局区域与一个资源池关联,虽然不需要将池专门分配给特定区域。此外,您不能使用全局区域中的 poolbind 命令将非全局区域中的单个进程绑定到其他池。要将非全局区域与池关联,请参见配置、检验并提交区域

请注意,如果您为池设置了调度类并将该池与非全局区域关联,则缺省情况下,此区域会使用此调度类。

如果使用动态资源池,则 poold 执行实例的范围限制为全局区域。

在非全局区域中运行的 poolstat 实用程序仅显示与该区域关联的池的相关信息。在非全局区域中运行的不带参数的 pooladm 命令仅显示与此区域关联的池的相关信息。

有关资源池命令的信息,请参见用于资源池功能的命令

何时使用池

资源池提供了一种通用机制,可应用于许多管理方案。

批处理计算服务器

使用池功能可以将一个服务器分为两个池。一个池由分时用户用于登录会话和交互式工作,另一个池用于通过批处理系统提交的作业。

应用程序或数据库服务器

根据交互式应用程序的要求对用于这些应用程序的资源进行分区。

分期启用应用程序

确定用户期望。

您最初可能将计算机部署为仅运行计算机最终应提供的服务的一部分。如果在计算机联机时未建立基于预留的资源管理机制,则用户可能会遇到问题。

例如,公平份额调度器会优化 CPU 使用率。仅运行一个应用程序时,计算机的响应速度可能会很快,但这仅是误导性的现象。如果装入多个应用程序,则用户将不会看到如此快的响应速度。通过为每个应用程序使用单独的池,您可以对可用于每个应用程序的 CPU 数设定一个上限,然后再部署所有的应用程序。

复杂分时服务器

对支持大量用户的服务器进行分区。对服务器进行分区提供了一种隔离机制,可使每个用户的响应更具可预测性。

通过将用户分为绑定到各个池的不同组,并使用公平份额调度 (fair share scheduling, FSS) 功能,您可以调整 CPU 分配以优先满足具有较高优先级的用户组。可以基于用户角色、记帐费用分摊等进行这种分配。

周期性改变的工作负荷

使用资源池适应变换的需求。

您的站点在工作负荷需求方面可能会出现长周期性(例如每月、每季度或每年)的可预测变化。如果您的站点出现这些变化,则可以通过从 cron 作业中调用 pooladm 在多个池配置之间进行切换。(请参见资源池框架。)

实时应用程序

使用 RT 调度程序和指定的处理器资源创建实时池。

系统使用率

执行建立的系统目标。

使用自动执行池守护进程这一功能识别可用的资源,然后监视工作负荷以检测何时不能再满足指定的目标。守护进程可以执行更正操作(如有可能),或者可以将情况记录下来。

资源池框架

/etc/pooladm.conf 配置文件说明了静态池配置。静态配置表示管理员根据资源池功能配置系统的方法。可以指定备用文件名。

当使用服务管理工具 (service management facility, SMF) 或 pooladm -e 命令启用资源池框架时,如果 /etc/pooladm.conf 文件存在,则将该文件中包含的配置应用到系统中。

内核包含有关资源池框架中资源部署的信息。这称为动态配置,它表示特定系统在某个时刻的资源池功能。可以使用 pooladm 命令查看动态配置。请注意,池和资源集的属性显示顺序可以改变。可按以下方法对动态配置进行修改:

可以存在多个静态池配置文件,在不同时间进行激活。您可以通过从 cron 作业中调用 pooladm 在多个池配置之间进行切换。有关 cron 实用程序的更多信息,请参见 cron(1M) 手册页。

缺省情况下,资源池框架不处于活动状态。必须启用资源池才能创建或修改动态配置。即使禁用了资源池框架,仍可以使用 poolcfglibpool 命令处理静态配置文件。如果池功能不处于活动状态,则无法创建静态配置文件。有关配置文件的更多信息,请参见创建池配置

以下手册页中描述了用于资源池和 poold 系统守护进程的命令:

/etc/pooladm.conf 内容

所有资源池配置(包括动态配置)都可以包含以下元素。

system

影响系统整体行为的属性

资源池定义

pset

处理器集定义

cpu

处理器定义

可以处理所有这些元素的属性,以更改资源池框架的状态和行为。例如,池属性 pool.importance 表示指定池的相对重要性。此属性用于可能的资源争用解决方案。有关更多信息,请参见 libpool(3LIB)

池属性

池功能支持可用于池、资源或组件的已命名的类型化属性。管理员可以存储各种池元素的其他属性。可以使用与项目属性类似的名称空间属性。

例如,以下注释表示指定的 pset 与特定的 Datatree 数据库关联。

Datatree,pset.dbname=warehouse

有关属性类型的其他信息,请参见poold 属性


注 –

许多特殊属性将保留供内部使用,不能进行设置或删除。有关更多信息,请参见 libpool(3LIB) 手册页。


在系统上实现池

通过下列方法之一可以在系统上实现用户定义的池。

有关启用和禁用资源池的信息,请参见启用和禁用池功能。如果正在使用用户自定义的池或资源,则不能禁用池功能。

要配置资源池,您必须拥有超级用户权限,或者在配置文件列表中拥有进程管理配置文件。系统管理员角色包括进程管理配置文件。

poold 资源控制器使用动态资源池功能来启动。

project.pool 属性

可以将 project.pool 属性添加到 /etc/project 文件中的项目条目,以便将单个池与该条目相关联。针对项目启动的新工作将绑定到相应的池。有关更多信息,请参见第 2 章

例如,您可以使用 projmod 命令为 /etc/project 文件中的项目 sales 设置 project.pool 属性:


# projmod -a -K project.pool=mypool sales

SPARC: 动态重新配置操作和资源池

通过动态重新配置 (Dynamic Reconfiguration, DR),可以在系统运行的同时重新配置硬件。DR 操作可以增大、减小对指定资源类型的影响,或者对其没有任何影响。由于 DR 会影响可用的资源量,因此,这些操作中必须包括池功能。启动 DR 操作之后,池框架便会执行操作以验证配置。

如果 DR 操作可以继续而不会导致当前池配置变为无效,则会更新专用配置文件。无效配置是指可用资源无法支持的配置。

如果 DR 操作导致池配置无效,则操作会失败,并且系统会通过向消息日志发送消息来通知您。如果您要强制完成配置,则必须使用 DR 强制选项。池配置然后会修改以符合新的资源配置。有关 DR 进程和强制选项的信息,请参见 Sun 硬件的动态重新配置用户指南。

如果使用动态资源池,请注意当 poold 守护进程处于活动状态时,分区可能不受该守护进程控制。有关更多信息,请参见识别资源不足

创建池配置

配置文件中包含要在系统上创建的池的说明。此文件描述了可以处理的元素。

有关要处理的元素的更多信息,请参见 poolcfg(1M)

启用池之后,您可以通过两种方法创建结构化的 /etc/pooladm.conf 文件。

使用 poolcfglibpool 可以修改 /etc/pooladm.conf 文件。请勿直接编辑此文件。

直接处理动态配置

可以使用带有 -d 选项的 poolcfg 命令直接在动态配置中处理 CPU 资源类型。可以使用两种方法传送资源。

有关示例,请参见传送资源

请注意,资源传送可能会触发 poold 执行操作。有关更多信息,请参见poold 概述

poold 概述

池资源控制器 poold 使用系统目标和可查看的统计信息,来保持您指定的系统性能目标。当需要动态分配资源时,此系统守护进程应始终处于活动状态。

poold 资源控制器先识别可用资源,再监视工作负荷,以确定不再满足系统使用率目标的时刻。然后,poold 根据目标考虑其他配置,并采取补救措施。如有可能,会重新配置资源以满足目标。如果无法执行此操作,则守护进程会记录不能再实现用户指定的目标。重新配置之后,守护进程恢复监视工作负荷目标。

poold 将维护它可以检查的决策历史记录。决策历史记录用于避免再次使用以前未带来任何改进的配置。

请注意,如果更改工作负荷目标或修改可用于系统的资源,还可以异步触发重新配置。

管理动态资源池

DRP 服务由服务管理工具 (service management facility, SMF) 管理,其服务标识符为 svc:/system/pools/dynamic

可以使用 svcadm 命令对此服务执行管理操作,如启用、禁用或请求重新启动。可以使用 svcs 命令查询服务状态。有关更多信息,请参见 svcs(1)svcadm(1M) 手册页。

SMF 接口是控制 DRP 的首选方法,但对于向后兼容性,还可使用以下方法。

配置约束和目标

更改配置时,poold 会针对您提供的指示执行操作。可以将这些指示指定为一系列约束和目标。poold 根据您指定的内容,来确定其他可能配置相对于现有配置的相对值。然后,poold 更改当前配置的资源分配,以生成新的候选配置。

配置约束

约束通过排除某些可能会对配置进行的潜在更改来影响可能配置的范围。在 libpool 配置中指定的以下约束均可用。

有关池属性的更多信息,请参见 libpool(3LIB) 手册页和池属性

pset.minpset.max 属性约束

这两个属性用于限制可以为处理器集分配的最小和最大处理器数。有关这些属性的更多详细信息,请参见表 12–1

在遵守这些约束的情况下,可以将资源分区的资源分配给同一 Solaris 实例中的其他资源分区。通过将资源绑定到与资源集关联的池,可获取对此资源的访问权限。绑定可以在登录时执行,也可以由拥有 PRIV_SYS_RES_CONFIG 权限的管理员手动执行。

cpu.pinned 属性约束

cpu-pinned 属性指明,DRP 不应从特定 CPU 所在的处理器集中移动该 CPU。您可以设置此 libpool 属性,以最大化在处理器集中执行的特定应用程序的高速缓存利用率。

有关此属性的更多详细信息,请参见表 12–1

pool.importance 属性约束

pool.importance 属性描述了池的相对重要性,该重要性由管理员定义。

配置目标

目标的指定方式与约束类似。表 12–1 中记录了完整的一组目标。

有两种类别的目标。

与工作负荷有关

与工作负荷有关的目标是指将随系统上运行的工作负荷的性质而变化的目标。utilization 目标便是一个示例。资源集的使用率数字将随此集中的活动工作负荷的性质而变化。

与工作负荷无关

与工作负荷无关的目标是指不会随系统上运行的工作负荷的性质而变化的目标。CPU locality 目标便是一个示例。资源集邻近性的评估标准不随此集中的活动工作负荷的性质而变化。

您可以定义三种类型的目标。

名称 

有效元素 

运算符 

值 

wt-load

system

N/A 

N/A 

locality

pset

N/A 

loose | tight | none

utilization

pset

< > ~

0100%

目标存储在 libpool 配置内的属性字符串中。这些属性名如下所示:

目标的语法如下:

所有目标都有可选的重要性前缀。重要性用作目标的乘数,因此可增加它对目标函数评估的影响程度。范围从 0 到 INT64_MAX (9223372036854775807)。如果未指定,则缺省的重要性值为 1

某些元素类型支持多种目标类型。pset 便是一个示例。您可以为这些元素指定多种目标类型,还可以针对单个 pset 元素指定多个使用率目标。

有关使用情况的示例,请参见如何定义配置目标

wt-load 目标

wt-load 目标优先考虑资源分配与资源使用率匹配的配置。当此目标处于活动状态时,将为使用多个资源的资源集提供更多资源。wt-load 表示加权负载

使用此目标的前提是:满足使用最小和最大值属性建立的约束,并希望守护进程在遵守这些约束的情况下自由处理资源。

locality 目标

locality 目标会影响由地址组 (lgroup) 数据度量的邻近性对选定配置的影响。邻近性的另一个定义是延迟。lgroup 描述了 CPU 资源和内存资源。Solaris 系统使用 lgroup 以时间为度量值来确定资源之间的距离。有关地址组摘要的更多信息,请参见《编程接口指南》中的“地址组概述”

此目标可采用以下三个值之一:

tight

如果设置,则优先考虑最大化资源邻近性的配置。

loose

如果设置,则优先考虑最小化资源邻近性的配置。

none

如果设置,则优先考虑配置时不受资源邻近性的影响。这是 locality 目标的缺省值。

通常,locality 目标应设置为 tight。但是,为了最大化内存带宽或最小化 DR 操作对资源集的影响,可以将此目标设置为 loose,也可以使其保留缺省设置 none

utilization 目标

utilization 目标优先考虑将资源分配给未满足指定使用率目标的分区的配置。

此目标使用运算符和值来指定。运算符如下:

<

“小于”运算符表明指定的值为最大目标值。

>

“大于”运算符表明指定的值为最小目标值。

~

“约等于”运算符表明指定的值是可在一定程度上上下浮动的目标值。

对于每种运算符类型,pset 只能设置一个 utilization 目标。

您可以同时设置 <> 运算符来创建一个范围。要验证值以确保它们不重叠。

配置目标示例

在以下示例中,poold 将为 pset 评估这些目标:


示例 12–1 poold 目标示例

pset.poold.objectives "utilization > 30; utilization < 80; locality tight"


有关其他使用情况的示例,请参见如何定义配置目标

poold 属性

有四种类别的属性:

表 12–1 定义的属性名

属性名 

类型 

类别 

说明 

system.poold.log-level

字符串 

配置 

日志级别 

system.poold.log-location

字符串 

配置 

日志位置 

system.poold.monitor-interval

uint64 

配置 

监视抽样间隔 

system.poold.history-file

字符串 

配置 

决策历史记录的位置 

pset.max

uint64 

约束 

此处理器集的最大 CPU 数 

pset.min

uint64 

约束 

此处理器集的最小 CPU 数 

cpu.pinned

布尔型 

约束 

固定到此处理器集的 CPU 

system.poold.objectives

字符串 

目标 

遵循 poold 的目标表达式语法的格式化字符串

pset.poold.objectives

字符串 

目标 

遵循 poold 的表达式语法的格式化字符串

pool.importance

int64 

目标参数 

用户指定的重要性 

可配置的 poold 功能

您可以对守护进程行为的以下方面进行配置。

这些选项在池配置中指定。您也可以通过调用 poold,从命令行控制日志级别。

poold 监视间隔

使用属性名 system.poold.monitor-interval 可以指定以毫秒为单位的值。

poold 日志信息

通过日志可提供三种类别的信息。日志中标识了这些类:

使用属性名 system.poold.log-level 可以指定日志参数。如果未指定此属性,则缺省的日志级别为 NOTICE。参数级别具有层次结构。设置 DEBUG 的日志级别会让 poold 记录所有定义的消息。INFO 级别为多数管理员提供了有用的信息平衡。

您可以使用带有 -l 选项的 poold 命令以及参数在命令行中指定生成的日志信息级别。

以下参数为可用参数:

参数级别直接映射到其 syslog 对等项上。有关使用 syslog 的更多信息,请参见日志位置

有关如何配置 poold 日志的更多信息,请参见如何设置 poold 日志级别

配置信息日志

可以生成以下类型的消息:

ALERT

访问 libpool 配置时出现的问题,或者是 libpool 功能的其他一些基本、无法预测的故障。它会导致守护进程退出,需要管理员立即关注。

CRIT

由于无法预测的故障产生的问题。它会导致守护进程退出,需要管理员立即关注。

ERR

用于控制操作的用户指定参数出现的问题,如资源集的相互冲突且无法解决的使用率目标。需要管理性介入来更正目标。poold 尝试通过忽略相冲突的目标来采取补救措施,但有些错误会导致守护进程退出。

WARNING

与配置参数的设置相关的警告,即使从技术角度来说是正确的,但可能不适合指定的执行环境。例如将所有 CPU 资源标记为固定,这意味着 poold 不能在处理器集之间移动 CPU 资源。

DEBUG

包含进行配置调试时所需详细信息的消息。通常情况下,管理员不使用此信息。

监视信息日志

可以生成以下类型的消息:

CRIT

由于无法预测的监视故障产生的问题。它会导致守护进程退出,需要管理员立即关注。

ERR

由于无法预测的监视错误产生的问题。可请管理员来干预和更正。

NOTICE

有关资源控制区转换的消息。

INFO

有关资源使用率统计信息的消息。

DEBUG

包含进行监视调试时所需详细信息的消息。通常情况下,管理员不使用此信息。

优化信息日志

可以生成以下类型的消息:

WARNING

可显示有关做出最佳决策的问题的消息。例如可能包括受最小值和最大值或固定的组件数严格约束的资源集。

可显示与执行最佳分配时由于无法预测的限制而产生的问题相关的消息。例如从包含绑定资源使用者的处理器集上移除最后一个处理器。

NOTICE

可显示有关可用配置或由于会覆盖决策历史记录而未能实现的配置的消息。

INFO

可显示有关可考虑的备用配置的消息。

DEBUG

包含进行优化调试时所需详细信息的消息。通常情况下,管理员不使用此信息。

日志位置

system.poold.log-location 属性用于指定 poold 记录的输出的位置。您可以为 poold 输出指定 SYSLOG 的位置(请参见 syslog(3C))。

如果未指定此属性,则 poold 记录的输出的缺省位置为 /var/log/pool/poold

当从命令行调用 poold 时,不使用此属性。日志条目将写入发出调用的终端上的 stderr

使用 logadm 管理日志

如果 poold 处于活动状态,则 logadm.conf 文件将包含管理缺省文件 /var/log/pool/poold 的条目。此条目为:

/var/log/pool/poold -N -s 512k

请参见 logadm(1M) 和 logadm.conf(4) 手册页。

动态资源分配如何工作

本节介绍了 poold 用来动态分配资源的进程和因素。

关于可用资源

可用资源即为可在 poold 进程的范围内使用的所有资源。控制的范围最多为一个 Solaris 实例。

在启用区域的系统上,poold 执行实例的范围限制为全局区域。

确定可用资源

资源池包含可供应用程序使用的所有系统资源。

对一个单独执行的 Solaris 实例来说,必须将单一类型的资源(如 CPU)分配到单个分区上。对于每种资源类型,可以有一个或多个分区。每个分区包含一个唯一的资源集。

例如,装有四个 CPU 和两个处理器集的计算机可以具有以下设置:

pset 0: 0 1

pset 1: 2 3

其中,冒号后的 0、1、2 和 3 表示 CPU ID。请注意,这两个处理器集包含了所有四个 CPU。

同样的计算机不能具有以下设置:

pset 0: 0 1

pset 1: 1 2 3

不能使用这种设置,因为 CPU 1 一次只能出现在一个 pset 中。

不能从资源所属分区以外的任何分区来访问资源。

要搜索可用资源,poold 需要询问活动池的配置来查找分区。所有分区内的所有资源的总和决定所控制的每种资源类型的可用资源总量。

此资源量是 poold 操作过程中使用的基本数字。但是,对此数字存在一些约束,限制了 poold 在进行分配时的灵活性。有关可用约束的信息,请参见配置约束

识别资源不足

poold 的控制范围定义为 poold 对其有效分区和管理具有主要责任的可用资源集。但是,其他可在此控制范围内处理资源的机制仍会影响配置。如果在 poold 处于活动状态时某个分区不受控制,则 poold 会尝试通过对可用资源的审慎操作来恢复控制。如果 poold 在其范围内无法找到其他资源,则守护进程将记录有关资源不足的信息。

确定资源利用率

poold 通常情况下会使用最多的时间在其控制范围内观察资源的使用情况。执行这种监视是为了验证是否满足了与工作负荷有关的目标。

例如,对于处理器集来说,在此集中的所有处理器都会进行度量。资源利用率显示了在抽样间隔内资源被使用的时间比例。资源利用率显示为 0 到 100 的百分比。

识别控制违规

配置约束和目标中所述的指令用于检测系统即将出现的进而无法满足其目标的故障。这些目标与工作负荷直接相关。

未满足用户配置目标的分区即为控制违规。控制违规的两种类型为同步违规和异步违规。

以下事件将导致异步目标违规:

假定与工作负荷无关的目标的影响在目标函数的评估期间保持不变。与工作负荷无关的目标仅在其中一个异步违规触发重新评估时才会再次评估。

确定适当的补救措施

当资源控制器确定某个资源使用者的资源不足时,第一反应就是增加资源以改善性能。

此时将检查并评估在控制范围的配置中指定的满足目标的备用配置。

由于针对响应监视了变化的资源并评估了每个资源分区,因此,此进程会随着时间不断完善。可参阅决策历史记录,以避免再次使用过去在获取目标函数方面未带来任何改进的配置。其他信息(如进程名称和数量)用于进一步评估历史数据的实用性。

如果守护进程不能进行更正操作,则会记录此情况。有关更多信息,请参见poold 日志信息

使用 poolstat 监视池功能和资源利用率

poolstat 实用程序用于在系统上启用池的情况下监视资源利用率。此实用程序会重复检查系统上所有活动的池,并基于选定的输出模式来报告统计信息。通过 poolstat 统计信息,您可以确定哪些资源分区过度使用。您可以分析这些统计信息,做出有关在系统处于资源压力下时资源重新分配的决策。

poolstat 实用程序包括可用于检查特定池并报告资源集特定的统计信息的选项。

如果您在系统上实现区域并且在非全局区域中使用 poolstat,则会显示有关与此区域的池关联的资源的信息。

有关 poolstat 实用程序的更多信息,请参见 poolstat(1M) 手册页。有关 poolstat 任务和使用情况的信息,请参见使用 poolstat 报告与池相关的资源统计信息

poolstat 输出

在缺省输出格式下,poolstat 会输出一个标题行,然后为每个池显示一行信息。池信息行以池 ID 和池名称开头,后接一列连接到池上的处理器集的统计数据。附加在多个池上的资源集将多次显示,一次显示一个池的资源集。

列标题如下:

id

池 ID。

pool

池名。

rid

资源集 ID。

rset

资源集名。

type

资源集类型。

min

资源集大小的最小值。

max

资源集大小的最大值。

size

当前资源集大小。

used

当前资源集使用量的度量。

此使用量的计算方法为资源集的利用率百分比乘以资源集大小。如果资源集在上次抽样间隔期间已重新配置,则可能不报告该值。未报告的值以连字符 (-) 的形式出现。

load

资源集上的负荷的完全表示。

有关此属性的更多信息,请参见 libpool(3LIB) 手册页。

您可以在 poolstat 输出中指定以下内容:

调整 poolstat 操作间隔

您可以自定义 poolstat 执行的操作。您可以设置报告的抽样间隔并指定统计信息重复的次数。

interval

调整 poolstat 执行的定期操作的间隔。所有间隔都以秒为单位指定。

count

指定统计信息重复的次数。缺省情况下,poolstat 仅报告一次统计信息。

如果未指定 intervalcount,则报告一次统计信息。如果指定了 interval 而未指定 count,则会无限次地报告统计信息。

用于资源池功能的命令

下表中介绍的命令提供了池功能的主要管理接口。有关在启用了区域的系统上使用这些命令的信息,请参见区域中使用的资源池

手册页参考 

说明 

pooladm(1M)

在系统上启用或禁用池功能。激活特定配置或删除当前配置,并将关联的资源返回到其缺省状态。如果在不带选项的情况下运行,则 pooladm 会显示当前的动态池配置。

poolbind(1M)

启用手动绑定功能,将项目、任务和进程绑定到资源池中。 

poolcfg(1M)

提供对池和集的配置操作。使用此工具创建的配置通过使用 pooladm 在目标主机上进行实例化。

如果带 c 选项的 -info 子命令参数运行,则 poolcfg 会显示有关 /etc/pooladm.conf 中的静态配置的信息。如果添加了一个文件名参数,则此命令将显示有关命名文件中包含的静态配置的信息。例如,poolcfg -c info /tmp/newconfig 会显示有关 /tmp/newconfig 文件中包含的静态配置的信息。

poold(1M)

池系统守护进程。此守护进程使用系统目标和可查看的统计信息来达到管理员指定的系统性能目标。如果在未满足目标的情况下无法进行更正操作,则 poold 将记录此情况。

poolstat(1M)

显示与池相关的资源统计信息。简化性能分析并为系统管理员提供资源分区和重新分区任务方面的支持信息。提供了一些选项来检查指定的池并报告资源集特定的统计信息。 

库 API 由 libpool 提供(请参见 libpool(3LIB) 手册页)。程序可使用库来处理池配置。

第 13 章 创建和管理资源池(任务)

本章介绍如何设置和管理系统上的资源池。

有关资源池的背景信息,请参见第 12 章

管理动态资源池(任务图)

任务 

说明 

参考 

启用或禁用资源池。 

激活或禁用系统上的资源池。 

启用和禁用池功能

启用或禁用动态资源池。 

激活或禁用系统上的动态资源池功能。 

启用和禁用池功能

创建静态资源池配置。 

创建与当前动态配置相匹配的静态配置文件。有关更多信息,请参见资源池框架

如何创建静态配置

修改资源池配置。 

修改系统上的池配置(例如通过创建其他池)。 

如何修改配置

将资源池与调度类关联。 

将池与调度类关联,以便所有绑定到该池的进程都使用指定的调度程序。 

如何将池与调度类关联

设置配置约束和定义配置目标。 

poold 指定目标以考虑何时执行更正操作。有关配置目标的更多信息,请参见poold 概述

如何设置配置约束如何定义配置目标

设置日志级别。 

指定 poold 生成的日志信息的级别。

如何设置 poold 日志级别

通过 poolcfg 命令使用文本文件。

poolcfg 命令可以从文本文件提取输入。

如何通过 poolcfg 使用命令文件

在内核中传送资源。 

在内核中传送资源。例如,将具有特定 ID 的资源传送到目标集。 

传送资源

激活池配置。 

激活缺省配置文件中的配置。 

如何激活池配置

在提交池配置之前验证此配置。 

验证池配置,以测试验证时将发生的情况。 

如何在提交配置之前验证配置

删除系统中的池配置。 

将所有关联的资源(如处理器集)返回到其缺省状态。 

如何删除池配置

将进程绑定到池。 

手动将系统上运行的进程与资源池关联。 

如何将进程绑定到池

将任务或项目绑定到池。 

将任务或项目与资源池关联。 

如何将任务或项目绑定到池

将新进程绑定到资源池。 

要将项目中的新进程自动绑定到指定的池,请向 project 数据库中的每个条目添加一个属性。

如何设置项目的 project.pool 属性

使用 project 属性将进程绑定到其他池。

修改已启动的新进程的池绑定。 

如何使用 project 属性将进程绑定到其他池

使用 poolstat 实用程序生成报告。

在指定的间隔生成多个报告。 

按特定间隔生成多个报告

报告资源集统计信息。 

使用 poolstat 实用程序报告 pset 资源集的统计信息。

报告资源集统计信息

启用和禁用池功能

从 Solaris 10 11/06 发行版开始,您可以使用 svcadm(1M) 手册页中所述的 svcadm 命令在系统中启用和禁用资源池和动态资源池服务。

您还可以使用 pooladm(1M) 手册页中所述的 pooladm 命令执行以下任务:


注 –

在升级系统时,如果启用了资源池框架,而且 /etc/pooladm.conf 文件存在,则池服务将被启用,该文件中包含的配置将应用到系统中。


ProcedureSolaris 10 11/06 及更高版本:如何使用 svcadm 启用资源池服务

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 启用资源池服务。


    # svcadm enable system/pools:default
    

ProcedureSolaris 10 11/06 及更高版本:如何使用 svcadm 禁用资源池服务

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 禁用资源池服务。


    # svcadm disable system/pools:default
    

ProcedureSolaris 10 11/06 及更高版本:如何使用 svcadm 启用动态资源池服务

  1. 成为超级用户,或者承担包括服务管理权限配置文件的角色。

    角色包含授权和具有一定权限的命令。有关如何创建该角色并将其指定给用户的信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”和《系统管理指南:安全性服务》中的“管理 RBAC(任务列表)”。

  2. 启用动态资源池服务。


    # svcadm enable system/pools/dynamic:default
    

示例 13–1 动态资源池服务对资源池服务的依赖性

本示例表明,如果要运行 DRP,则必须首先启用资源池。

资源池和动态资源池之间存在相关性。DRP 现在是资源池的一项相关服务。DRP 可以独立于资源池单独启用和禁用。

以下显示表明,当前已禁用了资源池和动态资源池:


# svcs *pool*
STATE          STIME    FMRI
disabled       10:32:26 svc:/system/pools/dynamic:default
disabled       10:32:26 svc:/system/pools:default

启用动态资源池:


# svcadm enable svc:/system/pools/dynamic:default
# svcs -a | grep pool
disabled       10:39:00 svc:/system/pools:default
offline        10:39:12 svc:/system/pools/dynamic:default

请注意,DRP 服务仍处于脱机状态。

可使用 svcs 命令的 -x 选项确定 DRP 服务处于脱机状态的原因:


# svcs -x *pool*
svc:/system/pools:default (resource pools framework)
 State: disabled since Wed 25 Jan 2006 10:39:00 AM GMT
Reason: Disabled by an administrator.
   See: http://sun.com/msg/SMF-8000-05
   See: libpool(3LIB)
   See: pooladm(1M)
   See: poolbind(1M)
   See: poolcfg(1M)
   See: poolstat(1M)
   See: /var/svc/log/system-pools:default.log
Impact: 1 dependent service is not running.  (Use -v for list.)

svc:/system/pools/dynamic:default (dynamic resource pools)
 State: offline since Wed 25 Jan 2006 10:39:12 AM GMT
Reason: Service svc:/system/pools:default is disabled.
   See: http://sun.com/msg/SMF-8000-GE
   See: poold(1M)
   See: /var/svc/log/system-pools-dynamic:default.log
Impact: This service is not running.

启用资源池服务,以便 DRP 服务可以运行:


# svcadm enable svc:/system/pools:default

在使用 svcs *pool* 命令时,系统将显示如下内容:


# svcs *pool*
STATE          STIME    FMRI
online         10:40:27 svc:/system/pools:default
online         10:40:27 svc:/system/pools/dynamic:default


示例 13–2 资源池服务禁用时对动态资源池的影响

如果这两种服务都联机,并且您禁用了资源池服务:


# svcadm disable svc:/system/pools:default 

在使用 svcs *pool* 命令时,系统将显示如下内容:


# svcs *pool*
STATE          STIME    FMRI
disabled       10:41:05 svc:/system/pools:default
online         10:40:27 svc:/system/pools/dynamic:default
# svcs *pool*
STATE          STIME    FMRI
disabled       10:41:05 svc:/system/pools:default
online         10:40:27 svc:/system/pools/dynamic:default

但最终,DRP 服务将转入 offline,原因是资源池服务已被禁用:


# svcs *pool*
STATE          STIME    FMRI
disabled       10:41:05 svc:/system/pools:default
offline        10:41:12 svc:/system/pools/dynamic:default

确定 DRP 服务处于脱机状态的原因:


# svcs -x *pool*
svc:/system/pools:default (resource pools framework)
 State: disabled since Wed 25 Jan 2006 10:41:05 AM GMT
Reason: Disabled by an administrator.
   See: http://sun.com/msg/SMF-8000-05
   See: libpool(3LIB)
   See: pooladm(1M)
   See: poolbind(1M)
   See: poolcfg(1M)
   See: poolstat(1M)
   See: /var/svc/log/system-pools:default.log
Impact: 1 dependent service is not running.  (Use -v for list.)

svc:/system/pools/dynamic:default (dynamic resource pools)
 State: offline since Wed 25 Jan 2006 10:41:12 AM GMT
Reason: Service svc:/system/pools:default is disabled.
   See: http://sun.com/msg/SMF-8000-GE
   See: poold(1M)
   See: /var/svc/log/system-pools-dynamic:default.log
Impact: This service is not running.

必须启动资源池,DRP 才能工作。例如,可以使用带有 -e 选项的 pooladm 命令来启动资源池:


# pooladm -e

然后,svcs *pool* 命令显示以下内容:


# svcs *pool*
STATE          STIME    FMRI
online         10:42:23 svc:/system/pools:default
online         10:42:24 svc:/system/pools/dynamic:default

ProcedureSolaris 10 11/06 及更高版本:如何使用 svcadm 禁用动态资源池服务

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 禁用动态资源池服务。


    # svcadm disable system/pools/dynamic:default
    

Procedure如何使用 pooladm 启用资源池

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 启用池功能。


    # pooladm -e
    

Procedure如何使用 pooladm 禁用资源池

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 禁用池功能。


    # pooladm -d
    

配置池

Procedure如何创建静态配置

/usr/sbin/pooladm 使用 -s 选项可以创建与当前动态配置相匹配的静态配置文件。如果没有指定其他文件名,则使用缺省位置 /etc/pooladm.conf

使用带有 -c 选项的 pooladm 命令提交配置。然后,使用带有 -s 选项的 pooladm 命令更新静态配置,以便与动态配置的状态相匹配。


注 –

创建与动态配置相匹配的新配置时,应优先使用新功能 pooladm -s,再考虑使用以前的功能 poolcfg -c discover


开始之前

在系统上启用池。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 更新静态配置文件,以便与当前动态配置相匹配。


    # pooladm -s
    
  3. 查看可读形式的配置文件的内容。

    请注意,配置中包含系统创建的缺省元素。


    # poolcfg -c info
    system tester
            string  system.comment
            int     system.version 1
            boolean system.bind-default true
            int     system.poold.pid 177916
    
            pool pool_default
                    int     pool.sys_id 0
                    boolean pool.active true
                    boolean pool.default true
                    int     pool.importance 1
                    string  pool.comment 
                    pset    pset_default
    
            pset pset_default
                    int     pset.sys_id -1
                    boolean pset.default true
                    uint    pset.min 1
                    uint    pset.max 65536
                    string  pset.units population
                    uint    pset.load 10
                    uint    pset.size 4
                    string  pset.comment 
                    boolean testnullchanged true
    
                    cpu
                            int     cpu.sys_id 3
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 2
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 1
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 0
                            string  cpu.comment 
                            string  cpu.status on-line
  4. 提交 /etc/pooladm.conf 中的配置。


    # pooladm -c
    
  5. (可选)要将动态配置复制到名为 /tmp/backup 的静态配置文件,请键入以下命令:


    # pooladm -s /tmp/backup
    

Procedure如何修改配置

要增强配置,请创建名为 pset_batch 的处理器集以及名为 pool_batch 的池。然后,使用关联连接池和处理器集。

请注意,必须用引号将包含空格的子命令参数括起来。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 创建处理器集 pset_batch


    # poolcfg -c 'create pset pset_batch (uint pset.min = 2; uint pset.max = 10)'
    
  3. 创建池 pool_batch


    # poolcfg -c 'create pool pool_batch'
    
  4. 使用关联连接池和处理器集。


    # poolcfg -c 'associate pool pool_batch (pset pset_batch)'
    
  5. 显示已编辑的配置。


    # poolcfg -c info
    system tester
            string  system.comment kernel state
            int     system.version 1
            boolean system.bind-default true
            int     system.poold.pid 177916
    
            pool pool_default
                    int     pool.sys_id 0
                    boolean pool.active true
                    boolean pool.default true
                    int     pool.importance 1
                    string  pool.comment 
                    pset    pset_default
    
            pset pset_default
                    int     pset.sys_id -1
                    boolean pset.default true
                    uint    pset.min 1
                    uint    pset.max 65536
                    string  pset.units population
                    uint    pset.load 10
                    uint    pset.size 4
                    string  pset.comment 
                    boolean testnullchanged true
    
                    cpu
                            int     cpu.sys_id 3
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 2
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 1
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 0
                            string  cpu.comment 
                            string  cpu.status on-line
    
            pool pool_batch
                    boolean pool.default false
                    boolean pool.active true
                    int pool.importance 1
                    string pool.comment
                    pset pset_batch
    
            pset pset_batch
                    int pset.sys_id -2
                    string pset.units population
                    boolean pset.default true
                    uint pset.max 10
                    uint pset.min 2
                    string pset.comment
                    boolean pset.escapable false
                    uint pset.load 0
                    uint pset.size 0
    
                    cpu
                            int     cpu.sys_id 5
                            string  cpu.comment
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 4
                            string  cpu.comment
                            string  cpu.status on-line
  6. 提交 /etc/pooladm.conf 中的配置。


    # pooladm -c
    
  7. (可选)要将动态配置复制到名为 /tmp/backup 的静态配置文件,请键入以下命令:


    # pooladm -s /tmp/backup
    

Procedure如何将池与调度类关联

您可以将池与调度类关联,以便所有绑定到该池的进程都可以使用此调度程序。为此,请将 pool.scheduler 属性设置为调度程序的名称。以下示例将池 pool_batch 与公平份额调度器 (fair share scheduler, FSS) 关联。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关如何创建该角色并将其指定给用户的信息,请参见《系统管理指南:安全性服务》中的“管理 RBAC(任务列表)”。

  2. 修改池 pool_batch 以便与 FSS 关联。


    # poolcfg -c 'modify pool pool_batch (string pool.scheduler="FSS")'
    
  3. 显示已编辑的配置。


    # poolcfg -c info
    system tester
            string  system.comment
            int     system.version 1
            boolean system.bind-default true
            int     system.poold.pid 177916
    
            pool pool_default
                    int     pool.sys_id 0
                    boolean pool.active true
                    boolean pool.default true
                    int     pool.importance 1
                    string  pool.comment 
                    pset    pset_default
    
            pset pset_default
                    int     pset.sys_id -1
                    boolean pset.default true
                    uint    pset.min 1
                    uint    pset.max 65536
                    string  pset.units population
                    uint    pset.load 10
                    uint    pset.size 4
                    string  pset.comment 
                    boolean testnullchanged true
    
                    cpu
                            int     cpu.sys_id 3
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 2
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 1
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 0
                            string  cpu.comment 
                            string  cpu.status on-line
    
            pool pool_batch
                    boolean pool.default false
                    boolean pool.active true
                    int pool.importance 1
                    string pool.comment
                    string pool.scheduler FSS
                    pset batch
    
            pset pset_batch
                    int pset.sys_id -2
                    string pset.units population
                    boolean pset.default true
                    uint pset.max 10
                    uint pset.min 2
                    string pset.comment
                    boolean pset.escapable false
                    uint pset.load 0
                    uint pset.size 0
    
                    cpu
                            int     cpu.sys_id 5
                            string  cpu.comment
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 4
                            string  cpu.comment
                            string  cpu.status on-line
  4. 提交 /etc/pooladm.conf 中的配置:


    # pooladm -c
    
  5. (可选)要将动态配置复制到名为 /tmp/backup 的静态配置文件,请键入以下命令:


    # pooladm -s /tmp/backup
    

Procedure如何设置配置约束

约束通过删除一些可能会对配置进行的潜在更改来影响可能配置的范围。此过程显示如何设置 cpu.pinned 属性。

在以下示例中,cpuid 是一个整数。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 修改静态或动态配置中的 cpu.pinned 属性:

    • 修改引导时(静态)配置:


      # poolcfg -c 'modify cpu <cpuid> (boolean cpu.pinned = true)'
      
    • 不修改引导时配置而修改运行(动态)配置:


      # poolcfg -dc 'modify cpu <cpuid> (boolean cpu.pinned = true)'
      

Procedure如何定义配置目标

您可以为 poold 指定目标,以考虑何时执行更正操作。

在以下过程中,将设置 wt-load 目标,以便 poold 尝试将资源分配与资源利用率相匹配。禁用 locality 目标有助于实现此配置目标。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 修改系统 tester 以优先考虑 wt-load 目标。


    # poolcfg -c 'modify system tester (string system.poold.objectives="wt-load")'
    
  3. 禁用缺省处理器集的 locality 目标。


    # poolcfg -c 'modify pset pset_default (string pset.poold.objectives="locality none")'
    
  4. 禁用 pset_batch 处理器集的 locality 目标。


    # poolcfg -c 'modify pset pset_batch (string pset.poold.objectives="locality none")'
    
  5. 显示已编辑的配置。


    # poolcfg -c info
    system tester
            string  system.comment
            int     system.version 1
            boolean system.bind-default true
            int     system.poold.pid 177916
            string  system.poold.objectives wt-load
    
            pool pool_default
                    int     pool.sys_id 0
                    boolean pool.active true
                    boolean pool.default true
                    int     pool.importance 1
                    string  pool.comment 
                    pset    pset_default
    
            pset pset_default
                    int     pset.sys_id -1
                    boolean pset.default true
                    uint    pset.min 1
                    uint    pset.max 65536
                    string  pset.units population
                    uint    pset.load 10
                    uint    pset.size 4
                    string  pset.comment 
                    boolean testnullchanged true
                    string  pset.poold.objectives locality none
    
                    cpu
                            int     cpu.sys_id 3
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 2
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 1
                            string  cpu.comment 
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 0
                            string  cpu.comment 
                            string  cpu.status on-line
    
            pool pool_batch
                    boolean pool.default false
                    boolean pool.active true
                    int pool.importance 1
                    string pool.comment
                    string pool.scheduler FSS
                    pset batch
    
            pset pset_batch
                    int pset.sys_id -2
                    string pset.units population
                    boolean pset.default true
                    uint pset.max 10
                    uint pset.min 2
                    string pset.comment
                    boolean pset.escapable false
                    uint pset.load 0
                    uint pset.size 0
                    string  pset.poold.objectives locality none
    
                    cpu
                            int     cpu.sys_id 5
                            string  cpu.comment
                            string  cpu.status on-line
    
                    cpu
                            int     cpu.sys_id 4
                            string  cpu.comment
                            string  cpu.status on-line
  6. 提交 /etc/pooladm.conf 中的配置。


    # pooladm -c
    
  7. (可选)要将动态配置复制到名为 /tmp/backup 的静态配置文件,请键入以下命令:


    # pooladm -s /tmp/backup
    

Procedure如何设置 poold 日志级别

要指定 poold 生成的日志信息的级别,请在 poold 配置中设置 system.poold.log-level 属性。poold 配置保存在 libpool 配置中。有关信息,请参见poold 日志信息以及 poolcfg(1M)libpool(3LIB) 手册页。

您还可以在命令行中使用 poold 命令,以指定 poold 生成的日志信息的级别。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用带有 -l 选项以及参数(如 INFO)的 poold 命令设置日志级别。


    # /usr/lib/pool/poold -l INFO
    

    有关可用参数的信息,请参见poold 日志信息。缺省日志级别为 NOTICE

Procedure如何通过 poolcfg 使用命令文件

带有 -f 选项的 poolcfg 命令可以从包含 -c 选项的 poolcfg 子命令参数的文本文件提取输入。此方法适用于要执行一组操作的情况。当处理多个命令时,仅在所有命令都成功的情况下才会更新配置。对于庞大或复杂的配置,此技术比调用每个子命令更有用。

请注意,在命令文件中,# 字符用作注释标记,表示其后面的内容为注释。

  1. 创建输入文件 poolcmds.txt


    $ cat > poolcmds.txt
    create system tester
    create pset pset_batch (uint pset.min = 2; uint pset.max = 10)
    create pool pool_batch
    associate pool pool_batch (pset pset_batch)
    
  2. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关如何创建该角色并将其指定给用户的信息,请参见《系统管理指南:安全性服务》中的“管理 RBAC”。

  3. 执行命令:


    # /usr/sbin/poolcfg -f poolcmds.txt
    

传送资源

使用 poolcfg(带有 -d 选项)的 -c 选项的 transfer 子命令参数可以在内核中传送资源。-d 选项指定此命令直接对内核执行操作,而不从文件提取输入。

以下过程将两个 CPU 从内核中的处理器集 pset1 移动到处理器集 pset2

Procedure如何在处理器集之间移动 CPU

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 将两个 CPU 从 pset1 移动到 pset2

    可以按任意顺序使用 fromto 子句。每个命令只支持一个 tofrom 子句。


    # poolcfg -dc 'transfer 2 from pset pset1 to pset2'
    

示例 13–3 在处理器集之间移动 CPU 的替换方法

如果要传送资源类型的特定已知 ID,请提供其他语法。例如,以下命令为 pset_large 处理器集指定 ID 分别为 02 的两个 CPU:


# poolcfg -dc "transfer to pset pset_large (cpu 0; cpu 2)"

疑难解答

如果由于没有足够的资源可满足请求或者无法找到指定的 ID 而使传送失败,则系统将显示一条错误消息。

激活和删除池配置

使用 pooladm 命令可以激活特定的池配置或删除当前活动的池配置。有关此命令的更多信息,请参见 pooladm(1M) 手册页。

Procedure如何激活池配置

要激活缺省配置文件 /etc/pooladm.conf 中的配置,请调用带有 -c 选项(提交配置)的 pooladm

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 提交 /etc/pooladm.conf 中的配置。


    # pooladm -c
    
  3. (可选)将动态配置复制到静态配置文件,例如 /tmp/backup


    # pooladm -s /tmp/backup
    

Procedure如何在提交配置之前验证配置

您可以使用 -n 选项和 -c 选项来测试验证时将发生的情况。配置实际上将不会提交。

以下命令尝试验证 /home/admin/newconfig 中包含的配置。所有遇到的错误情况都将显示,但是不会修改配置本身。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 在提交配置之前测试此配置的有效性。


    # pooladm -n -c /home/admin/newconfig
    

Procedure如何删除池配置

要删除当前的活动配置并使所有的关联资源(如处理器集)都恢复为缺省状态,请使用表示“删除配置”的 -x 选项。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 删除当前活动配置。


    # pooladm -x
    

    -pooladmx 选项可从动态配置中删除所有用户定义的元素。所有资源将恢复到其缺省状态,并且所有池绑定将替换为与缺省池的绑定。

在处理器集中混合调度类

您可以在同一处理器集中安全地混合 TS 和 IA 类中的进程。在一个处理器集中混合其他调度类可能会导致不可预测的结果。如果使用 pooladm -x 导致在一个处理器集中出现混合调度类,请使用 priocntl 命令将运行的进程移至其他调度类。请参见如何将进程从 TS 类手动移至 FSS 类。另请参见 priocntl(1) 手册页。

设置池属性并绑定到池

可以设置 project.pool 属性,以便将资源池与项目关联。

可通过两种方法将正在运行的进程绑定到池:

Procedure如何将进程绑定到池

以下过程使用带有 -p 选项的 poolbind 将进程(在此例中为当前 shell)手动绑定到名为 ohare 的池。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 将进程手动绑定到池:


    # poolbind -p ohare $$
    
  3. 使用带有 -q 选项的 poolbind 验证进程的池绑定。


    $ poolbind -q $$
    155509 ohare

    系统将显示进程 ID 和池绑定。

Procedure如何将任务或项目绑定到池

要将任务或项目绑定到池,请使用带有 -i 选项的 poolbind 命令。以下示例将 airmiles 项目中的所有进程绑定到 laguardia 池。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. airmiles 项目中的所有进程绑定到 laguardia 池。


    # poolbind -i project -p laguardia airmiles
    

Procedure如何设置项目的 project.pool 属性

您可以设置 project.pool 属性,以将项目的进程绑定到资源池。

  1. 成为超级用户,或者承担包括进程管理配置文件的角色。

    系统管理员角色包括进程管理配置文件。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. project.pool 属性添加到 project 数据库中的每个条目。


    # projmod -a -K project.pool=poolname project
    

Procedure如何使用 project 属性将进程绑定到其他池

假设配置中具有两个名为 studiobackstage 的池。/etc/project 文件具有以下内容:


user.paul:1024::::project.pool=studio
user.george:1024::::project.pool=studio
user.ringo:1024::::project.pool=backstage
passes:1027::paul::project.pool=backstage

使用此配置,可以在缺省情况下将用户 paul 启动的进程绑定到 studio 池。

用户 paul 可以为其启动的进程修改池绑定。paul 也可以使用 newtask,通过在 passes 项目中启动来将工作绑定到 backstage 池。

  1. passes 项目中启动进程。


    $ newtask -l -p passes
    
  2. 使用带有 -q 选项的 poolbind 命令验证进程的池绑定。还可使用双美元符号 ($$) 将父级 shell 的进程号传递给该命令。


    $ poolbind -q $$
    6384  pool backstage

    系统将显示进程 ID 和池绑定。

使用 poolstat 报告与池相关的资源统计信息

poolstat 命令用于显示与池相关的资源的统计信息。有关更多信息,请参见使用 poolstat 监视池功能和资源利用率和 poolstat(1M) 手册页。

以下各小节通过示例说明如何生成用于特定用途的报告。

显示缺省的 poolstat 输出

键入不带参数的 poolstat 将针对每个池输出一个标题行和一行信息。信息行将显示池 ID、池的名称以及连接到池的处理器集的资源统计信息。


machine% poolstat
                              pset
       id pool           size used load
        0 pool_default      4  3.6  6.2
        1 pool_sales        4  3.3  8.4

按特定间隔生成多个报告

以下命令按 5 秒的抽样间隔生成 3 个报告。


machine% poolstat 5 3
                               pset
 id pool                 size used load
 46 pool_sales              2  1.2  8.3
  0 pool_default            2  0.4  5.2
                              pset
 id pool                 size used load
 46 pool_sales              2  1.4  8.4
  0 pool_default            2  1.9  2.0
                              pset
 id pool                 size used load
 46 pool_sales              2  1.1  8.0
  0 pool_default            2  0.3  5.0  

报告资源集统计信息

以下示例使用带有 -r 选项的 poolstat 命令报告处理器集资源集的统计信息。请注意,资源集 pset_default 连接到多个池,因此此处理器集将针对每个池成员关系列出一次。


machine% poolstat -r pset
      id pool          type rid rset          min  max size used load
       0 pool_default  pset  -1 pset_default    1  65K    2  1.2  8.3
       6 pool_sales    pset   1 pset_sales      1  65K    2  1.2  8.3
       2 pool_other    pset  -1 pset_default    1  10K    2  0.4  5.2

第 14 章 资源管理配置示例

本章概述了资源管理框架,并介绍虚拟的服务器整合项目。

本章包含以下主题:

要整合的配置

在此示例中,要将五个应用程序整合到单个系统中。目标应用程序具有不同的资源需求、用户群和体系结构。当前,每个应用程序都位于旨在满足应用程序要求的专用服务器上。下表介绍了各个应用程序及其特征。

应用程序说明 

特征 

应用服务器 

CPU 超过 2 个时,可伸缩性会降低 

应用服务器的数据库实例 

超负荷的事务处理 

测试和开发环境中的应用服务器 

基于 GUI,并且执行未经测试的代码 

事务处理服务器 

主要顾虑是响应时间 

独立数据库实例 

处理大量事务并为多个时区提供服务 

整合配置

以下配置用于将应用程序整合到单个系统中。

此配置适用于执行和占用每个资源集中的处理器时钟周期的已知应用程序。因此,可以建立约束,以便将处理器资源转移到需要资源的集中。

此外还应用了其他约束,以防止利用率超过任何资源集的 80%。此约束确保应用程序可以访问所需的资源。此外,对于事务处理器集,保持利用率低于 80% 的目标的重要性是指定的任何其他目标的两倍。这种重要性将在配置中定义。

创建配置

编辑 /etc/project 数据库文件。添加条目以实现所需的资源控制并将用户映射到资源池,然后查看此文件。


# cat /etc/project
.
.
.
user.app_server:2001:Production Application Server:::project.pool=appserver_pool
user.app_db:2002:App Server DB:::project.pool=db_pool;project.cpu-shares=(privileged,1,deny)
development:2003:Test and development::staff:project.pool=dev_pool;
process.max-address-space=(privileged,536870912,deny)keep with previous line
user.tp_engine:2004:Transaction Engine:::project.pool=tp_pool
user.geo_db:2005:EDI DB:::project.pool=db_pool;project.cpu-shares=(privileged,3,deny)
.
.
.

注 –

开发小组必须执行开发项目中的任务,因为对此项目的访问基于用户的组 ID (group ID, GID)。


创建名为 pool.host 的输入文件,此文件将用于配置所需的资源池。查看此文件。


# cat pool.host
create system host
create pset dev_pset (uint pset.min = 0; uint pset.max = 2)
create pset tp_pset (uint pset.min = 2; uint pset.max=8)
create pset db_pset (uint pset.min = 4; uint pset.max = 6)
create pset app_pset (uint pset.min = 1; uint pset.max = 2)
create pool dev_pool (string pool.scheduler="IA")
create pool appserver_pool (string pool.scheduler="TS")
create pool db_pool (string pool.scheduler="FSS")
create pool tp_pool (string pool.scheduler="TS")
associate pool dev_pool (pset dev_pset)
associate pool appserver_pool (pset app_pset)
associate pool db_pool (pset db_pset)
associate pool tp_pool (pset tp_pset)
modify system tester (string system.poold.objectives="wt-load")
modify pset dev_pset (string pset.poold.objectives="locality tight; utilization < 80")
modify pset tp_pset (string pset.poold.objectives="locality tight; 2: utilization < 80")
modify pset db_pset (string pset.poold.objectives="locality tight;utilization < 80")
modify pset app_pset (string pset.poold.objectives="locality tight; utilization < 80")

使用 pool.host 输入文件更新配置。


# poolcfg -f pool.host

使配置处于活动状态。


# pooladm -c

现在框架可在系统上正常运行。

查看配置

要查看框架配置(此配置还包含由系统创建的缺省元素),请键入:


# pooladm
system host
        string  system.comment
        int     system.version 1
        boolean system.bind-default true
        int     system.poold.pid 177916
        string  system.poold.objectives wt-load

        pool dev_pool
                int     pool.sys_id 125
                boolean pool.default false
                boolean pool.active true
                int     pool.importance 1
                string  pool.comment
                string  pool.scheduler IA
                pset    dev_pset
  
        pool appserver_pool
                int     pool.sys_id 124
                boolean pool.default false
                boolean pool.active true
                int     pool.importance 1
                string  pool.comment
                string  pool.scheduler TS
                pset    app_pset
      
        pool db_pool
                int     pool.sys_id 123
                boolean pool.default false
                boolean pool.active true
                int     pool.importance 1
                string  pool.comment
                string  pool.scheduler FSS
                pset    db_pset
  
        pool tp_pool
                int     pool.sys_id 122
                boolean pool.default false
                boolean pool.active true
                int     pool.importance 1
                string  pool.comment
                string  pool.scheduler TS
                pset    tp_pset
 
        pool pool_default
                int     pool.sys_id 0
                boolean pool.default true
                boolean pool.active true
                int     pool.importance 1
                string  pool.comment
                string  pool.scheduler TS
                pset    pset_default

        pset dev_pset
                int     pset.sys_id 4
                string  pset.units population
                boolean pset.default false
                uint    pset.min 0
                uint    pset.max 2
                string  pset.comment
                boolean pset.escapable false
                uint    pset.load 0
                uint    pset.size 0
                string  pset.poold.objectives locality tight; utilization < 80

        pset tp_pset
                int     pset.sys_id 3
                string  pset.units population
                boolean pset.default false
                uint    pset.min 2
                uint    pset.max 8
                string  pset.comment
                boolean pset.escapable false
                uint    pset.load 0
                uint    pset.size 0
                string  pset.poold.objectives locality tight; 2: utilization < 80

                cpu
                        int     cpu.sys_id 1
                        string  cpu.comment 
                        string  cpu.status on-line

                cpu
                        int     cpu.sys_id 2
                        string  cpu.comment 
                        string  cpu.status on-line

        pset db_pset
                int     pset.sys_id 2
                string  pset.units population
                boolean pset.default false
                uint    pset.min 4
                uint    pset.max 6
                string  pset.comment
                boolean pset.escapable false
                uint    pset.load 0
                uint    pset.size 0
                string  pset.poold.objectives locality tight; utilization < 80

                cpu
                        int     cpu.sys_id 3
                        string  cpu.comment 
                        string  cpu.status on-line

                cpu
                        int     cpu.sys_id 4
                        string  cpu.comment 
                        string  cpu.status on-line

                cpu
                        int     cpu.sys_id 5
                        string  cpu.comment 
                        string  cpu.status on-line

                cpu
                        int     cpu.sys_id 6
                        string  cpu.comment 
                        string  cpu.status on-line
        pset app_pset
                int     pset.sys_id 1
                string  pset.units population
                boolean pset.default false
                uint    pset.min 1
                uint    pset.max 2
                string  pset.comment
                boolean pset.escapable false
                uint    pset.load 0
                uint    pset.size 0
                string  pset.poold.objectives locality tight; utilization < 80
                cpu
                        int     cpu.sys_id 7
                        string  cpu.comment 
                        string  cpu.status on-line

        pset pset_default
                int     pset.sys_id -1
                string  pset.units population
                boolean pset.default true
                uint    pset.min 1
                uint    pset.max 4294967295
                string  pset.comment
                boolean pset.escapable false
                uint    pset.load 0
                uint    pset.size 0

                cpu
                        int     cpu.sys_id 0
                        string  cpu.comment 
                        string  cpu.status on-line

下面是框架的图形表示。

图 14–1 服务器整合配置

图中显示了虚拟的服务器配置。


注 –

在池 db_pool 中,保证为独立数据库实例留出 75% 的 CPU 资源。


第 15 章 Solaris Management Console 中的资源控制功能

本章介绍 Solaris Management Console 中的资源控制和性能监视功能。使用此控制台仅可控制一部分资源管理功能。

您可以使用此控制台监视系统性能,并输入表 15–1 中所示的项目、任务和进程的资源控制值。此控制台提供了一种方便、安全的方法,可以替代命令行界面 (command-line interface, CLI) 来管理分布在多个系统中的数以百计的配置参数。每个系统都单独进行管理。此控制台的图形界面支持所有的体验级别。

本章包含以下主题:

使用控制台(任务图)

任务 

说明 

参考 

使用控制台 

在本地环境、名称服务或目录服务环境中启动 Solaris Management Console。请注意,性能工具不能用于名称服务环境中。 

《系统管理指南:基本管理》中的“启动 Solaris Management Console”《系统管理指南:基本管理》中的“在名称服务环境中使用 Solaris 管理工具(任务图)”

监视系统性能 

访问“系统状态”下的性能工具。 

如何访问性能工具

向项目中添加资源控制 

访问“系统配置”下的“资源控制”选项卡。 

如何访问“资源控制”选项卡

控制台概述

资源管理功能是 Solaris Management Console 的一个组件。此控制台是基于 GUI 的管理工具的容器,这些管理工具存储在称为工具箱的集合中。有关此控制台及其使用方法的信息,请参见《系统管理指南:基本管理》中的第 2  章 “使用 Solaris Management Console(任务)”

使用控制台及其工具时,文档主要来源是控制台本身包含的联机帮助系统。有关联机帮助中提供的文档的说明,请参见《系统管理指南:基本管理》中的“Solaris Management Console(概述)”

管理范围

术语管理范围是指选择用于选定的管理工具的名称服务环境。对于资源控制工具和性能工具,可选的管理范围为 /etc/project 本地文件或 NIS。

控制台会话期间选择的管理范围应当与 /etc/nsswitch.conf 文件中标识的主名称服务相对应。

性能工具

性能工具可用于监视资源的利用率。可以汇总系统的资源利用率,也可以查看每个项目或每个用户的资源利用率。

图 15–1 Solaris Management Console 中的性能工具

屏幕捕获显示了“导航”窗格中“管理工具”下的“性能”,以及“属性”和“值”窗格中的系统性能汇总。

Procedure如何访问性能工具

性能工具位于“导航”窗格中的“系统状态”下。要访问性能工具,请执行以下操作:

  1. 在“导航”窗格中单击“系统状态”控制实体。

    控制实体用于展开“导航”窗格中的菜单项。

  2. 单击“性能”控制实体。

  3. 单击“系统”控制实体。

  4. 双击“摘要”、“项目”或“用户”。

    您的选择取决于要监视的使用情况。

按系统进行监视

以下属性的值显示如下。

属性 

说明 

活动进程 

系统上处于活动状态的进程数 

已用物理内存 

正在使用的系统内存量  

可用物理内存 

可用的系统内存量 

已用交换区 

正在使用的系统交换空间量 

可用交换区 

可用的系统交换空间量 

分页速率 

系统分页活动的速率 

系统调用数 

每秒的系统调用数 

网络包数 

每秒传送的网络包数 

CPU 使用率 

当前正在使用的 CPU 的百分比 

负载平均数 

系统运行队列中的进程数,此进程数是最近 1 分钟、5 分钟和 15 分钟内的平均值 

按项目名或用户名进行监视

以下属性的值显示如下。

属性 

短名称 

说明 

输入块数 

inblk

读取的块数 

写入块数 

oublk

写入的块数 

读取/写入字符数 

ioch

读取和写入的字符数 

数据页面错误休眠时间 

dftime

处理数据页面错误所用的时间 

偶然上下文切换数 

ictx

偶然上下文切换数 

系统模式时间 

stime

内核模式下所用的时间 

主要页面错误数 

majfl

主要页面错误数 

接收的消息数 

mrcv

接收的消息数 

发送的消息数 

msend

发送的消息数 

次要页面错误数 

minf

次要页面错误数 

进程数 

nprocs

用户或项目拥有的进程数 

LWP 数 

count

轻量进程数 

其他休眠时间 

slptime

tftimedftimekftimeltime 以外的休眠时间

CPU 时间 

pctcpu

进程、用户或项目使用的最近 CPU 时间的百分比 

已用内存 

pctmem

进程、用户或项目使用的系统内存的百分比 

堆大小 

brksize

为进程数据段分配的内存量 

驻留集大小 

rsssize

进程要求的当前内存量 

进程映像大小 

size

进程映像的大小 (KB) 

接收的信号数 

sigs

接收的信号数 

停止时间 

stoptime

停止状态下所用的时间 

交换操作数 

swaps

正在进行的交换操作数 

已完成的系统调用数 

sysc

在上一个时间间隔中执行的系统调用数 

系统页面错误休眠时间 

kftime

处理页面错误所用的时间 

系统陷阱时间 

ttime

处理系统陷阱所用的时间 

文本页面错误休眠时间 

tftime

处理文本页面错误所用的时间 

用户锁等待休眠时间 

ltime

等待用户锁所用的时间 

用户模式时间 

utime

用户模式下所用的时间 

用户和系统模式时间 

time

CPU 的累积执行时间 

主动上下文切换数 

vctx

主动上下文切换数 

等待 CPU 时间 

wtime

等待 CPU 所用的时间(延迟) 

“资源控制”选项卡

使用资源控制,可以将项目与一组资源约束进行关联。这些约束可确定项目上下文中运行的任务和进程允许使用的资源。

图 15–2 Solaris Management Console 中的“资源控制”选项卡

屏幕捕获显示了“资源控制”选项卡。此选项卡上显示了资源控制及其值。

Procedure如何访问“资源控制”选项卡

“资源控制”选项卡位于“导航”窗格中的“系统配置”下。要访问“资源控制”,请执行以下操作:

  1. 在“导航”窗格中单击“系统配置”控制实体。

  2. 双击“项目”。

  3. 单击控制台主窗口中的某个项目将其选定。

  4. 从“操作”菜单中选择“属性”。

  5. 单击“资源控制”选项卡。

    可查看、添加、编辑或删除进程、项目和任务的资源控制值。

可以设置的资源控制

下表显示了可以在控制台中设置的资源控制。该表介绍了每个控制所约束的资源,还列出了 project 数据库使用的该资源的缺省单位。缺省单位有两种类型:

因此,project.cpu-shares 指定了项目有资格享有的份额数。process.max-file-descriptor 指定了可由 open(2) 系统调用分配给进程的最高文件编号。

表 15–1 Solaris Management Console 中的可用标准资源控制

控制名称 

说明 

缺省单位 

project.cpu-shares

授予此项目的 CPU 份额数,用于公平份额调度器 (fair share scheduler, FSS)(请参见 FSS(7) 手册页)

数量(份额) 

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

此进程可用的最大地址空间量,即段大小的总和 

大小(字节) 

设置值

您可以查看、添加、编辑或删除进程、项目和任务的资源控制值。这些操作通过控制台中的对话框执行。

可以在控制台的表中查看资源控制及其值。“资源控制”列列出了可以设置的资源控制。“值”列显示了与每个资源控制关联的属性。在表中,这些值括在括号中,并显示为用逗号分隔的纯文本。括号中的值构成一条“操作子句”。每条操作子句都包含一个阈值、一个权限级别、一个信号以及一个与特定阈值关联的本地操作。每个资源控制可以有多条操作子句,这些子句也用逗号分隔。


注 –

在正在运行的系统中,通过控制台在 project 数据库中更改的值仅对一个项目中启动的新任务生效。


控制台参考

有关项目和任务的信息,请参见第 2 章。有关资源控制的信息,请参见第 6 章。有关公平份额调度器 (fair share scheduler, FSS) 的信息,请参见第 8 章


注 –

并非所有的资源控制都可在控制台中设置。有关可以在控制台中设置的各个控制的列表,请参见表 15–1