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

資源制御と属性の構成

資源制御機能は、project データベースによって構成されます。第 2 章プロジェクトとタスク (概要)を参照してください。資源制御とその他の属性は、project データベースエントリの最後のフィールドで設定します。各資源制御に対応付けられる値は、括弧で囲まれ、コンマ区切りのプレーンテキストとして示されます。括弧内の値によって「アクション文節」が構成されます。各アクション文節には、値として特権レベル、しきい値、および特定のしきい値に対応付けられたアクションが含まれます。各資源制御は複数のアクション文節を持つことができ、各アクション文節もコンマで区切られます。次のエントリは、プロジェクトエンティティーにおけるタスクごとの軽量プロセス (LWP) 制限と、プロセスごとの最長 CPU 時間制限を定義します。process.max-cpu-time は、プロセスの実行時間が合計で 1 時間になるとプロセスに SIGTERM を送信し、1 時間 1 分になると SIGKILL を送信します。表 6–3 を参照してください。


development:101:Developers:::task.max-lwps=(privileged,10,deny);
  process.max-cpu-time=(basic,3600,signal=TERM),(priv,3660,signal=KILL)
typed as one line

注 –

ゾーンが有効になっているシステムの場合、ゾーン規模の資源制御はゾーン構成で指定されます。その形式は多少異なります。詳細は、「ゾーン構成データ」を参照してください。


rctladm コマンドを使用すると、資源制御機能の実行時に問い合わせや制御機能の変更を「大域有効範囲」で行うことができます。prctl コマンドを使用すると、実行時に資源制御機能の問い合わせや変更を「局所有効範囲」で行うことができます。

詳細については、「資源制御値に対応付けられた大域アクションと局所アクション」、および rctladm(1M)prctl(1) のマニュアルページを参照してください。


注 –

ゾーンがインストールされているシステムでは、非大域ゾーンで rctladm を使用して設定を変更することはできません。各資源制御の大域ログ状態を表示する場合に、非大域ゾーンで rctladm を使用します。


使用可能な資源制御

次の表に、このリリースで使用できる標準の資源制御を示します。

この表では、各制御によって制約される資源について説明し、project データベースにおけるその資源のデフォルトの単位を示します。デフォルトの単位には次の 2 種類があります。

したがって、project.cpu-shares は、プロジェクトで使用することが許可されている配分を示します。一方、process.max-file-descriptor は、open(2) システムコールによってプロセスに割り当てることができる最大ファイル番号を指定します。

表 6–1 標準の資源制御

制御名 

説明 

デフォルトの単位 

project.cpu-cap

Solaris 10 8/07: 1 つのプロジェクトで消費可能な CPU 資源量に対する絶対的な制限。project.cpu-cap 設定と同様、100 の値は 1 つの CPU の 100% を意味します。125 の値は 125% になります。CPU キャップの使用時は、100% がシステム上の 1 つの CPU の上限となります。

数量 (CPU の数) 

project.cpu-shares

このプロジェクトに対して、公平配分スケジューラ (FSS(7) のマニュアルページを参照) で使用することが許可されている CPU 配分。

数量 (配分) 

project.max-crypto-memory

ハードウェアによる暗号化処理の高速化のために libpkcs11 が使用できるカーネルメモリーの合計量。カーネルバッファーおよびセッション関連の構造体の割り当ては、この資源制御に対してチャージされます。

サイズ (バイト) 

project.max-locked-memory

ロックされる物理メモリーの許容合計量。 

priv_proc_lock_memory がユーザーに割り当てられている場合、そのユーザーがすべてのメモリーをロックするのを防ぐため、この資源制御の設定も検討してください。

Solaris 10 8/07: Solaris 10 8/07 リリースでは、project.max-device-locked-memory は削除され、この資源制御で置き換えられました。

サイズ (バイト) 

project.max-port-ids

イベントポートの許容最大数。 

数量 (イベントポート数)  

project.max-sem-ids

このプロジェクトに許容されるセマフォー ID の最大数。 

数量 (セマフォー ID の数) 

project.max-shm-ids

このプロジェクトに許容される共有メモリー ID の最大数。 

数量 (共有メモリー ID の数) 

project.max-msg-ids

このプロジェクトに許容されるメッセージキュー ID の最大数。 

数量 (メッセージキュー ID の数) 

project.max-shm-memory

このプロジェクトに許容される System V 共有メモリーの合計量。 

サイズ (バイト) 

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

1 回の semop コールに許容されるセマフォー操作の最大数 (semget() のコール時に資源制御からコピーされる値)。

数量 (操作の数) 

process.max-msg-qbytes

メッセージキュー内のメッセージの最大バイト数 (msgget() のコール時に資源制御からコピーされる値)。

サイズ (バイト) 

process.max-msg-messages

メッセージキュー内のメッセージの最大数 (msgget() のコール時に資源制御からコピーされる値)。

数量 (メッセージ数) 

資源制御の設定や変更がまったく行われていないシステム上では、資源制御のデフォルト値を表示できます。そのようなシステムでは、/etc/systemproject データベースにデフォルト以外のエントリが含まれていません。値を表示するには、prctl コマンドを使用します。

ゾーン規模の資源制御

ゾーン規模の資源制御は、ゾーン内のすべてのプロセスエンティティーによる総資源消費を制限します。ゾーン規模の資源制御は、グローバルプロパティー名を使用して設定することもできます。詳細は、「ゾーン規模の資源制御の設定」および 「ゾーンの構成方法」を参照してください。

表 6–2 ゾーン規模の資源制御

制御名 

説明 

デフォルトの単位 

zone.cpu-cap

Solaris 10 5/08: 1 つの非大域ゾーンで消費可能な CPU 資源量に対する絶対的な制限。project.cpu-cap 設定と同様、100 の値は 1 つの CPU の 100% を意味します。125 の値は 125% になります。CPU キャップの使用時は、100% がシステム上の 1 つの CPU の上限となります。

数量 (CPU の数) 

zone.cpu-shares

このゾーンに対する公平配分スケジューラ (FSS) の CPU 配分 

数量 (配分) 

zone.max-locked-memory

ゾーンで使用できるロックされた物理メモリーの合計量。 

priv_proc_lock_memory がゾーンに割り当てられている場合、そのゾーンがすべてのメモリーをロックするのを防ぐため、この資源制御の設定も検討してください。

サイズ (バイト) 

zone.max-lwps

このゾーンで同時に使用できる LWP の最大数 

数量 (LWP 数) 

zone.max-msg-ids

このゾーンに許容されるメッセージキュー ID の最大数 

数量 (メッセージキュー ID の数) 

zone.max-sem-ids

このゾーンに許容されるセマフォー ID の最大数 

数量 (セマフォー ID の数) 

zone.max-shm-ids

このゾーンに許容される共有メモリー ID の最大数 

数量 (共有メモリー ID の数) 

zone.max-shm-memory

このゾーンに許容される System V 共有メモリーの合計量 

サイズ (バイト) 

zone.max-swap

このゾーンのユーザープロセスのアドレス空間マッピングと tmpfs マウントで消費できるスワップの合計量。

サイズ (バイト) 

ゾーン規模の資源制御の構成方法については、「資源タイプのプロパティー」および 「ゾーンの構成方法」を参照してください。lx ブランドゾーンでゾーン規模の資源制御を使用する方法については、lx ブランドゾーンを構成、検証、および確定する方法」を参照してください。

ゾーン規模の資源制御を大域ゾーンに適用することも可能です。詳細は、第 17 章非大域ゾーンの構成 (概要)および 「ゾーンがインストールされている Solaris システムでの公平配分スケジューラの使用」を参照してください。

単位のサポート

資源制御の種類を示す大域フラグは、すべての資源制御に対して定義されます。これらのフラグは、種類に関する基本情報を prctl などのアプリケーションに伝えるために、システムによって使用されます。アプリケーションはこの情報を使用して、次の内容を判定します。

次の大域フラグを使用できます。

大域フラグ 

資源制御の種類ごとの文字列 

修飾子 

倍率 

RCTL_GLOBAL_BYTES 

バイト 

 

KB 

210

 

MB 

220

 

GB 

230

 

TB 

240

 

PB 

250

 

EB 

260

RCTL_GLOBAL_SECONDS 

秒 

 

Ks 

103

 

Ms 

106

 

Gs 

109

 

Ts 

1012

 

Ps 

1015

 

Es 

1018

RCTL_GLOBAL_COUNT 

数 

なし 

 

103

 

106

 

109

 

1012

 

1015

 

1018

資源制御に倍率値を使用できます。次の例は、倍率付きのしきい値を示します。

task.max-lwps=(priv,1K,deny)

注 –

単位修飾子は、prctlprojadd、および projmod コマンドに使用できます。project データベース自体で単位修飾子を使用することはできません。


資源制御値と特権レベル

資源制御のしきい値は、局所アクションのトリガーやログ作成などの大域アクションの発生が可能である実行ポイントを設定します。

資源制御の各しきい値は、特権レベルに対応付ける必要があります。次の 3 種類の特権レベルのいずれかを使用します。

資源制御は、システムまたは資源の提供者によって定義されるシステム値を 1 つ持つことが保証されます。システム値は、オペレーティングシステムが提供できる資源の量を意味します。

特権値はいくつでも定義できます。基本値は 1 つだけ許可されます。特権値を指定しないで実行される操作には、デフォルトで、基本レベルの特権が割り当てられます。

資源制御値の特権レベルは、資源制御ブロックの特権フィールドで、RCTL_BASIC、RCTL_PRIVILEGED、または RCTL_SYSTEM のように定義します。詳細は、setrctl(2) のマニュアルページを参照してください。prctl コマンドを使用すると、基本レベルおよび特権レベルに対応付けられている値を変更できます。

資源制御値に対応付けられた大域アクションと局所アクション

資源制御値に対応付けられるアクションには 、2 種類あります。 大域アクションと局所アクションです。

資源制御値に対応付けられた大域アクション

大域アクションは、システム上のすべての資源制御の資源制御値に適用されます。rctladm コマンド (rctladm(1M) のマニュアルページを参照) を使用すると、次の動作を実行できます。

資源制御に対応付けられた大域ログ作成アクションは、無効にしたり有効にしたりできます。syslog アクションの程度を設定するには、重要度を syslog=level のように割り当てます。level に設定できる値は次のとおりです。

デフォルトでは、資源制御の違反は大域ログ作成では記録されません。Solaris 10 5/08 リリースでは、大域アクションを構成できない資源制御に対して、レベル n/a が追加されました。

資源制御値に対応付けられた局所アクション

局所アクションは、制御値を超えようとしているプロセスに対して実行されます。資源制御に設定された各しきい値に対して、1 つ以上のアクションを対応付けることができます。局所アクションには、3 つの種類があります。 nonedeny、および signal= です。これら 3 つのアクションは、次のように使用されます。

none

しきい値を超える量の資源要求に対して、何のアクションも行いません。このアクションは、アプリケーションの進行に影響を与えることなく、資源の使用状況を監視するのに役立ちます。プロセスが資源制御のしきい値を超えたときに大域メッセージを表示することもできます。ただし、このアクションによってプロセスが影響を受けることはありません。

deny

しきい値を超える量の資源要求を拒否できます。たとえば、task.max-lwps 資源制御に deny アクションが指定されている場合、制御値を超えるような新しいプロセスを作成する fork システムコールは失敗します。fork(2) のマニュアルページを参照してください。

signal=

資源制御値を超えたときに大域シグナルメッセージを送信するアクションを有効にすることができます。プロセスがしきい値を超えると、プロセスにシグナルが送信されます。プロセスがさらに資源を消費しても、追加のシグナルが送信されることはありません。使用できるシグナルの一覧については、表 6–3 を参照してください。

すべての資源制御にすべてのアクションを適用できるわけではありません。たとえば、プロセスは、その所属先のプロジェクトに割り当てられている CPU 配分を超えることはできません。したがって、project.cpu-shares 資源制御に deny アクションを適用することはできません。

実装上の制限により、しきい値に設定できるアクションは、各制御の大域プロパティーによって制限されます。rctladm(1M) のマニュアルページを参照してください。次の表に、使用できるシグナルアクションを示します。シグナルの詳細については、signal(3HEAD) のマニュアルページを参照してください。

表 6–3 資源制御値に使用できるシグナル

シグナル 

説明 

注釈 

SIGABRT 

プロセスを終了します。 

 

SIGHUP 

ハングアップシグナルを送信します。開いた回線上でキャリアが検出されなくなったときに発生します。シグナルは、端末を制御しているプロセスグループに送信されます。 

 

SIGTERM 

プロセスを終了します。ソフトウェアによって送信される終了シグナルです。 

 

SIGKILL 

プロセスを終了し、プログラムを強制終了します。 

 

SIGSTOP 

プロセスを停止します。ジョブ制御シグナルです。 

 

SIGXRES 

資源制御の制限超過です。資源制御機能によって生成されます。 

 

SIGXFSZ 

プロセスを終了します。ファイルサイズの制限超過です。 

RCTL_GLOBAL_FILE_SIZE プロパティー (process.max-file-size) を持つ資源制御だけで使用可能です。詳細は、rctlblk_set_value(3C) のマニュアルページを参照してください。

SIGXCPU 

プロセスを終了します。CPU 時間の制限超過です。 

RCTL_GLOBAL_CPUTIME プロパティー (process.max-cpu-time) を持つ資源制御だけで使用可能です。詳細は、rctlblk_set_value(3C) のマニュアルページを参照してください。

資源制御のフラグとプロパティー

システム上の資源制御には、それぞれ特定のプロパティーセットが対応付けられています。このプロパティーセットは、一連のフラグとして定義されます。これらのフラグは、その資源が制御されているすべてのインスタンスに対応付けられます。大域フラグは変更できませんが、rctladm または getrctl システムコールを使って取得できます。

ローカルフラグは、特定のプロセスまたはプロセス集合に対する資源制御の特定のしきい値について、デフォルトの動作と構成を定義します。あるしきい値のローカルフラグが、同じ資源制御で定義されている別のしきい値の動作に影響することはありません。ただし、大域フラグは、特定の制御に対応付けられているすべての値の動作に影響します。ローカルフラグは、対応する大域フラグによる制約の範囲内で、prctl コマンドまたは setrctl システムコールを使って変更できます。setrctl(2) のマニュアルページを参照してください。

ローカルフラグ、大域フラグ、およびそれらの定義の詳細な一覧については、rctlblk_set_value(3C) のマニュアルページを参照してください。

特定の資源制御がしきい値に達したときのシステムの動作を確認するには、rctladm を使ってその資源制御の大域フラグを表示します。たとえば、process.max-cpu-time の値を表示するには、次のように入力します。


$ rctladm process.max-cpu-time
	process.max-cpu-time  syslog=off  [ lowerable no-deny cpu-time inf seconds ]

大域フラグは、次のことを示します。

lowerable

この制御の特権値を下げるのに、スーパーユーザー特権を必要としません。

no-deny

しきい値を超えても、資源へのアクセスは拒否されません。

cpu-time

資源がしきい値に達したとき、SIGXCPU を送信できます。

seconds

資源制御の時間。

no-basic

特権タイプ basic を持つ資源制御値を設定できません。特権付き資源制御値だけが許可されます。

no-signal

資源制御値に対してローカルのシグナルアクションを設定できません。

no-syslog

この資源制御に対して大域の syslog メッセージアクションを設定できません。

deny

しきい値を超えたときに、必ず資源の要求を拒否します。

count

資源制御のカウント (整数) 値。

bytes

資源制御のサイズの単位。

資源制御のローカル値とアクションを表示するには、prctl コマンドを使用します。


$ prctl -n process.max-cpu-time $$
	process 353939: -ksh
	NAME    PRIVILEGE    VALUE    FLAG   ACTION              RECIPIENT
 process.max-cpu-time
         privileged   18.4Es    inf   signal=XCPU                 -
         system       18.4Es    inf   none 

この例では、2 つのしきい値の両方に max (RCTL_LOCAL_MAXIMAL) フラグが設定されており、資源制御には inf (RCTL_GLOBAL_INFINITE) フラグが設定されています。inf の値は無限大です。この値は制限を与えません。したがって、設定されているように、両方のしきい値は無限大値を意味し、これらの値を上回ることはありません。

資源制御の実行

1 つの資源には、複数の資源制御を設定できます。資源制御は、プロセスモデルの包含レベルごとに 1 つずつ設定できます。同じ資源上の異なるコンテナレベルで資源制御がアクティブな場合、まず、もっとも小さいコンテナの制御が実行されます。したがって、process.max-cpu-timetask.max-cpu-time の両方の制御が同時に検出された場合は、まず process.max-cpu-time に対するアクションが実行されます。

図 6–1 プロセス集合、コンテナの包含関係、およびその資源制御セット

この図では、包含レベルごとに資源制御が設定されています。

資源制御イベントの大域監視

プロセスの資源消費が不明な場合がよくあります。資源消費に関する詳細な情報を入手するには、rctladm コマンドで利用できる大域資源制御アクションを使用してみてください。rctladm を使用して、資源制御に syslog アクションを設定します。その資源制御が管理するエンティティーでしきい値が検出されると、設定したログレベルでシステムメッセージが記録されます。詳細は、第 7 章資源制御の管理 (手順)および rctladm(1M) のマニュアルページを参照してください。