Oracle Solaris のシステム管理 (Oracle Solaris コンテナ : 資源管理と Oracle Solaris ゾーン)

第 7 章 資源制御の管理 (手順)

この章では、資源制御機能を管理する方法について説明します。

資源制御機能の概要については、第 6 章資源制御 (概要)を参照してください。

資源制御の管理 (作業マップ)

タスク 

説明 

説明 

資源制御を設定します。 

/etc/project ファイルでプロジェクトに資源制御を設定します。

「資源制御の設定」

アクティブなプロセス、タスク、またはプロジェクトについて、資源制御値をローカルに取得または変更します。 

システム上のアクティブなプロセス、タスク、またはプロジェクトに関連付けられている資源制御に対し、実行時に問い合わせや変更を行います。 

prctl コマンドの使用」

稼働中のシステムの資源制御の大域的状態を表示または更新します。 

システム全体の各資源制御の大域ログ状態を表示します。また、制御値を超えたときに syslog で記録するログのレベルを設定します。

rctladm の使用」

アクティブなプロセス間通信 (IPC) 機能の状態を報告します。 

アクティブなプロセス間通信 (IPC) 機能について情報を表示します。どの IPC オブジェクトがプロジェクトの使用状況に影響を与えているかを監視します。  

ipcs の使用」

Web サーバーに十分な CPU 容量が割り当てられているかどうかを判定します。 

資源制御に大域アクションを設定します。このアクションを設定すると、資源制御値を超えたエンティティーについて通知を受け取ることができ、資源制御値が低すぎるかどうかを判定できます。 

「Web サーバーに十分な CPU 容量が割り当てられているかどうかを判定する方法」

資源制御の設定

Procedureプロジェクト内の各タスクの最大 LWP 数を設定する方法

この手順では、x-files というプロジェクトを /etc/project ファイルに追加し、このプロジェクト内に作成されるタスクに適用する LWP の最大数を設定します。

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (基本編)』「Solaris 管理ツールを RBAC と組み合わせて使用する (作業マップ)」を参照してください。

  2. projadd コマンドに -K オプションを付けて実行して、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-filesnewtask を使って参加することで新しいタスクを作成したスーパーユーザーは、そのタスクの実行中、LWP を 3 つまでしか作成できません。次の注釈付きのセッション例を参照してください。


# 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. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (基本編)』「Solaris 管理ツールを RBAC と組み合わせて使用する (作業マップ)」を参照してください。

  2. projmod コマンドに -s オプションと -K オプションを付けて実行することで、プロジェクト 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) のマニュアルページを参照してください。

Procedureprctl コマンドを使ってデフォルトの資源制御値を表示する方法

この手順は、資源制御の設定や変更がまったく行われていないシステム上で実行する必要があります。/etc/system ファイルまたは project データベース内には、デフォルト以外のエントリしか記述できません。

  1. 実行中の現在のシェルなど、任意のプロセスに対して 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                             -

Procedureprctl コマンドを使って特定の資源制御の情報を表示する方法

  1. 実行中の現在のシェルの最大ファイル記述子を表示します。


    # 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     

Procedureprctl を使って値を一時的に変更する方法

次の手順では、prctl コマンドを使用して x-files プロジェクトに新しい特権値を一時的に追加し、プロジェクトあたり 4 つ以上の LWP を使用することを拒否します。その結果は、「プロジェクト内の各タスクの最大 LWP 数を設定する方法」の結果と同等になります。

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (基本編)』「Solaris 管理ツールを RBAC と組み合わせて使用する (作業マップ)」を参照してください。

  2. newtask を使って x-files プロジェクトに参加します。


    # newtask -p x-files
    
  3. id コマンドに -p オプションを付けて実行し、正しいプロジェクトに参加できたことを確認します。


    # id -p
    uid=0(root) gid=1(other) projid=101(x-files)
  4. project.max-lwps に新しい特権値を追加して、LWP の数を 3 つまでに制限します。


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

Procedureprctl を使って資源制御値を下げる方法

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (基本編)』「Solaris 管理ツールを RBAC と組み合わせて使用する (作業マップ)」を参照してください。

  2. prctl コマンドに -r オプションを付けて実行し、process.max-file-descriptor 資源制御の最小値を変更します。


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

Procedureprctl を使ってプロジェクトの制御値を表示、置換、確認する方法

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (基本編)』「Solaris 管理ツールを RBAC と組み合わせて使用する (作業マップ)」を参照してください。

  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-shares の現在の値 1 を値 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) のマニュアルページを参照してください。

たとえば、rctladm-e オプションを付けて実行して、資源制御の大域属性 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 ユーティリティーを使用すると、アクティブなプロセス間通信 (IPC) 機能について情報を表示できます。詳細は、ipcs(1) のマニュアルページを参照してください。

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

容量に関する警告

資源制御に対して大域アクションを設定すると、資源制御値を超えたエンティティーに関する通知を受け取ることができ、資源制御値が低すぎるかどうかを判断できます。

たとえば、一般的な作業負荷のための十分な CPU 資源が Web サーバーに割り当てられているかどうかを確認する場合を考えます。この容量は、sar データで CPU のアイドル時間と平均負荷率を解析すれば判定できます。また、拡張アカウンティングデータを調べて、Web サーバープロセスで同時に実行しているプロセス数を確認することもできます。

より簡単な方法は、Web サーバーをタスクに配置することです。その上で、syslog を使って大域アクションを設定すると、タスクがマシンの性能に適した LWP の計画数を上回ったときに、警告が通知されます。

詳細は、sar(1) のマニュアルページを参照してください。

ProcedureWeb サーバーに十分な 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