第7节 项目
要优化工作负荷响应,必须首先能够识别在系统上运行的工作负荷。这点可能很难通过单独使用纯粹面向进程或面向用户的方法来获取。在Solaris系统中,
您可以使用两个附加功能来分离和识别工作负荷:项目(project)和任务(task)。项目为相关工作提供了网络范围内的管理标识符;任务则是将一组
进程收集到表示工作负荷组件的可管理实体中。
7.1 项目配置库
项目的配置数据可存储在本地文件/etc/project中,也可以指定使用名称服务(NIS,LDAP)数据库来存放项目数据。NIS的项目地图文件
project.byname或project.bynumber的格式和/etc/project文件相同。项目配置库中每行条目的格式如下:
projname:projid:comment:user-list:group-list:attributes
projname 项目的名称
projid 系统内项目的唯一数字ID
comment 项目的说明文字
user-list 允许参与项目的用户列表(以逗号隔离),可使用通配符*和排除符号!以及!*等
group-list 允许参与项目的组列表(以逗号隔离),允许使用通配符*和排除符号!以及!*等
attributes 用分号分隔的名字-值对列表,可用于定义项目的各种资源控制
n 在/etc/nsswitch.conf文件中指定使用的项目配置库类型:
# grep project /etc/nsswitch.conf
project: files nis ldap
n 默认的项目配置库文件的内容:
# more /etc/project
system:0::::
user.root:1::::
noproject:2::::
default:3::::
group.staff:10::::
虽然默认的项目配置库中,并没有为任何一个项目指定成员,但每当有用户登陆时,系统依然会被每个用户分配一个项目,从ip –p命令的输出可看出,当前普通用户属于default项目,root用户属于user.root项目。
$ id -p
uid=100(huangy) gid=1(other) projid=3(default)
# id -p
uid=0(root) gid=0(root) projid=1(user.root)
也可用命令查看,输出结果会更具可读性:
# projects -l
system
projid : 0
comment: ""
users : (none)
groups : (none)
attribs:
user.root
projid : 1
comment: ""
users : (none)
groups : (none)
attribs:
<…此处输出省略…>
default
projid : 3
comment: ""
users : (none)
groups : (none)
attribs:
<…此处输出省略…>
n 查找和杀死与项目ID(或名字)匹配的进程:
# pgrep -l -J default
5982 sh
5983 sh
# pkill –J default
n 显示系统当前运行的进程和项目的各种统计信息
# prstat –J
<…此处输出省略…>
PROJID NPROC SIZE RSS MEMORY TIME CPU PROJECT
1 37 1266M 165M 55% 0:23:30 4.6% user.root
0 76 594M 133M 44% 0:20:25 0.8% system
3 2 5160K 2000K 0.6% 0:00:04 0.0% default
Total: 115 processes, 401 lwps, load averages: 0.17, 0.16, 0.16
7.2 任务标识符
每次成功的登陆到项目时,都会创建一个包含登录进程的新任务。任务是指表示一段时间内一组工作的进程集。任务也可以视为工作负荷组件。会为每个任务自动指
定一个任务ID。每个进程都是一个任务的成员,而每个任务都与一个项目关联。可将任务和处理器集关联,并为任务设置调度优先级和调度类;优先级和类会修改
任务中的所有当前进程以及后续进程。下面显示了项目和任务树型关系图:
: (2007-1-26 17:50, 13.38 K)
查看任务和项目ID:
# ps -o user,pid,uid,projid,taskid
USER PID UID PROJID TASKID
root 6020 0 1 115
root 5990 0 1 115
root 5991 0 1 115
查找和杀死与任务ID(或名字)匹配的进程:
# pgrep -l -T 115
5990 sh
5991 bash
# pkill –T 115
显示系统当前运行的进程和项目的各种统计信息
# prstat –T
<…此处输出省略…>
TASKID NPROC SIZE RSS MEMORY TIME CPU PROJECT
100 32 1206M 130M 43% 0:16:58 2.7% user.root
115 3 11M 6804K 2.2% 0:00:01 1.0% user.root
50 11 364M 70M 23% 0:07:35 0.7% system
101 1 42M 26M 8.5% 0:06:26 0.3% user.root
105 1 5196K 724K 0.2% 0:00:44 0.2% system
51 2 5168K 1572K 0.5% 0:00:15 0.0% system
Total: 115 processes, 403 lwps, load averages: 0.16, 0.16, 0.16
创建新任务
n 用newtask命令可在指定的项目中创建新任务,并把用户的缺省shell置于此任务中。
# id -p
uid=0(root) gid=0(root) projid=1(user.root)
# newtask -v -p default
121
# id -p
uid=0(root) gid=0(root) projid=1001(default)
n 把当前进程移从原项目(user.root)的任务中移到当前新指定的项目(default)的任务中:
# pgrep -l -J default
6131 sh
# newtask -v -p default -c 6081
# pgrep -l -J default
6131 sh
6081 bash
7.3 项目配置概览
前面我们在对zone或资源池进行配置时,都必须在全局区域中进行,而对项目的配置在全局和非全局zone中都可进行。
二、 添加新项目。项目名为project1,项目ID为1001,并指定给test-zone里的用户zoneusr1使用
# zlogin test-zone
[已连接到区域 'test-zone' pts/6]
Last login: Thu Jan 25 09:13:04 on pts/5
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
# useradd -d /export/home/zoneusr1 -m -k /etc/skel -s /bin/bash zoneusr1
# projadd -U zoneusr1 -p 1001 project1
三、 修改项目内容
# projmod -c 'This is a test project' project1
四、 添加项目的属性。先添加属性task.max-lwps(任务能使用的最大LWP数);然后再添加属性的值,这个属性的值包括权限级别,阀值,以及到达阀值时执行的操作;每个属性都可以指定多个值
# projmod -a -K task.max-lwps project1
# projmod -a -K "task.max-lwps=(basic,100,none)" project1
# projmod -a -K "task.max-lwps=(priv,1000,signal=KILL)" project1
# getent project project1
project1:1001:This is a test project:zoneuser1::task.max-lwps=(basic,100,none),(priv,1000,signal=KILL)
n 也可以把多余的属性值删除(可选操作):
# projmod -r -K "task.max-lwps=(priv,1000,signal=KILL)" project1
n 删除多余的属性(可选操作)
# projmod -r -K task.max-lwps project1
n 用新值替代当前的属性值(可选操作)
# projmod -s -K "task.max-lwps=(priv,500,deny) ,(priv,1000,signal=KILL)" project1
n 删除属性当前的值(可选操作)
# projmod –s -K task.max-lwps project1
五、 创建项目proja并分配能使用的CPU份额,最大内存数,并指定test和root用户使用。
# projadd -K 'project.cpu-shares=(privileged,5,none)' proja
# projadd -K 'rcap.max-rss=100MB' proja
# projmod -U 'test,root' proja
六、 删除项目(可选操作)
# projdel proja
七、 切换到zoneusr1,查看指定给此用户的项目,可看到用户属于两个项目
# projects
user.root default
# su zoneusr1
$ projects zoneusr1
default project1
7.3.1 项目配置效果测试
1. 以下配置实例演示了如何添加一个新的项目proj2,并设置该项目中的任务的最大轻量级线程数为3。
# projadd -K 'task.max-lwps=(privileged,3,deny)' proj2
# getent project proj2
proj2:1002::::task.max-lwps=(privileged,3,deny)
2. 创建新任务bash
# newtask -p proj2 bash
# id -p
uid=0(root) gid=0(root) projid=1002(proj2)
# prctl -n task.max-lwps $$
process: 6531: bash
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
task.max-lwps
privileged 3 - deny -
system 2.15G max deny -
3. 经测试bash最多只能开启3个线程
# bash
# bash
# bash
bash: fork: 资源暂时不可用
第8节 资源上线设置RCAP
资源上限是针对资源(如物理内存)占用设定的上限。支持按项目设置物理内存上限。资源上限设置守护进程(racpd)及其关联的实用程序提供用于执行和管理物理内存资源上限的机制。
资源上限与资源控制一样,可以使用project数据库中项目条目的属性进行定义。但是,资源控制由内核同步执行,而资源上限由rcapd在用户级别上异步执行。在异步执行过程中,守护进程所用的抽样间隔会导致轻微的延迟。
资源上限设置工作原理
守护进程对具有物理内存上限的项目的资源利用率进行重复抽样。它所使用的抽样间隔由管理员指定。当系统的物理内存使用率超过上限执行的阈值并且满足其他条件时,守护进程便会采取措施将具有内存上限的项目的资源使用率降到等于或低于上限的水平。
虚拟内存系统将物理内存分为多个段,这些段称为页面。在Solaris
内存管理子系统中,页面是物理内存的基本单元。在将数据从文件读入内存时,虚拟内存系统一次读入文件的一页,或者说对文件执行页入(page
in)操作。为了减少资源占用,守护进程可以对不常用的页面执行页出操作(page
out),即将其重新放置到交换设备中,该设备是位于物理内存以外的区域,通常是SWAP文件系统。
守护进程通过调整项目工作负荷驻留集(work-load resident set)相对其工作集的大小(working set
size,WSS)来管理物理内存。驻留集是驻留在物理内存中的一组页面;工作集是指处理工作负荷过程中实际使用的一组页面。工作集会随着时间的推移发生
变化,具体取决于进程的运行模式以及正在处理的数据类型。理想的情况是,每个工作负荷可以访问的物理内存都足以使其工作集一直驻留在物理内存中。但是,工
作集还可以使用辅助磁盘存储器来容纳物理内存之外的存储器。
限制物理内存使用率的属性
要定义项目的物理内存资源上限,可在project
数据库条目添加rcap.max-rss属性(项目中的进程可用的物理内存总量(字节))来设定驻留集大小(resident set size,
RSS) 上限。例如,/etc/project 文件中的以下条目将项目db的RSS上限设置为10GB:
# grep rcap.max-rss /etc/project
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
系统可以将指定的上限值舍入为页面大小。
8.1 rcapd配置
如果在安装有区域的系统上使用rcapd,则必须添加一个project条目,并在每个要运行守护进程的区域中配置守护进程。rcapd 不会对其所在区域以外的其他区域中的进程执行操作。
要启用racp:
# rcapadm –E---------------以后每次启动都会自动开启;rcaprcapadm -n –E将在下次启动后启用
禁用并停止rcap(建议不要用Kill)
# rcapadm –D----------------------rcapadm –n –D会禁用rcap,但并不停止当前的rcapd。
内存上限执行阀值
内存上限执行阀值是系统上触发上限执行的物理内存使用百分比。当系统超过此使用率时,便会执行上限。应用程序和内核使用的物理内存包括在此百分比中。此使用百分比确定执行内存上限的方式。在执行上限时,会对项目工作负荷中的内存执行页出操作:
n 可以对内存执行页出操作,以减小给定工作负荷超过其上限的内存部分的大小。
n 可以对内存执行页出操作,以减小超过系统内存上限执行阈值的所用物理内存部分的大小。
某个工作负荷最多可以使用大小等于其上限的物理内存。但只要系统内存使用率低于内存上限执行阈值,工作负荷便可使用更多的内存。系统默认的内存上限执行阀值为0,这意味着默认开启上限执行。下面的命令将资源上限执行阀值定为80%:
# rcapadm -c 80
RCAPD操作间隔
通过rcapadm命令可以调整rcapd所执行的定期操作的间隔,这些操作包括:进程扫描scan、进程RSS抽样sample、分页统计报告report、配置config
# rcapadm –i scan=15,sample=5,report=5,config=60
监控资源利用率
通过rcapstat可以监视具有上限的项目的资源利用率。下面的命令将每个5秒抽样一次,共10次抽样:
# rcapstat 5 10
可使用-g 选项在每个间隔输出报告的结尾列显一行有关内存使用率和上限执行的信息:
# rcapstat –g 5 10
另外使用SMC也可以执行上述的配置操作,嘿嘿~
本文来自:SUN系统管理员学习指南(全球唯一中文版免费在线阅读) for solaris 9&10
阅读(1419) | 评论(0) | 转发(0) |