1.为项目中的每个任务设置最大LWP数
使用带有 -K 选项的 projadd 命令创建名为 x-files 的项目。将在此项目中创建的每个任务的最大 LWP 数设置为 3:
# projadd -K 'task.max-lwps=(privileged,3,deny)' x-files
执行完此过程中的步骤之后,当超级用户在项目 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
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-files
将设置以下控制:
针对每个任务的最大 LWP 数不采取任何操作的 basic 控制。
针对每个任务的最大 LWP 数的特权 deny 控制。此控制会使任何超过最大数量的 LWP 创建失败,如前面示例如何为项目中的每个任务设置最大 LWP 数所示。
在 basic 级别对每个进程的最大文件描述符数的限制,此限制迫使任何超过最大数量的 open 调用失败。
3. 使用 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 -
... ....
4.使用 prctl 命令显示给定资源控制的信息
# 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
5. 使用 prctl 临时更改值
使用 newtask 加入 x-files 项目。
# newtask -p x-files
使用带有 -p 选项的 id 命令检验是否已加入正确的项目。
# id -p
uid=0(root) gid=1(other) projid=101(x-files)
为 project.max-lwps 添加一个新的权限值,将 LWP 数限制为三个。
# prctl -n project.max-lwps -t privileged -v 3 -e deny -i project x-files
验证结果。
# 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 -
6. 使用 prctl 降低资源控制值
使用带有 -r 选项的 prctl 命令更改 process.max-file-descriptor 资源控制的最低值。
# prctl -n process.max-file-descriptor -r -v 128 $$
7. 使用 prctl 显示、替换和检验项目的控制值
显示项目 group.staff 中 project.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
将当前 project.cpu-shares 值 1 替换为值 10。
# prctl -n project.cpu-shares -v 10 -r -i project group.staff
显示项目 group.staff 中 project.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
8. 使用 rctladm
使用 rctladm 命令可以对资源控制功能的全局状态进行运行时询问和修改
例如,您可以使用带有 -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 ]
… …
9. 使用 ipcs
ipc可以显示有关活动的进程间通信 (interprocess communication, IPC) 功能的信息。您可以使用带有 -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
10. 如何确定是否为 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
11. 标准资源控制表
控制名称 | 说明 | 缺省单位 |
project.cpu-shares | 授予此项目的 CPU 份额数,用于公平共享调度程序(请参见 FSS(7))。 | 数量(份额) |
project.max-crypto-memory | libpkcs11 用于加速硬件加密的内核内存总量。内核缓冲区分配以及与会话相关的结构分配都按照此资源控制执行。 | 大小(字节) |
project.max-device-locked-memory | 允许的锁定内存总量。 在将来的发行版中,可能不会包括此资源控制。 | 大小(字节) |
project.max-port-ids | 允许的最大事件端口数。 | 数量(事件端口数) |
project.max-shm-ids | 此项目允许的最大共享内存 ID 数。 | 数量(共享内存 ID) |
project.max-sem-ids | 此项目允许的最大信号 ID 数。 | 数量(信号 ID) |
project.max-msg-ids | 此项目允许的最大消息队列 ID 数。 | 数量(消息队列 ID) |
project.max-shm-memory | 此项目允许的共享内存总量。 | 大小(字节) |
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() 时间从资源控制复制的值)。 | 数量(消息数) |