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

第 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 接口