資源制御機能は、project データベース (第 5 章「プロジェクトとタスク」参照) によって構成されます。資源制御の属性は、project データベースエントリの最後のフィールドで設定します。各資源制御に対応付けられる値は、括弧で囲まれ、コンマ区切りのプレーンテキストとして示されます。 括弧内の値は「action 文節」を示します。各 action 文節は、特権レベル、しきい値、および特定のしきい値に対応付けられたアクションで構成されます。各資源制御は複数の action 文節を持つことができ、各 action 文節もコンマで区切られます。 次のエントリは、プロジェクトエンティティにおけるプロセスごとのアドレス空間制限と、タスクごとの軽量プロセス (LWP) 制限を定義します。
development:101:Developers:::task.max-lwps=(privileged,10,deny); process.max-address-space=(privileged,209715200,deny) |
rctladm(1M) コマンドを使用すると、資源制御機能の実行時に問い合わせや制御機能の変更を広域的に行うことができます。 prctl(1) コマンドを使用すると、資源制御機能の実行時に問い合わせや制御機能の変更をローカルに行うことができます。
次の表に、このリリースで使用できる標準の資源制御を示します。
この表では、各制御によって制約される資源について説明し、project データベースにおけるその資源のデフォルトの単位を示します。デフォルトの単位には次の 2 種類があります。
数量は制限される量を意味します。
インデックスは最大有効識別子を意味します。
したがって、project.cpu-shares は、プロジェクトで使用することが許可されているシェア数を示します。 一方、process.max-file-descriptor は、open(2) システムコールによってプロセスに割り当てられるファイルの最大数を示します。
表 7–1 標準の資源制御
制御名 |
説明 |
デフォルトの単位 |
---|---|---|
project.cpu-shares |
プロジェクトに対して、FSS(7) で使用することが許可されている CPU シェア数 |
数量 (シェア数) |
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 |
プロセスで使用できる、セグメントサイズの総計としての最大アドレス空間 |
サイズ (バイト) |
資源制御のしきい値は、ローカルアクションやロギングなどの広域アクションをトリガーできる実行ポイントを設定します。
各しきい値は、次の 3 種類の特権レベルのいずれかに対応付ける必要があります。
基本値 — 呼び出し元プロセスの所有者が変更できる
特権値 — 特権を持っている呼び出し元 (スーパーユーザー) だけが変更できる
システム値 — オペレーティングシステムによる処理が実行されている間は、固定される
資源制御は、システムまたは資源の提供者によって定義されるシステム値を 1 つ持つことが保証されます。システム値は、オペレーティングシステムが提供できる資源の量を意味します。
特権値はいくつでも定義できます。基本値は 1 つだけ許可されます。特権値を指定しないで実行される操作には、デフォルトで、基本レベルの特権が割り当てられます。
資源制御値の特権レベルは、資源制御ブロックの特権フィールドで、RCTL_BASIC、RCTL_PRIVILEGED、または RCTL_SYSTEM のように定義します。詳細は、getrctl(2) を参照してください。prctl コマンドを使用すると、基本レベルおよび特権レベルに対応付けられている値を変更できます。
資源制御に設定された各しきい値に対して、1 つ以上のアクションを対応付けることができます。
しきい値を超える量の資源要求を拒否できる
しきい値に達した場合は、違反プロセスまたは監視プロセスにシグナルを送信できる
実装上の制限により、しきい値に設定できるアクションは、各制御のグローバルプロパティによって制限されます。次の表に、使用できるシグナルアクションを示します。シグナルの詳細については、signal (3HEAD) を参照してください。
表 7–2 資源制御値に使用できるシグナル
シグナル |
注 |
---|---|
SIGABRT |
|
SIGHUP |
|
SIGTERM |
|
SIGKILL |
|
SIGSTOP |
|
SIGXRES |
|
SIGXFSZ |
RCTL_GLOBAL_FILE_SIZE プロパティ (process.max-file-size) を持つ資源制御だけで使用可能。詳細は rctlblk_set_value(3C) を参照 |
SIGXCPU |
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 ] |
広域フラグは、次のことを示します。
この制御の特権値を下げるのに、スーパーユーザー特権を必要としない
しきい値を超えても、資源へのアクセスは拒否されない
資源がしきい値に達したとき、SIGXCPU を送信できる
RCTL_LOCAL_MAXIMAL が設定されている値は、実際には無限数を意味し、制約はない
資源制御のローカル値とアクションを表示するには、prctl を使用します。
$ prctl -n process.max-cpu-time $$ 353939: -ksh process.max-cpu-time [ lowerable no-deny cpu-time inf ] 18446744073709551615 privileged signal=XCPU [ max ] 18446744073709551615 system deny [ max ] |
この例では、2 つのしきい値の両方に max (RCTL_LOCAL_MAXIMAL) フラグが設定されており、資源制御には inf (RCTL_GLOBAL_INFINITE) フラグが設定されています。したがって、設定されているように、両方のしきい値は無限値を意味し、これらの値を上回ることはありません。
1 つの資源には、複数の資源制御を設定できます。 資源制御は、プロセスモデルの包含レベルごとに 1 つずつ設定できます。 同じ資源上の異なるコンテナレベルで資源制御がアクティブな場合、まず、最も小さいコンテナの制御が実行されます。したがって、process.max-cpu-time と task.max-cpu-time の両方の制御が同時に検出された場合は、まず process.max-cpu-time に対するアクションが実行されます。
プロセスの資源消費が不明な場合がよくあります。 資源消費に関する情報を入手するには、rctladm(1M) で利用できる広域資源制御アクションを使用します。 rctladm を使用して、資源制御に syslog アクションを設定します。 その資源制御が管理するエンティティでしきい値が検出されると、設定したログレベルでシステムメッセージが記録されます。