发新话题
打印

【申请加精】来自UC的《Solaris 10红宝书》系列在线课程

本主题由 otto 于 2008-4-15 09:22 加入精华
16.2 项目和任务   
这一节将介绍项目和容器的关系,以及在Solaris 10中,如何使用项目和任务来管理、分配资源。

16.2.1 项目(Projects)和任务(Tasks)的简单介绍
为了优化系统服务,有时需要对运行的系统进行工作量分析。无论是单独对从进程方面还是从用户方面来说,获得这些信息是困难的。在Solaris中,有两种工具来分析工作量:项目和任务。项目对有关工作提供网络背景方面的管理。任务提供程序组方面的管理。基于项目和任务管理机制,运行的程序可以被标准的Solaris命令所管理。

项目用于组织和管理物理系统资源集合。在实现全面服务器整合计划时,项目很有用。项目提供下列功能:

 为应用程序设置最小CPU资源和内存容量,从而平衡系统资源。

每个应用程序均可获得为其项目设置的最小CPU资源和内存容量(可选)。例如:基于应用程序的项目允许你为网络上运行的所有应用程序建立最小CPU资源和内存容量。当同一台主机上有多个项目处于活动状态时,由于每个应用程序均位于其各自的项目内,从而减少了系统资源的争用现象。在这种情况下,为每个项目设置的资源限制是由该主机上的Solaris内核实施的。

 跟踪数据中心内的资源使用情况。

将跟踪项目当前使用的资源总量,还会跟踪项目成员使用的资源量。尽管多个用户和组可能同属于一个或多个项目,但必须为每个Solaris用户指定一个默认项目。Solaris用户启动的进程可以绑定到该用户所属的任何项目。项目通过使用项目成员和资源池来跟踪与控制应用程序的资源消耗。

16.2.2 项目和容器的关系
项目就是与主机相关联的容器。与主机关联后,项目将处于活动状态,并且也设置了属于它自己的资源。容器可以作为多个项目模板。反过来,每个项目都具有与其关联的容器。该关联容器将这些项目的共同属性存储在一个中心位置,当创建新项目时,可以参照这些共同属性创建。

16.2.3 项目标志符
项目标志符是用来鉴别有关任务的管理标志符。具有工作量标志的项目也可以成为用户和组的标识。一个用户或组可以属于一个或多个项目,这些项目可以表现属于它的用户或组的工作量。尽管用户必须属于默认的项目,但用户发布的程序可以关联任何用户所属于的项目。

1.用户默认项目(Projects)介绍
当登录系统的时候,用户必须被分配一个项目,用户自动成为这个项目组的成员。

 如果用户项目的属性是在/etc/user_attr扩展用户属性数据库定义的,那么定义的值就是项目的默认属性。

 如果在项目数据库中,某个项目下有user.user-id,那么这个用户就是所属项目成员。

 如果在项目数据库中,某个项目下有group.group-name,那么这个用户组就是所属项目成员。

 如果在项目数据库中,某个项目下有default标志,那么这个项目就是默认项目。

2.用useradd, usermod和passmgmt设置用户属性
可以用下列命令及-k选项在一些本地文件中来设置用户的属性:

 passmgmt:修改用户信息。

 useradd:给用户设置默认的项目。

 usermod:修改用户信息。

这些被修改的本地文件是:

/etc/group

/etc/passwd

/etc/project

/etc/shadow

/etc/user_attr

3.项目数据库介绍
你可以存储项目数据到上面介绍的本地文件、NIS服务或LDAP服务中,访问时都需要权限模块(PAM)的认证。

4.名称服务的设置
项目数据库的管理支持名称服务。名称服务是在/etc/nsswitch.conf中定义的。在默认情况下,文件列表是首先被查询的。当然也可以有其他查询次序。下面是默认次序:

project: files [nis] [ldap]

5.本地文件/etc/project文件的格式
如果你在/etc/nsswitch.conf中列出最先查询的文件,登录进程就会首先查询/etc/project文件中的项目数据库信息。

这个/etc/project文件包含一行下列形式的项目信息:

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

这个信息定义如下:

 projname:项目名称。

 projid:在系统中项目惟一的号码。

 comment:项目的描述。

 user-list:用逗号分隔的属于这个项目的用户列表。

 group-list:用逗号分隔的属于这个项目的用户组列表。

 attributes:用分号分隔的name-value对,name是属性名,value是属性的值。具体见16.3.3节。

下面是默认的/etc/project文件的内容:

system:0:System:::

user.root:1:Super-User:::

noproject:2:No Project:::

default:3::::

group.staff:10::::

16.2.4 任务标志符
每次成功登录到项目中都会创建一个新的包含登录进程的任务。任务是工作中的进程的集体表现。每个任务都被自动授予一个任务ID。

每个进程都是一个任务的成员,每个任务都与一个项目相关联。此之者的关系如图16-3所示。


图16-3 项目、任务和进程的关系

所有对进程组的操作,比如信号的发送,任务都是支持的。你可以将任务绑定到processor set或者调度优先权和类。

可以用下面的方法来创建最终的任务:

 使用nwetask和-F选项的命令创建。

 所有被项目创建的任务,在使用setproject命令后,就会具有task_final标识。具有这个标识说明任务已经被创建

 在项目数据库中设置task.final属性。

16.2.5 管理项目与任务
1.有关项目和任务的一些命令
有关项目和任务的一些命令如表16-1所示。

表16-1 Projects和Tasks的命令

命 令
描 述

projects
显示项目成员;从项目数据库列出项目;打印给出项目的信息;如果没给出项目名,就列出所有项目信息;使用-l选项打印详细信息

newtask
运行Shell或专门的命令来完成新的任务;也可以被用来改变被任务或项目绑定的进程。使用-F选项可以创建最终的任务

passmgmt
更新密码口令文件信息

projadd
在/etc/project文件中增加新的项目;这个命令不能用来改变网络命名服务的项目信息

projmod
修改本地项目信息。也可以通过编辑/ect/project文件来达到修改项目信息的目的

projdel
删除本地项目信息。也可以通过编辑/ect/project文件来达到删除项目信息的目的


续表

命 令
描 述

useradd
增加默认的项目定义到本地文件

userdel
从本地文件中删除用户账号

usermod
修改用户登录系统的信息

prstat
使用-J选项,显示当前系统项目和程序的各种统计信息;

使用-T选项,显示当前系统任务和程序的各种统计信息

id
使用-p选项,显示当前项目ID、用户和组的ID

pgrep
使用-J选项,列出当前用户项目ID

使用-T选项,列出当前用户任务ID

pkill
使用-J选项,终结当前ID项目

使用-T选项,终结当前ID任务


2.如何增加和检查项目
 例16-1 增加一个名为booksite项目,项目ID为1443,并授权项目给mark用户。

# projadd -U mark -p 4113 booksite

为这个booksite项目增加一些注释:

# projmod -c ‘Book Auction Project’ booksite

检查项目内容:

# 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:

3.如何删除/etc/project中的项目
 例16-2 删除booksite项目。

# projdel booksite

同样,查看项目输出,发现booksite项目已经不存在了。

# projects –l

查看mark用户的项目,已经变成默认:

# su - mark

# projects

default

4.如何创建新的任务
 例16-3 创建新任务。

首先,以目标项目(booksite)的成员身份登录,在booksite项目中创建新的任务:

machine% newtask -v -p booksite

16

上面创建的任务ID为16,并默认放置用户自己的Shell到这个任务中。

5.如何将活动进程移动到新的任务中
 例16-4 移动活动进程。

(1)使用pgrep命令,查看book_catalog的进程ID:

# pgrep book_catalog

8100

(2)关联这个进程到所属项目名为booksite的新任务中:

#newtask -v -p booksite -c 8100

17

(3)列出新任务中的进程ID:

# pgrep -T 17

8100

现在,book_catalog进程属于项目booksite的ID号为17的新任务。      

TOP

16.3 资源控制   
本节介绍在Solaris 10系统中管理控制资源的一些方法。

16.3.1 资源控制概述
在Solaris操作系统中,单个进程资源的控制被限定在扩展的任务和项目控制中,以使资源管理更为容易。资源控制是以整个系统资源为基础的。资源控制的标志是以project、task和process为前缀的。

1.资源限制和资源控制
UNIX系统有个传统的资源限制工具:rlimit。这个rlimit工具允许管理员以数字的方式限制进程消耗的资源。它包括CPU的使用时间、进程核心文件的大小等。而资源控制工具也与资源限制工具兼容,它们可以共同对应用程序的资源使用进行管理。

2.进程间的通信和资源控制
进程间的通信是通过IPC进行的。IPC允许传递或同步不同进程之间发生的信息。在Solaris 10版本以前,IPC的可调整参数是在/tc/system文件中设定的。现在资源控制通过定义内核的方法管理资源,资源控制代替了/etc/system文件中的可调整参数。

我们可以使用ipcs命令和-J选项来观察IPC实体。

3.资源控制机制
资源控制机制是用来约束系统资源的,其中进程、任务和项目的应用能防止消耗大量专门的系统资源。这个机制通过防止系统资源耗尽来引导系统管理。约束机制也能用来支持程序资源规划,并拒绝没有必要的资源申请。

4.项目属性机制
资源控制也能提供一些简单的属性给资源管理工具。比如,在公平调度类中定义的project.cpu-shares就是项目可以分享的CPU的数量。因为,项目被分配给了固定的数量资源,所以任何情况下都不能超额使用。

5.Solaris 10资源控制新特性
下面资源控制的设定代替了system V的进程间通信(IPC)的可调整参数文件/etc/system。

 project.max-shm-ids

 project.max-msg-ids

 project.max-sem-ids

 project.max-shm-memory

 process.max-sem-nsems

 process.max-sem-ops

 process.max-msg-qbytes

下列事件端口的资源控制是新增加的内容:

 project.max-device-locked-memory

 project.max-port-ids

 process.max-port-events

下面这个加密的资源控制方法也是新加的:

 project.max-crypto-memory

下面是新加的附加资源控制内容:

 project.max-lwps

 project.max-tasks

 project.max-contracts

16.3.2 资源控制特性
1.标准的资源控制表
表16-2为标准的资源控制表。

表16-2 标准的资源控制表

控制器名
描 述
默认单元

Project.cpu-shares
在公平调度类(FSS)中项目所能分享的CPU数额
数额

project.max-crypto-memory
能够被libpkcs11作为加密使用的核心内存数量
大小(byte)

project.max-device-locked-memory
能够被锁定的内存的总量
大小(byte)

project.max-port-ids
事件端口允许的最大量
数量

project.max-shm-ids
项目允许的共享内存的最大量
数量

project.max-sem-ids
项目允许的信号数
数量

project.max-msg-ids
项目允许的最大消息队列数
数量

project.max-shm-memory
项目允许的最大共享内存数
大小

project.max-lwps
项目中同时可用的lwp数
数量

project.max-tasks
项目中允许的最大任务数
数量

project.max-contracts
项目中允许的最大合约数
数量

task.max-cpu-time
本任务的程序可以使用的最大的CPU时间
时间(秒)


续表

控制器名
描 述
默认单元

task.max-lwps
本任务的程序同时可以使用的最大lwp数
数量

process.max-cpu-time
本进程可用的最大CPU时间
时间(秒)

process.max-file-descriptor
本进程可用的最大文件描述符索引的数量
数量

process.max-file-size
本进程可用来写的最大的文件偏移量
大小(bytes)

process.max-core-size
本进程可创建的最大core文件的大小
大小(bytes)

process.max-data-size
本进程可用的最大heap memory的大小
大小(bytes)

process.max-stack-size
本进程可用的最大stack memory的大小
大小(bytes)

process.max-address-space
本进程可用的最大地址空间的大小总和
大小(bytes)

process.max-port-events
本进程每个事件端口可用的最大事件数量
数量

process.max-sem-nsems
本进程允许的信号设置的信号最大数
数量

process.max-sem-ops
本进程中每个semop call所允许的最大信号数
数量

process.max-msg-qbytes
在信息队列中的信息的最大值
大小(bytes)

process.max-msg-messages
在信息队列中的信息的最数
数量(个数)


当系统没有设置资源控制时,你也可以使用默认的资源控制。资源控制的默认值存在/etc/system文件和项目数据库中。可以使用prctl命令显示这些默认值。

2.资源控制的数值(value)和特权级(Privilege Levels)
每个控制资源的极限数值是和用户的特权级相联系的。特权级共有以下三种。

 基本级(basic):它可以修改自己的进程调用。

 特权级(privileged):它只能被超级用户所修改。

 系统级(system):它是系统运行时的固定数值。

资源控制是系统或资源提供者的定义资源数值,这些数值表明当前有多少资源可以被利用。

3.资源控制的全局动作和本地动作
在资源使用达到资源控制的极限值时,会触发全局动作或本地动作。全局动作有以下特性:

 显示系统资源控制的全局状态。

 设置系统的日志活动。

对于系统资源活动,全局动作可以设定系统日志,你可以设定系统日志到专门的日志级。可能设定的日志级有以下这些:

 debug

 info

 notice

 warning

 err

 crit

 alert

 emerg

注意,默认的资源控制是没有设定系统日志的。

本地动作有以下三种。

 none:当使用资源超过资源控制极限值时,没有任何动作发生。

 Deny:禁止使用资源超过资源控制极限值。

 signal=:当使用资源超过资源控制极限值时,发信号。

并不是所有的动作都可以应用到每个资源控制中。比如,deny动作就不能应用到project.cpu-shares资源控制中。

4.资源控制的标记和属性
在系统中每个资源控制都有几个相关联的属性。这些属性被定义为标记(flag)。

全局标记不能被修改,但是能被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:该资源控制的时间值。

本地标记可以被prctl命令修改。使用prctl-n同样可显示process.max-cpu-time的本地值和本地动作。

$ 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

本地标记中,inf表示指定的值是无限制的。Max也是一个本地标记,表示设定可用资源的最大值。      

TOP

16.3.3 管理资源
1.用于资源控制的命令介绍
用于资源控制的命令如表16-3所示。




表16-3 用于资源控制的命令

命 令
描 述

ipcs
观察进程间通信的工具

prctl
在本地范围内,允许在运行的时候进行查询和修正资源控制的工具

rctladm
在全局范围内,允许在运行的时候查询和修正资源控制的工具


2.设置资源控制
 例16-5 设置项目中的任务同时可以使用的最大lwp数。

(1)成为超级用户或授权角色用户。

(2)使用projadd命令和-K的选项来创建项目x-file,并设置项目中每个任务的最大的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)

(4)创建新任务,并将csh进程与x-file项目关联起来。

# newtask -p x-files csh

(5)显示任务情况,有三种方法。

a)使用prctl命令显示:

# 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 –

b)使用id命令显示:

# id -p

uid=0(root) gid=1(other) projid=100(x-files)

c)使用ps命令显示:

# ps -o project,taskid -p $$

PROJECT TASKID

x-files 73

(6)运行csh程序以产生多进程,可以预见产生进程数目不能超过3。

# csh /* creates second LWP */

# csh /* creates third LWP */

# csh /* cannot create more LWPs */

Vfork failed

#

3.如何使用prctl命令
使用prctl命令可以在系统运行中调整对活动进程、任务或者项目的资源控制。

 例16-6 显示系统中默认的资源控制。

# 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 -

.

.

.

 例16-7 显示给定的某个资源控制的详细信息。

# prctl -n proc ess.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 -

 例16-8 如何改变项目中资源控制的值。

(1)显示项目名为group.staff中资源控制的值:

# 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 -

(2)使用-r选项将改变项目中资源控制的值由1改为10:

# prctl -n project.cpu-shares -v 10 -r -i project group.staff

(3)检查项目中资源控制的值:

# 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 -

4.使用rctladm命令管理资源
 例16-9 使用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 ]

使用-e选项来激活系统日志,将资源控制信息记录在日志中:

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

5.使用ipcs显示进程间的通信
 例16-10 使用-J选项显示项目和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

6.如何测定Web服务器分配的CPU资源是否够用
 例16-11 测定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      

TOP

16.4 公平共享调度(FSS)   
在第1**幸丫?介绍了在进程的调度类中有一种名为公平共享调度类的。这一节我们就主要介绍此调度类的有关知识。

公平共享调度主要是指根据工作量的重要性,控制可用CPU时间在工作量之间的分配。工作量重要性是由分配给每个工作量的CPU时间的份额数表示的。在Solaris操作系统中,默认的调度类是分时调度,它使得所有的进程都按照时间的分配得到等同的资源。

16.4.1 CPU共享的设置
项目是容器的具体体现,可以设置一个公平共享调度类的容器来管理CPU的共享。设置CPU的共享是通过管理项目数据库来完成的。比如,在/etc/project文件中设置项目x-flies的共享份额为5:

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

如果在项目运行的时候改变了项目数据库中的共享CPU的份额,这个改变不会马上起作用,必须要重新启动项目后才有作用。

如果想在系统运行的时候临时改变份额而不改变项目的数据库,可以使用prctl命令来完成。比如,改变项目x-files的CPU共享份额为3,就可以使用下面的命令:

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

查看prctl(1)帮助页可以得到更多的信息。

16.4.2 FSS和处理器设置
处理器设置(Processor Set)是独立的CPU资源组合。由于它的计算公式比较复杂,我们采用举例的方式说明。

假设服务器中有8个CPU,我们将处理器设置分为3个组,它们分别是Processor Set 1,2和3,其中Processor Set 1中放2个CPU,Processor Set 2中放4个CPU,Processor Set 3中放2个CPU。现在有项目A、B和C,假设A项目享有CPU的份额为1,B项目为2,C项目为3。这时候我们可以随意将项目A、B和C放到任何处理器设置组中,但是它们的共享份额是固定的。比如,我们将项目A、B和C都放在Processor Set 1中;而在Processor Set 2中放B和C项目;在Processor Set 3中只放C项目组。这样就会出现图16-4的结果。


图16-4 处理器设置示意图

需要说明的是,在Processor Set 2中,虽然没有项目A,只有项目B和C,但它们的份额并没有改变,还是2:3。

可见,通过处理器设置组的设置,CPU资源的分配更加灵活了。

16.4.3 FSS和其他调度类
除了FSS调度类之外,Solaris系统还有分时调度类(TS)、交互调度类和固定优先级调度类等其他调度类。我们也知道,可以将系统的CPU分给几个处理器设置组来管理。这里要注意的是应该避免将某些调度类混合应用在一个处理器设置组中。比如,FSS、TS、IA和FX应用在一个处理器设置组就会带来意想不到的后果。

对于一个系统来说,你可以混合TS、IA、FX和FSS到一个系统中。但是,最好一个处理器设置组就设置一个调度类。你可以例外地将TS和IA类混合用到一个处理器设置组中,或者在没有设置处理器设置组的系统中。

因为实时调度类(RT)使用的优先级是100~159,不同于FSS调度类(0~59),所以RT可以和FSS共存在一个处理器设置中。

16.4.4 管理公平共享调度类
1.FSS命令介绍
表16-4中的命令提供了公平共享调度类的主要管理端口。

表16-4

命 令
描 述

priocntl
显示或设置专门进程的调度参数;

移动活动进程到不同的调度类

ps
显示运行的进程信息;

鉴别是哪个调度类的处理器设置组在工作

dispadmin
设置系统默认的调度类


2.监控FSS
可以使用prstat命令来监控项目中的CPU使用状况。

使用-J选项来监控系统中项目的CPU使用状况:

% prstat –J

使用-C选项来监控处理器组中项目的CPU使用状况:

% prstat -J -C pset-list

3.配置FSS
使用dispadmin命令在系统中设定默认调度类为FSS:

# dispadmin -d FSS

这个命令在下次系统启动后生效。在系统重新启动后,系统中每个进程都运行在FSS调度类。

你也能手动地将进程从一个调度类移动到另外一个调度类,并且不改变默认的调度类,也不需要重新启动计算机。下面命令是将进程从TS调度类移动到FSS调度类,比如移动进程的PID为1。

# priocntl -s -c FSS -i pid 1

如果移动所有的TS调度类的进程到FSS调度类中,就需要下面的命令:

# priocntl -s -c FSS -i class TS

如果我们要移动ID为10项目中的所有进程到FSS类中,使用下面命令:

# priocntl -s -c FSS -i projid 10

需要注意的是,上面使用priocntl命令的设置在系统重新启动后将不再保存。      

TOP

16.5 使用资源上限守护程序管理物理内存   
资源上限执行守护程序rcapd(1MSRM)及其关联的实用程序为资源上限的执行和管理提供了方法。在任何指定的时间只能运行rcapd的一个例程。守护程序会周期性地对定义了物理内存上限的进程集合的资源利用情况进行取样。如果进程消耗的资源超过了上限数量,并且符合其他条件,则守护程序会采取措施,将进程消耗的资源总量降低到低于上限数量的水平。

虚拟内存系统将物理内存划分为区段(称为页)。为了将数据从文件读入内存中,虚拟内存系统会一次读取一页,或者换入文件。为了减少资源消耗,守护程序可能会将不常用的页换出或重新定位到物理内存外的区域。

使用rcapadm(1MSRM)可配置资源上限守护程序。rcapadm 也可用于在全局层面上管理资源上限。可以在要求时通过发送配置更改的SIGHUP(请参阅kill(1))或通过配置间隔(请参阅rcapadm(1MSRM)将其集成到(rcapd)中。请注意,你必须拥有超级用户特权才能配置守护程序。如果在使用时不带参数,则rcapadm显示资源上限守护程序的当前状态(若已配置此程序)。

使用rcapstat(1SRM)可为每个定义的上限报告资源上限执行守护程序的统计数据。

16.5.1 限制物理内存使用的属性
可以在项目中定义物理内存资源的限制。建立常驻内存大小的限制可以在项目数据库中完成。

rcap.max-rss:用来限制项目中的程序可以使用的物理内存的总数,单位是byte。

比如,在/etc/project文件中设置常驻内存大小限制为10亿字节:

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

16.5.2 使用资源上限守护程序
1.设置内存上限执行值
可以配置上限,使其不会在进程可用的物理内存很低之前执行。最小(默认)值是 0,表示始终执行内存上限。要为内存上限执行设置不同的最小物理内存使用量,请键入:

# rcapadm -c percent

percent值应在0到100的范围内。高的值表示较少的限制,意味着项目的工作量执行没有限制,直到系统内存的利用率超过这个百分比的限定。可通过使用rcapstat命令的-g选项来获得当前的全局物理内存使用量及其上限。

2.设置操作间隔
可以调整由rcapd执行的周期性操作的间隔。要重设间隔,请使用-i选项。

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

所有间隔以秒为单位指定。表16-5描述了各个间隔及其默认值。

表16-5 操作间隔

间 隔
以秒为单位的默认值
描 述

scan
15
rcapd扫描新进程的频率。最小值为1秒

sample
5
进程驻留大小的取样频率。最小值为1秒

report
5
rcapd为rcapstat所更新的换页统计数据的频率。如果设为 0,则不更新统计数据

config
60
重新配置的频率。在重新配置事件中,rcapd检查其要更新的配置文件,并为新lnode或项目上限扫描lnode(限制)数据库或项目数据库,或者扫描新集合


如果指定给rcapstat的间隔比指定给rcapd的短(通过rcapadm(1MSRM)指定),则某些间隔的输出可能为零。这是因为rcapd更新统计数据的频率不会比通过rcapadm指定的间隔高,而且此间隔独立于由rcapstat使用的取样间隔,并较此准确性要低。

3.打开资源上限守护程序
要启用资源上限守护程序,以使其立即启动,以及在每次启动系统时也启动,请键入:

# rcapadm –E

要在启动时启用资源上限守护程序而不影响其当前运行状态,还要指定-n选项:

# rcapadm -n -E

4.关闭资源上限守护程序
要禁用资源上限守护程序,以使其立即停止并在启动系统时不会启动,请键入:

# rcapadm –D

要禁用资源上限守护程序而不影响其当前运行状态,还要指定-n选项:

# rcapadm -n -D

16.5.3 监视资源上限守护程序
1.rcapstat命令介绍
使用rcapstat命令可产生关于由rcapd设置上限的报告。

rcapstat [Interval] [count]

通过此命令,你可以设置取样间隔,并指定报告频率,其参数具体意义是:

 Interval:以秒为单位指定取样间隔。默认间隔为5 s。

 count:指定重复统计的次数。默认情况下,rcapstat会直到收到终止信号或者rcapd进程结束时才报告统计数据。

由rcapstat产生的第一个报告中的换页统计数据显示自守护程序启动以来的活动情况。后续报告反映自上次报告产生以来的活动情况。

表16-6定义了rcapstat报告的列标题。

表16-6 rcapstat报告的列标题意义

标 题
描 述

id
项目ID

project
项目名称

nproc
项目中的进程数

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

rss
项目的总驻留大小(RSS),以千字节(K)、兆字节(M)或十亿字节(G)为单位,未将共享的对象计算在内

cap
为项目定义的RSS上限。有关如何指定内存上限的信息,请参阅 rcapd(1MSRM)

at
rcapd在上一个rcapstat样本之后试图换出的总内存量

avgat
rcapd在上一个rcapstat样本之后发生的每个样本周期中试图换出的平均内存量。可透过rcapadm1MSRM设置(rcapd)样本集合RSS的频率

pg
在上一个rcapstat样本之后rcapd成功换出的总内存量。rcapd会换出最不常用的页面

avgpg
rcapd在上一个rcapstat样本之后发生的每个样本周期中成功换出的平均内存量估计值。可通过rcapadm设置rcapd样本进程RSS大小的频率


2.通过 rcapstat 产生报告
 例16-12 使用rcapstat报告上限和项目信息。

为与两个用户关联的两个项目定义上限。user1的上限为50MB,user2的上限为10MB。以下命令以5秒的取样间隔产生报告,将产生五次报告,在每个样本后产生一次。

usermachine% 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启动以来的换页统计数据。at和pg列分别是大于零的数字(对于user1)和零(对于user2),这表示在守护程序的历史记录中的部分时间里,user1超过其上限,但user2没有超过其上限。

后续报告包含自前一间隔以来的换页统计数据,但显示的活动都不重要。

 例16-13 使用rcapstat监视项目的RSS。

项目名为user1的项目,RSS的值超过了RSS的上限。以下命令以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项目有3个进程使用物理内存。pg列中的非零值表示rcapd因其试图通过降低项目进程的物理内存使用量来符合上限的要求而不断地换出内存。然而,rcapd未成功,这可以从不断变化且未显示相应减少的rss列的值中看出。这意味着项目中所有的驻留内存正被积极使用并且工作集的大小还比上限大。在此情况下,系统将继续保持高的页面故障率及关联的I/O,直到下面的情况发生:

 工作集大小减少

 上限上升

 应用程序更改其内存访问模式

 例16-14 确定项目的工作集大小。

此示例是例16-13的延续,并且使用相同的项目;例16-13显示了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项目的内存上限从6GB增加到了10GB。内存上限的增长也允许工作集增长。rss列能稳定反映项目的工作集大小,在这个例子中是6247M。这个数字是项目进程不在发生频繁的页面故障的最低界限。

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

 rcapadm(1MSRM)设置的全局内存使用上限。

 当前使用的内存量占安装在系统中的所有物理内存的百分比。

 例16-15 报告全局内存上限。

# 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%      

TOP

16.6 动态资源池   
16.6.1 资源池的概述
1.资源池

图16-5 资源池的结构









源池也称为池,是Solaris 9和Solaris 10的一种软件配置机制,可用于对主机资源进行分区。资源池可使你分配工作量,并能确保资源不被浪费。它为处理器设置组(processor set)和调度类的分配提供了持久的配置机制。三者关系如图16-4所示。

资源池可以绑定系统中的各种资源。可创建以下几种池:

 pool1: pset_default

 pool2: pset1

 pool3: pset1, pool.scheduler="FSS"

每个在/etc/project文件中的项目条目都有一个资源池与之相关联,并用project.pool来表示其属性。我们可以用projmod命令在/etc/project文件中增加一个资源池属性。比如在sales项目中增加一个名为mypool的资源池属性:

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

资源池为系统事件和应用加载提供了动态的调整机制。这些调整是系统管理员为了系统的性能而预先设定的,系统自动执行这些调整。当系统动态资源分配需要时,执行程序poold就会执行调整。poold程序周期地检查系统负载并测算为了系统维持最佳状态而是否干涉。

当资源池启动时,default pool和default processor set就已经设置。可以人为地创立一些资源池和处理器设置组,但一个CPU只能属于一个处理器设置组。用户定义的资源池和处理器设置组可以取消,但默认的资源池和默认的处理器设置组却不会被取消。

2.资源池的框架
/etc/pooladm.conf是静态资源池的设置文件。这些设置文件表现了系统管理员想要设置的专门资源池的属性。

内核保存着资源和资源池的部署信息,这就是资源的动态设置信息。它表现为某一时刻系统的资源池性能。这些动态设置可以通过pooladm命令查看。更改这些动态设置的间接方法就是应用静态的设置文件,直接的方法就是使用poolcfg命令和-d选项。可以有多个静态资源池设置文件在系统中同时存在,你可以在不同的时间分别激活它们,也可以在crontab中设定好定期执行pooladm命令。

在默认情况下,资源池框架是不被激活的。

用于资源池框架和poold程序的命令如下:

 pooladm(1M)

 poolcfg(1M)

 poold(1M)

 libpool(3LIB)

保存在/etc/pooladm.conf文件中的是静态设置。当系统启动的时候,如果这个文件存在,这个资源池框架将启动并且将其中的静态设置应用在系统之上。

包括动态设置的所有资源池设置,都包含着下列的元素:

 system:受系统行为影响的特性

 pool:一个资源池的定义

 pset:一个处理器设置组的定义

 cpu:一个处理器的定义

所有这些元素都能被用来操控资源池框架的行为。比如,pool.importance属性表示所给的资源池的重要属性。

3.在系统中起用资源池
在系统中起用用户定义的资源池,有以下方法:

 当系统启动时,启动脚本检查/etc/pooladm.conf文件是否存在。如果存在,pooladm命令则调用这个设置启动资源池。

 当系统已经在运行的时候,资源池可能活动着也可能没有启动。可以用pooladm命令启动它。

4.创建资源池的设置文件
当系统启动后,创建/etc/pooladm.conf有两种方法:

 你可以用pooladm命令和-s选项去发现系统当前资源并将结果放到配置文件中。这个方法是首选的。所有的活动资源和系统组件都可以被资源池工具操控并记录。

 也可以用pooladm -c、discover或create system name等命令来创建新的资源池设置。

注意可以用poolcfg或libpool去修改/etc/pooladm.conf文件,但不要直接编辑这个文件。      

TOP

16.6.2 管理动态资源池
本节主要介绍动态资源池的管理方法。

1.在系统中启动和关闭资源池框架
可以用pooladm命令来启动和关闭资源池框架。只有启动后,资源池才能被操控。在关闭后,资源池不能被操控。启动和关闭都需要由具有相应管理角色的用户或超级用户来进行。

启动资源池框架:

# pooladm -e

关闭资源池框架:

# pooladm -d

2.设置资源池
(1)如何创建静态资源池设置。

使用/usr/sbin/pooladm命令和-s选项可以创建一个与当前动态设置相匹配的静态设置文件。如果不给新生成的文件指定路径和名称,文件名和路径在默认情况下将被启动,这就是/etc/pooladm.conf。

 例16-16 创建静态资源池设置。

a)创建与当前动态资源池相匹配的静态资源池设置文件:

# pooladm –s

b)查看新创建的文件:

# 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]

c)将在/etc/pooladm.conf文件中的静态资源池设置提交给系统:

# pooladm –c

d)如果将拷贝的动态资源池设置文件创建在/tmp/backup目录中,则使用下面的命令创建资源池设置:

# pooladm -s /tmp/backup

(2)如何修改资源池设置。

为了加强资源管理,可以在资源池的设置增加一个处理器设置组(processor set)。

 例16-17 将名为pset_batch的处理器设置组关联到名为pool_batch的资源池中。

a)首先,创建处理器设置组。

# poolcfg -c ’create pset pset_batch (uint pset.min = 2; uint pset.max = 10)’

b)创建名为pool_batch的资源池:

# poolcfg -c ’create pool pool_batch’

c)将处理器设置组与资源池关联:

# poolcfg -c ’associate pool pool_batch (pset pset_batch)’

d)显示资源池设置信息:

# 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

e)将/etc/pooladm.conf文件内容提交:

# pooladm -c

(3)如何关联资源池和调度类

设置pool.scheduler属性可以将资源池绑定的所有进程关联到一个调度类。

 例16-18 在例16-17的基础上,关联pool_batch资源池和公平共享调度类(FSS)。

a)修改资源池的属性与FSS关联:

# poolcfg -c ’modify pool pool_batch (string pool.scheduler="FSS")’

b)显示修改信息:

# 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

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

c)提交/etc/pooladm.conf文件信息到系统:

# pooladm -c

(4)如何使用poolcfg命令将命令文件提交到系统。

我们可以编辑一个命令文件,内容为资源池的设置,然后用poolcfg命令提交到系统中。

 例16-19 提交命令文件到系统。

a)创建命令文件:

$ 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)

b)成为超级用户或具有进程管理角色的用户。

c)运行提交命令:

# /usr/sbin/poolcfg -f poolcmds.txt

3.转移资源
使用transfer子命令和poolcfg命令的-c及-d选项来转移在内核中的资源。-d选项表示在内核中完成转移资源。

下面两个例子分别使用了转移资源的两种方法。

 例16-20 将处理器设置组pset1中的2个CPU移动到处理器设置组pset2中。

# poolcfg -dc ’transfer 2 from pset pset1 to pset2’

如果知道CPU的ID,也可以使用下列方法:

 例16-21 将2个ID为0和2的CPU转移到名为pset_large的处理器设置组中。

# poolcfg -dc "transfer to pset pset_large (cpu 0; cpu 2)"

4.激活和删除资源池设置
(1)激活资源池设置。

使用下面命令激活资源池设置:

# pooladm -c

如果在激活之间需要检查设置是否正确,可以使用下面的命令,并将结果输出:

# pooladm -n -c /home/admin/newconfig

/home/admin/newconfig为输出文件。

(2)删除资源池设置。

删除当前的活动的资源池设置,并将所关联的所有资源,比如处理器设置组等,都恢复到默认的资源设置状态。使用下面命令:

# pooladm –x

5.设置资源池的属性并且绑定资源池
你可以设置project.pool属性来关联资源池和项目。绑定进程到资源池有两种方法:

 用poolbind命令来绑定专门的进程到资源池。

 用项目数据库中的project.pool属性来绑定新的任务。

(1)使用poolbind命令来绑定进程到资源池。

 例16-22 绑定当前进程到ohare资源池。

# poolbind -p ohare $$

检查绑定结果:

$ poolbind -q $$

155509 ohare

(2)绑定任务或项目到资源池。

 例16-23 绑定airmiles项目中所有的进程到laguardia资源池:

# poolbind -i project -p laguardia airmiles

(3)设置项目中的project.pool属性。

在项目数据库中增加project.pool属性的命令:

# projmod -a -K project.pool=poolname project

(4)使用项目属性绑定进程到不同的资源池。

 例16-24 使用项目属性绑定进程到不同的资源池。

在项目数据库中有studio和backstage两个资源池定义,内容如下:

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默认项目是user,且启动的所有进程都绑定了studio资源池。用户paul可以修改自己进程所绑定的资源池。使用newtask-l命令可以使用户paul作为passes项目的成员登录,而passes项目绑定backstage资源池。

(1)使用户paul作为passes项目的成员:

$ newtask -l -p passes

(2)检查资源池绑定结果:

$ poolbind -q $$

6384 pool backstage

6.使用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

 例16-25 在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

使用poolstat命令和-r选项来报告资源集的统计信息。

 例16-26 使用poolstat命令和-r选项来报告资源集的统计信息。

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

注意,本例中资源集pset_default同时属于多个资源池。      

TOP

第17章 系统信息的管理   
了解系统的运行状况的首要前提是收集系统信息。Solaris系统具有自己的信息管理系统。?**匾?讲述的就是系统信息的管理。      

TOP

17.1 信息管理概述   
Solaris系统信息共有三个类型:日志信息、Core信息和Crash信息。显示系统信息的地方通常是控制台和日志文件。当然,Solaris系统也提供控制台信息转储的方法。

对于显示在系统控制台中的,系统信息的内容一般如此:

[ID msgid facility.priority]

举例说明:

[ID 672855 kern.notice] syncing file systems...

如果信息来自于内核,内核的名字会显示出来,比如:

Oct 1 14:07:24 mars ufs: [ID 845546 kern.notice] alloc: /: file system full

当系统崩溃时,可能在控制台显示的信息是这样:

panic: error message

在不经常的情况下,下面的信息可能会替代panic信息:

Watchdog reset !

在日志中,记录日志程序syslogd可以自动记录各种系统的警告和错误信息。在默认情况下,很多系统信息显示在系统控制台并存储在/var/adm目录中。当系统发生问题,比如有些设备发生了故障时这些信息能给出警告。

/etc/adm目录包含着几个信息文件。最新的信息是存储在/var/adm/messages文件中。经过一段时间之后(通常是每10天),新的消息文件就会被创建,这时messages.0文件就改名为messages.1,messages.1该为messages.2,messages.2改为messages.3等。而原来的messages.3文件将被删除。

因为/var/adm目录存有大容量的信息文件、crash文件和其他数据文件,所以这个目录需要大的磁盘空间。你应该删除在这个目录中的一些不需要的文件。

要想查看当前系统内核崩溃信息或重新启动信息,请使用dmesg命令。当然也可以直接到/var/adm/messages文件中去查看。

dmesg命令输入如下所示:

$ dmesg

Jan 3 08:44:41 starbug genunix: [ID 540533 kern.notice] SunOS Release 5.10 ...

Jan 3 08:44:41 starbug genunix: [ID 913631 kern.notice] Copyright 1983-2003 ...

Jan 3 08:44:41 starbug genunix: [ID 678236 kern.info] Ethernet address ...

Jan 3 08:44:41 starbug unix: [ID 389951 kern.info] mem = 131072K (0x8000000)

Jan 3 08:44:41 starbug unix: [ID 930857 kern.info] avail mem = 121888768

Jan 3 08:44:41 starbug rootnex: [ID 466748 kern.info] root nexus = Sun Ultra 5/

10 UPA/PCI (UltraSPARC-IIi 333MHz)

Jan 3 08:44:41 starbug rootnex: [ID 349649 kern.info] pcipsy0 at root: UPA 0x1f0x0

Jan 3 08:44:41 starbug genunix: [ID 936769 kern.info] pcipsy0 is /pci@1f,0

Jan 3 08:44:41 starbug pcipsy: [ID 370704 kern.info] PCI-device: pci@1,1, simba0

Jan 3 08:44:41 starbug genunix: [ID 936769 kern.info] simba0 is /pci@1f,0/pci@1,1

Jan 3 08:44:41 starbug pcipsy: [ID 370704 kern.info] PCI-device: pci@1, simba1

Jan 3 08:44:41 starbug genunix: [ID 936769 kern.info] simba1 is /pci@1f,0/pci@1

Jan 3 08:44:57 starbug simba: [ID 370704 kern.info] PCI-device: ide@3, uata0

Jan 3 08:44:57 starbug genunix: [ID 936769 kern.info] uata0 is /pci@1f,0/pci@1,

1/ide@3

Jan 3 08:44:57 starbug uata: [ID 114370 kern.info] dad0 at pci1095,6460      

TOP

17.2 系统日志信息管理   
日志(log)是最常见的日志形式。本节主要介绍日志的利用和管理。

17.2.1 系统日志循环利用
系统日志文件是通过在/etc/crontab文件中设定,定时启动logadm命令来完成循环利用的。创建新的日志记录的脚本程序/usr/lib/newsyslog并不经常起用。

系统日志循环是定义在/etc/logadm.conf文件中的,这个文件包含着日志进程的循环条目。比如,其中一个条目就是关于/var/log/syslog文件每周循环的,最新的syslog文件成为syslog.0文件,而syslog.0成为syslog.1文件等。一共保存8个以前的日志文件。

在/etc/logadm.conf中,你可以定制系统日志或增加系统日志的记录。

比如,循环增加apache的访问和错误日志,就用下列命令:

# logadm -w /var/apache/logs/access_log -s 100m

# logadm -w /var/apache/logs/error_log -s 10m

在这个例子中,apache的access_log文件当达到100MB时是循环使用的,使用的文件后缀是0,1,2等,一共保存10个access_log文件的拷贝。error_log也是循环的,当它达到10MB的时候停止保存。

17.2.2 定制系统日志信息
定制系统日志信息输出的文件是/etc/syslog.conf文件。在/etc/syslog.conf文件中,默认设置下,很多系统进程信息被保存到/var/adm/messages 文件。crash和启动信息也可以这里设置。

下面就是/etc/syslog.conf文件的内容:

user.err /dev/sysmsg

user.err /var/adm/messages

user.alert ‘root, operator’

user.emerg *

这意味着下列信息可以自动记录:

 用户的错误打印在控制台上并且记录在/etc/adm/messages文件中

 要有一个动作(alert)来响应信息,这个动作给root或操作的用户发送警告。

 用户的紧急情况信息要发送给每个人。

在syslog.conf文件中的资源工具在表17-1中列出。在此文件中的优先级列表为表17-2。

表17-1 在syslog.conf文件中的资源工具

资 源
描 述

kern
内核

auth
权限

daemon
所有后台程序

mail
邮件系统

lp
打印系统

user
用户进程


表17-2 在syslog.conf文件中的优先级列表

优 先 级
描 述

emerg
系统突发紧急事件

alert
错误要求马上修正

crit
危急的错误

err
其他错误

info
情报信息

debug
输出用户调试信息

none
设定不进行日志输出


下面举例说明如何定制日志信息:

 例17-1 定制日志信息。

(1)成为超级用户或等同角色用户。

(2)编辑/etc/syslog.conf文件,增加下面的内容,将用户的突发事件信息发送给超级用户和每个用户。

user.emerg ‘root, *’

(3)退出保存。      

TOP

发新话题