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

第 7 章 管理资源控制(任务)

本章介绍如何管理资源控制功能。

有关资源控制功能的概述,请参见第 6 章

管理资源控制(任务图)

任务 

说明 

参考 

设置资源控制。 

/etc/project 文件中的项目设置资源控制。

设置资源控制

获取或修改本地范围的活动进程、任务或项目的资源控制值。 

对与系统上的活动进程、任务或项目关联的资源控制进行运行时询问和修改。 

使用 prctl 命令

在正在运行的系统上,查看或更新资源控制的全局状态。 

查看整个系统范围内每个资源控制的全局日志状态。还在超过控制时设置 syslog 日志的级别。

使用 rctladm

报告活动的进程间通信 (interprocess communication, IPC) 功能的状态。 

显示有关活动的进程间通信 (interprocess communication, IPC) 功能的信息。查看哪些 IPC 对象正在使用项目资源。  

使用 ipcs

确定是否为 Web 服务器分配了足够的 CPU 容量。 

设置对资源控制执行的全局操作。通过此操作,可以接收任何所设资源控制值太低的实体的通知。 

如何确定是否为 Web 服务器分配了足够的 CPU 容量

设置资源控制

Procedure如何为项目中的每个任务设置最大 LWP 数

此过程将名为 x-files 的项目添加到 /etc/project 文件,并为在此项目中创建的任务设置最大 LWP 数。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用带有 K 选项的 -projadd 命令创建名为 x-files 的项目。将在此项目中创建的每个任务的最大 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)
    • 键入


      # cat /etc/project
      system:0:System:::
      .
      .
      .
      x-files:100::::task.max-lwps=(privileged,3,deny)

示例 7–1 会话样例

执行完此过程中的步骤后,如果超级用户在项目 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
#

Procedure如何对一个项目设置多个控制

/etc/project 文件可以包含每个项目的多个资源控制设置,还可包含每个控制的多个阈值。阈值在操作子句中定义,这些子句使用逗号分隔多个值。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  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-filesone line in file
    

    将设置以下控制:

    • 针对每个任务的最大 LWP 数不采取任何操作的 basic 控制。

    • 针对每个任务的最大 LWP 数的特权 deny 控制。此控制会使所有超过最大值的 LWP 创建都失败,如前一示例如何为项目中的每个任务设置最大 LWP 数所示。

    • basic 级别对每个进程的最大文件描述符数的限制,它会强制任何超过最大数量的 open 调用均失败。

  3. 使用以下方法之一,查看文件中的条目:

    • 键入


      # projects -l
      .
      .
      .
      x-files
              projid : 100
              comment: ""
              users  : (none)
              groups : (none)
              attribs: process.max-file-descriptor=(basic,128,deny)
                       task.max-lwps=(basic,10,none),(privileged,500,deny) one line in file
      
    • 键入


      # cat etc/project
      .
      .
      .
      x-files:100::::process.max-file-descriptor=(basic,128,deny);
      task.max-lwps=(basic,10,none),(privileged,500,deny) one line in file
      

使用 prctl 命令

使用 prctl 命令,可以对与系统上的活动进程、任务或项目关联的资源控制进行运行时询问和修改。有关更多信息,请参见 prctl(1) 手册页。

Procedure如何使用 prctl 命令显示缺省资源控制值

必须在未设置或更改任何资源控制的系统上使用此过程。/etc/system 文件或 project 数据库中只能有非缺省条目。

  1. 在任意进程(如正在运行的当前 shell)中使用 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                             -
    process.add-crypto-sessions
            privileged        100       -   deny                             -
            system          18.4E     max   deny                             -
    process.min-crypto-sessions
            privileged         20       -   deny                             -
            system          18.4E     max   deny                             -
    process.max-msg-messages
            privileged      8.19K       -   deny                             -
            system          4.29G     max   deny                             -
    process.max-msg-qbytes
            privileged      64.0KB      -   deny                             -
            system          16.0EB    max   deny                             -
    process.max-sem-ops
            privileged        512       -   deny                             -
            system          2.15G     max   deny                             -
    process.max-sem-nsems
            privileged        512       -   deny                             -
            system          32.8K     max   deny                             -
    process.max-address-space
            privileged      16.0EB    max   deny                             -
            system          16.0EB    max   deny                             -
    process.max-file-descriptor
            basic             256       -   deny                        100337
            privileged      65.5K       -   deny                             -
            system          2.15G     max   deny                             -
    process.max-core-size
            privileged      8.00EB    max   deny                             -
            system          8.00EB    max   deny                             -
    process.max-stack-size
            basic           8.00MB      -   deny                        100337
            privileged      8.00EB      -   deny                             -
            system          8.00EB    max   deny                             -
    process.max-data-size
            privileged      16.0EB    max   deny                             -
            system          16.0EB    max   deny                             -
    process.max-file-size
            privileged      8.00EB    max   deny,signal=XFSZ                 -
            system          8.00EB    max   deny                             -
    process.max-cpu-time
            privileged      18.4Es    inf   signal=XCPU                      -
            system          18.4Es    inf   none                             -
    task.max-cpu-time
            system          18.4Es    inf   none                             -
    task.max-lwps
            system          2.15G     max   deny                             -
    project.max-contracts
            privileged      10.0K       -   deny                             -
            system          2.15G     max   deny                             -
    project.max-device-locked-memory
            privileged       499MB      -   deny                             -
            system          16.0EB    max   deny                             -
    project.max-port-ids
            privileged      8.19K       -   deny                             -
            system          65.5K     max   deny                             -
    project.max-shm-memory
            privileged      1.95GB      -   deny                             -
            system          16.0EB    max   deny                             -
    project.max-shm-ids
            privileged        128       -   deny                             -
            system          16.8M     max   deny                             -
    project.max-msg-ids
            privileged        128       -   deny                             -
            system          16.8M     max   deny                             -
    project.max-sem-ids
            privileged        128       -   deny                             -
            system          16.8M     max   deny                             -
    project.max-tasks
            system          2.15G     max   deny                             -
    project.max-lwps
            system          2.15G     max   deny                             -
    project.cpu-shares
            privileged          1       -   none                             -
            system          65.5K     max   none                             -
    zone.max-lwps
            system          2.15G     max   deny                             -
    zone.cpu-shares
            privileged          1       -   none                             -
            system          65.5K     max   none                             -

Procedure如何使用 prctl 命令显示给定资源控制的信息

  1. 显示正在运行的当前 shell 的最大文件描述符。


    # 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     

Procedure如何使用 prctl 临时更改值

此示例过程使用 prctl 命令临时添加一个新的权限值,以便拒绝在每个 x-files 项目中使用三个以上的 LWP。可将此结果与如何为项目中的每个任务设置最大 LWP 数中的结果进行对比。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用 newtask 加入 x-files 项目。


    # newtask -p x-files
    
  3. 使用带有 -p 选项的 id 命令检验是否已加入正确的项目。


    # id -p
    uid=0(root) gid=1(other) projid=101(x-files)
  4. project.max-lwps 添加一个新的权限值,将 LWP 数限制为三个。


    # prctl -n project.max-lwps -t privileged -v 3 -e deny -i project x-files
    
  5. 验证结果。


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

Procedure如何使用 prctl 降低资源控制值

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 使用带有 -r 选项的 prctl 命令更改 process.max-file-descriptor 资源控制的最低值。


    # prctl -n process.max-file-descriptor -r -v 128 $$
    

Procedure如何使用 prctl 显示、替换和检验项目的控制值

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 显示项目 group.staffproject.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 
  3. 将当前 project.cpu-shares1 替换为值 10


    # prctl -n project.cpu-shares -v 10 -r -i project group.staff
    
  4. 显示项目 group.staffproject.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 

使用 rctladm

如何使用 rctladm

使用 rctladm 命令可以对资源控制功能的全局状态进行运行时询问和修改。有关更多信息,请参见 rctladm(1M) 手册页。

例如,您可以使用带有 -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 ]
.
.
.

使用 ipcs

如何使用 ipcs

使用 ipcs 实用程序可以显示有关活动的进程间通信 (interprocess communication, IPC) 功能的信息。有关更多信息,请参见 ipcs(1) 手册页。

您可以使用带有 -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

容量警告

通过对资源控制执行全局操作,可以接收任何实体因资源控制值设置太低而失败的通知。

例如,假设您要确定 Web 服务器是否拥有处理一般工作负荷所需的 CPU。您可以分析 sar 数据以了解空闲的 CPU 时间和平均负荷值。您也可以检查扩展记帐数据以确定针对 Web 服务器进程同时运行的进程数。

但是,比较简单的方法是将 Web 服务器置于任务中。然后,可以使用 syslog 设置全局操作,以便在任务超过对应于计算机容量的预定 LWP 数时通知您。

有关更多信息,请参见 sar(1) 手册页。

Procedure如何确定是否为 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