Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1299838
  • 博文数量: 554
  • 博客积分: 10425
  • 博客等级: 上将
  • 技术积分: 7555
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-09 09:49
文章分类

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-15 11:29:43


资源控制标志和操作
第5 章• 资源控制59
RCTL_GLOBAL_DENY_NEVER
超过有关此控制的控制值时执行的操作始终排除拒绝资源。尽管也可能会执行其他操
作,但会始终授权使用该资源。
RCTL_GLOBAL_FILE_SIZE
局部操作的有效信号包括SIGXFSZ 信号。
RCTL_GLOBAL_CPU_TIME
局部操作的有效信号包括SIGXCPU 信号。
RCTL_GLOBAL_SIGNAL_NEVER
此控制不允许局部操作。始终授权使用该资源。
RCTL_GLOBAL_INFINITE
此资源控制支持没有限制的值这一概念。通常,没有限制的值只适用于逐渐累积型的资
源(如CPU 时间)。
RCTL_GLOBAL_UNOBSERVABLE
通常,与任务或项目相关的资源控制不支持观测的控制值。为任务或进程设置的具有
RCPRIV_BASIC 权限的控制值只有在被该进程超过时才生成操作。
与项目、进程和任务关联的资源控制集
下图显示了与任务、进程和项目关联的资源控制集。
资源控制标志和操作
60 Solaris 10 资源管理器开发者指南• 2006 年11 月
图5–1任务、项目和进程的资源控制集
资源控制标志和操作
第5 章• 资源控制61
一种资源可以存在多个资源控制,每个资源控制都处在进程模型的包含级别上。资源控制
可以在进程以及集合任务或集合项目的同一种资源中处于活动状态。在这种情况下,对进
程的操作优先。例如,如果同时遇到process.max-cpu-time 和task.max-cpu-time 这两个控
制,则首先对第一个控制执行操作。
与项目关联的资源控制
与项目关联的资源控制包括以下各项:
project.cpu-shares
授予此项目的CPU 份额,用于公平共享调度程序FSS(7)。
project.max-msg-ids
项目所允许的最大System V 消息队列数。
project.max-sem-ids
项目所允许的最大System V 信号数。
project.max-port-ids
允许的最大事件端口数。
与任务关联的资源控制
与任务关联的资源控制包括以下各项:
task.max-cpu-time
此任务进程可用的最长CPU 时间(秒)。
task.max-lwps
此任务的进程可同时使用的最大LWP 数。
与进程关联的资源控制
与进程关联的资源控制包括以下各项:
process.max-address-space
此进程可用的最大地址空间量(字节),即段大小的总和。
process.max-core-size
此进程创建的最大核心转储文件大小(字节)。
process.max-cpu-time
此进程可用的最长CPU 时间(秒)。
process.max-file-descriptor
此进程可用的最大文件描述符索引。
process.max-file-size
此进程可写入的最大文件偏移(字节)。
process.max-msg-messages
消息队列中的最大消息数。该值是在msgget() 时间从资源控制中复制的。
资源控制标志和操作
62 Solaris 10 资源管理器开发者指南• 2006 年11 月
process.max-msg-qbytes
消息队列中的最大消息数(字节)。该值是在msgget() 时间从资源控制中复制的。如果
设置了新的project.max-msg-qbytes 值,则仅对后续创建的值进行初始化。新的
project.max-msg-qbytes 值不影响现有值。
process.max-sem-nsems
信号集允许的最大信号数。
process.max-sem-ops
semop() 调用允许的最大信号操作数。该值是在msgget() 时间从资源控制中复制的。新
的project.max-sem-ops 值仅影响对后续创建值的初始化,对现有值没有任何影响。
process.max-port-events
每个事件端口允许的最大事件数。
用于资源控制的信号
对于为资源控制设置的每个阈值,以下一组受限制的信号是可用的:
SIGBART
终止进程。
SIGXRES
超过资源控制限制时由资源控制功能生成的信号。
SIGHUP
当载波在断开的线路上停止时,将挂起信号发送到用于控制终端的进程组,此挂起信号
即SIGHUP。
SIGSTOP
作业控制信号。停止进程。停止信号不是来自终端。
SIGTERM
终止进程。由软件发送的终止信号。
SIGKILL
终止进程。中止程序。
SIGXFSX
终止进程。超过了文件大小限制。仅可用于具有RCTL_GLOBAL_FILE_SIZE 属性的资源
控制。
SIGXCPU
终止进程。超过了CPU 时间限制。仅可用于具有RCTL_GLOBAL_CPUTIME 属性的资源
控制。
由于特定控制的全局属性,可能允许其他信号。
注– 对包含非法信号的setrctl() 的调用将失败。
资源控制标志和操作
第5 章• 资源控制63
图5–2为信号设置权限级别
资源控制API 函数
资源控制API 包含的函数可以:
 第64 页中的“对资源控制的操作-值对执行操作”
 第64 页中的“对局部可修改值执行操作”
 第65 页中的“检索局部只读值”
 第65 页中的“检索全局只读操作”
对资源控制的操作-值对执行操作
以下列表包含用于设置或获取资源控制块的函数。
setrctl(2)
getrctl(2)
对局部可修改值执行操作
以下列表包含与局部可修改资源控制块关联的函数。
rctlblk_set_privilege(3C)
rctlblk_get_privilege(3C)
rctlblk_set_value(3C)
rctlblk_get_value(3C)
资源控制API 函数
64 Solaris 10 资源管理器开发者指南• 2006 年11 月
rctlblk_set_local_action(3C)
rctlblk_get_local_action(3C)
rctlblk_set_local_flags(3C)
rctlblk_get_local_flags(3C)
检索局部只读值
以下列表包含与局部只读资源控制块关联的函数。
rctlblk_get_recipient_pid(3C)
rctlblk_get_firing_time(3C)
rctlblk_get_enforced_value(3C)
检索全局只读操作
以下列表包含与全局只读资源控制块关联的函数。
rctlblk_get_global_action(3C)
rctlblk_get_global_flags(3C)
资源控制代码示例
资源控制的主观察进程
以下示例是主观察者进程。图5–3 显示了主观察进程的资源控制。
注– 换行符在/etc/project 文件中是无效的。此处显示的换行符仅允许示例显示在列显页或
显示页上。/etc/project 文件中的每一项都必须占用单独的一行。
资源控制代码示例
第5 章• 资源控制65
图5–3主观察进程
该示例的要点包括以下内容:
 由于任务的限制具有权限,因此应用程序无法更改限制,也无法指定操作(如信号)。
主进程通过为任务建立与基本资源控制相同的资源控制解决了此问题。主进程对资源使
用相同的值或稍小的值,但执行不同的操作(信号= XRES)。主进程将创建一个线程以
等待此信号。
 rctlblk 是不透明的。需要动态分配结构。
 请注意,sigwait(2) 要求在创建线程之前阻塞所有的信号。
 线程将调用sigwait(2) 来阻塞信号。如果sigwait() 返回SIGXRES 信号,则线程将通知
主进程的子进程适当减少正在使用的LWP 的数目。此外,还应该使用每个子进程中的
线程以类似方式为每个子进程建模,以等待此信号并适当调整其进程的LWP 使用情
况。
rctlblk_t *mlwprcb;
sigset_t smask;
/* Omit return value checking/error processing to keep code sample short */
/* First, install a RCPRIV_BASIC, v=1000, signal=SIGXRES rctl */
mlwprcb = calloc(1, rctlblk_size()); /* rctl blocks are opaque: */
资源控制代码示例
66 Solaris 10 资源管理器开发者指南• 2006 年11 月
rctlblk_set_value(mlwprcb, 1000);
rctlblk_set_privilege(mlwprcb, RCPRIV_BASIC);
rctlblk_set_local_action(mlwprcb, RCTL_LOCAL_SIGNAL, SIGXRES);
if (setrctl("task.max-lwps", NULL, mlwprcb, RCTL_INSERT) == -1) {
perror("setrctl");
exit (1);
}
/* Now, create the thread which waits for the signal */
sigemptyset(&smask);
sigaddset(&smask, SIGXRES);
thr_sigsetmask(SIG_BLOCK, &smask, NULL);
thr_create(NULL, 0, sigthread, (void *)SIGXRES, THR_DETACHED, NULL));
/* Omit return value checking/error processing to keep code sample short */
void *sigthread(void *a)
{
int sig = (int)a;
int rsig;
sigset_t sset;
sigemptyset(&sset);
sigaddset(&sset, sig);
资源控制代码示例
第5 章• 资源控制67
while (1) {
rsig = sigwait(&sset);
if (rsig == SIGXRES) {
notify_all_children();
/* e.g. sigsend(P_PID, child_pid, SIGXRES); */
}
}
}
列出特定资源控制的所有值-操作对
以下示例列出了特定资源控制task.max-lwps 的所有值-操作对。该示例的要点是getrctl(2)
使用两个资源控制块,并返回RCTL_NEXT 标志的资源控制块。要在所有的资源控制块中
迭代,请使用rcb_tmp rctl 块反复交换此处显示的资源控制块值。
rctlblk_t *rcb1, *rcb2, *rcb_tmp;
...
/* Omit return value checking/error processing to keep code sample short */
rcb1 = calloc(1, rctlblk_size()); /* rctl blocks are opaque: */
/* "rctlblk_t rcb" does not work */
rcb2 = calloc(1, rctlblk_size());
getrctl("task.max-lwps", NULL, rcb1, RCTL_FIRST);
while (1) {
print_rctl(rcb1);
rcb_tmp = rcb2;
rcb2 = rcb1;
rcb1 = rcb_tmp; /* swap rcb1 with rcb2 */
资源控制代码示例
68 Solaris 10 资源管理器开发者指南• 2006 年11 月
if (getrctl("task.max-lwps", rcb2, rcb1, RCTL_NEXT) == -1) {
if (errno == ENOENT) {
break;
} else {
perror("getrctl");
exit (1);
}
}
}
设置project.cpu-shares 并添加新值
该示例的要点包括以下内容:
 该示例类似于第83 页中的“设置pool.comment 属性并添加新属性”中显示的示例。
 请使用bcopy(),而不要使用第68 页中的“列出特定资源控制的所有值-操作对”中的
缓冲区交换。
 要更改资源控制值,在调用setrctl() 时请使用RCTL_REPLACE 标志。新的资源控制块
除了使用新的控制值以外,与原有的资源控制块相同。
rctlblk_set_value(blk1, nshares);
if (setrctl("project.cpu-shares", blk2, blk1, RCTL_REPLACE) != 0)
该示例将获取项目的CPU 份额分配project.cpu-shares,并将其值更改为nshares。
/* Omit return value checking/error processing to keep code sample short */
blk1 = malloc(rctlblk_size());
getrctl("project.cpu-shares", NULL, blk1, RCTL_FIRST);
my_shares = rctlblk_get_value(blk1);
printout_my_shares(my_shares);
/* if privileged, do the following to */
资源控制代码示例
第5 章• 资源控制69
/* change project.cpu-shares to "nshares" */
blk1 = malloc(rctlblk_size());
blk2 = malloc(rctlblk_size());
if (getrctl("project.cpu-shares", NULL, blk1, RCTL_FIRST) != 0) {
perror("getrctl failed");
exit(1);
}
bcopy(blk1, blk2, rctlblk_size());
rctlblk_set_value(blk1, nshares);
if (setrctl("project.cpu-shares", blk2, blk1, RCTL_REPLACE) != 0) {
perror("setrctl failed");
exit(1);
}
为资源控制块设置LWP 限制
在以下示例中,应用程序设置了具有权限的限制3000 LWP(可能没有超过)。此外,应用
程序还设置了基本限制2000 LWP。超过此限制时,系统会将SIGXRES 发送到应用程序。
收到SIGXRES 时,应用程序可能会将通知发送给其子进程,而该进程可能会减少进程使用
或需要的LWP 数目。
/* Omit return value and error checking */
#include
rctlblk_t *rcb1, *rcb2;
/*
资源控制代码示例
70 Solaris 10 资源管理器开发者指南• 2006 年11 月
* Resource control blocks are opaque
* and must be explicitlyallocated.
*/
rcb1 = calloc(rctlblk_size());
rcb2 = calloc(rctlblk_size());
/* Install an RCPRIV_PRIVILEGED, v=3000: do not allow more than 3000 LWPs */
rctlblk_set_value(rcb1, 3000);
rctlblk_set_privilege(rcb1, RCPRIV_PRIVILEGED);
rctlblk_set_local_action(rcb1, RCTL_LOCAL_DENY);
setrctl("task.max-lwps", NULL, rcb1, RCTL_INSERT);
/* Install an RCPRIV_BASIC, v=2000 to send SIGXRES when LWPs exceeds 2000 */
rctlblk_set_value(rcb2, 2000);
rctlblk_set_privilege(rcb2, RCPRIV_BASIC);
rctlblk_set_local_action(rcb2, RCTL_LOCAL_SIGNAL, SIGXRES);
setrctl("task.max-lwps", NULL, rcb2, RCTL_INSERT);
资源控制代码示例
第5 章• 资源控制71
与资源控制关联的编程问题
编写应用程序时,请考虑以下问题:
 资源控制块是不透明的。需要动态分配控制块。
 如果在任务或项目中建立了基本资源控制,则建立此资源控制的进程将成为观察者。对
此资源控制块的操作将应用于该观察者。但是,不能使用此方式观察某些资源。
 如果在任务或项目中设置具有权限的资源控制,则不存在观察者进程。但是,违反该限
制的任何进程都将成为资源控制操作的适用对象。
 只允许对每种类型执行一项操作:全局操作或局部操作。
 只允许对每个进程、每个资源控制使用一个基本rctl。
与资源控制关联的编程问题
72 Solaris 10 资源管理器开发者指南• 2006 年11 月
动态资源池
本章介绍资源池及其属性。
 第73 页中的“资源池概述”
 第74 页中的“动态资源池约束和目标”
 第77 页中的“资源池API 函数”
 第80 页中的“资源池代码示例”
 第85 页中的“与资源池关联的编程问题”
资源池概述
资源池提供了用于管理处理器集和线程调度类的框架。资源池用于对计算机资源进行分
区。通过资源池可以分散工作负荷,使各工作负荷对特定资源的占用不会发生冲突。在具
有混合工作负荷的系统上,这种资源预留有助于获得可预测的性能。
有关资源池以及用于管理资源池的示例命令的概述,请参见《System Administration Guide:
Solaris Containers-Resource Management and Solaris Zones》中的第12 章“Dynamic Resource
Pools (Overview)”和《System Administration Guide: Solaris Containers-Resource Management
and Solaris Zones》中的第13 章“Administering Dynamic Resource Pools (Tasks)”。
处理器集将系统中的CPU 分组到一个有界限的实体中,在该实体中进程可以采用独占方式
运行。其中的进程不能扩展到该处理器集外,而其他进程也不能扩展到该处理器集内。处
理器集可以将具有类似特征的任务组合在一起,并设置针对CPU 使用的硬限制(上限)。
资源池框架用于定义具有最大和最小CPU 计数要求的软处理器集。此外,该框架还为该处
理器集提供了一个硬定义调度类。
资源池定义以下内容
 处理器集组
 调度类
6第6 章
73
调度类
调度类为基于算术逻辑的线程提供不同的CPU 访问特性。调度类包括:
 实时调度类
 交互式调度类
 固定优先级调度类
 分时调度类
 公平共享调度类
有关公平共享调度程序以及用于管理公平共享调度程序的示例命令的概述,请参
见《System Administration Guide: Solaris Containers-Resource Management and Solaris
Zones》中的第8 章“Fair Share Scheduler (Overview)”和《System Administration Guide: Solaris
Containers-Resource Management and Solaris Zones》中的第9 章“Administering the Fair Share
Scheduler (Tasks)”。
请不要在CPU 集中混合调度类。如果在CPU 集中混合调度类,则系统性能可能会不稳定或
不可预测。请使用处理器集按照应用程序特征分别部署应用程序。请指定使应用程序能够
达到最佳性能的调度类。有关各个调度类的特征的更多信息,请参见priocntl(1)。
有关资源池的概述以及对何时使用资源池的讨论,请参见第6 章。
动态资源池约束和目标
libpool 库定义了可用于各种实体(使用池功能管理)的属性。每个属性都属于以下类别:
配置约束
约束定义了属性的限制。典型的约束是在libpool 配置中指定的最大和最小分配量。
目标
目标可以更改当前配置的资源分配,以生成遵循已建立约束的新的候选配置。(请参见
poold(1M)。)目标包含以下类别:
与工作负荷有关与工作负荷有关的目标将依据工作负荷强加的条件有所变化。与工
作负荷有关的目标示例为utilization 目标。
与工作负荷无关与工作负荷无关的目标不会依据工作负荷强加的条件发生变化。与
工作负荷无关的目标示例为cpu locality 目标。
目标可以采用可选的前缀来指示目标的重要性。为确定目标的重要性,将在目标中增加
此前缀(是0 到INT64_MAX 之间的整数)。
系统属性
system.bind-default(可写布尔值)
如果在/etc/project 中找不到指定的池,请绑定到pool.default 属性设置为TRUE 的
池。
动态资源池约束和目标
74 Solaris 10 资源管理器开发者指南• 2006 年11 月
system.comment(可写字符串)
系统的用户说明。缺省的池命令不使用system.comment,但通过poolcfg 实用程序启动
配置时除外。此时,系统会将提示性消息置于该配置的system.comment 属性中。
system.name(可写字符串)
配置的用户名称。
system.version(只读整数)
处理此配置所需的libpool 版本。
池属性
所有的池属性都是可写的。
pool.active(可写布尔值)
如果为TRUE,则表示该池处于活动状态。
pool.comment(可写字符串)
池的用户说明。
pool.default(可写布尔值)
如果为TRUE,则表示该池为缺省池。请参见system.bind-default 属性。
pool.importance(可写整数)
该池的相对重要性。用于可能的资源争用解决方案。
pool.name(可写字符串)
池的用户名称。setproject(3PROJECT) 使用pool.name 作为project(4) 数据库中的
project.pool 项目属性的值。
pool.scheduler(可写字符串)
与该池的使用者绑定的调度程序类。此属性是可选的,如果未指定,则调度程序对该池
使用者的绑定将不受影响。有关各个调度类的特征的更多信息,请参见priocntl(1)。调
度程序类包括:
 RT(代表实时调度程序)
 TS(代表分时调度程序)
 IA(代表交互式调度程序)
 FSS(代表公平共享调度程序)
 FX(代表固定优先级调度程序)
处理器集属性
pset.comment(可写字符串)
资源的用户说明。
pset.default(只读布尔值)
标识缺省的处理器集。
 
 
以上文章转自于 : http://developers.sun.com.cn/
阅读(703) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~