Go to main content
Oracle® Solaris 11.3 でのリソースの管理

印刷ビューの終了

更新: 2016 年 11 月
 
 

リソース制御と属性の構成

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

development:101:Developers:::task.max-lwps=(privileged,10,deny);
  process.max-cpu-time=(basic,3600,signal=TERM),(priv,3660,signal=KILL)
1 行で入力します

注 -  ゾーンが有効になっているシステムの場合、ゾーン規模のリソース制御はゾーン構成で指定されます。その形式は多少異なります。Oracle Solaris ゾーン構成リソース の ゾーン規模のリソース制御の設定を参照してください。

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

詳細については、リソース制御値に対応付けられた大域アクションと局所アクション、および rctladm(1M)prctl(1) を参照してください。


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

使用可能なリソース制御

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

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

  • 数量は制限される量を意味します。

  • インデックスは最大有効識別子を意味します。

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

表 1  標準のプロジェクト、タスク、およびプロセスのリソース制御
制御名
説明
デフォルトの単位
project.cpu-cap
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 がユーザーに割り当てられている場合、そのユーザーがすべてのメモリーをロックするのを防ぐため、このリソース制御の設定も検討してください。
project.max-device-locked-memory (これは削除されています) が、このリソース制御に置き換えられたことに注意してください。
サイズ (バイト)
project.max-msg-ids
このプロジェクトに許容されるメッセージキュー ID の最大数。
数量 (メッセージキュー ID の数)
project.max-port-ids
イベントポートの許容最大数。
数量 (イベントポート数)
project.max-processes
このプロセスで同時に使用できるプロセステーブルスロットの最大数。
正常なプロセスとゾンビプロセスの両方がプロセステーブルスロットを占有するため、max-processes 制御がプロセステーブルを消費しつくすゾンビプロセスから保護します。ゾンビプロセスには本来 LWP がないため、max-lwps 制御がこのゾンビプロセス発生の可能性から保護することはできません。
数量 (プロセステーブルスロット数)
project.max-sem-ids
このプロジェクトに許容されるセマフォー ID の最大数。
数量 (セマフォー ID の数)
project.max-shm-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 数)
task.max-processes
このタスクのプロセスで同時に使用できるプロセステーブルスロットの最大数。
数量 (プロセステーブルスロット数)
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 コマンドを使用します。

ゾーン規模のリソース制御

ゾーン規模のリソース制御は、ゾーン内のすべてのプロセスエンティティーによる総リソース消費を制限します。Oracle Solaris ゾーン構成リソース の 構成可能なリソースとプロパティーで説明されているとおり、ゾーン規模のリソース制御は、グローバルプロパティー名を使用して設定することもできます。

表 2  ゾーンのリソース制御
制御名
説明
デフォルトの単位
zone.cpu-cap
1 つの非大域ゾーンで消費可能な CPU リソース量に対する絶対的な制限。
project.cpu-cap 設定と同様、100 の値は 1 つの CPU の 100% を意味します。125 の値は 125% になります。CPU キャップの使用時は、100% がシステム上の 1 つの CPU の上限となります。
数量 (CPU の数)
zone.cpu-shares
このゾーンに対する公平配分スケジューラ (FSS) の CPU 配分
数量 (配分)
zone.max-lofi
ゾーンによって作成できる lofi デバイスの最大数。
この値は、各ゾーンのマイナーノード名前空間の使用法を制限します。
数量 (lofi デバイスの数)
zone.max-locked-memory
ゾーンで使用できるロックされた物理メモリーの合計量。
priv_proc_lock_memory がゾーンに割り当てられている場合、そのゾーンがすべてのメモリーをロックするのを防ぐため、このリソース制御の設定も検討してください。
サイズ (バイト)
zone.max-lwps
このゾーンで同時に使用できる LWP の最大数
数量 (LWP 数)
zone.max-msg-ids
このゾーンに許容されるメッセージキュー ID の最大数
数量 (メッセージキュー ID の数)
zone.max-processes
このゾーンで同時に使用できるプロセステーブルスロットの最大数。
正常なプロセスとゾンビプロセスの両方がプロセステーブルスロットを占有するため、max-processes 制御がプロセステーブルを消費しつくすゾンビから保護します。ゾンビプロセスには本来 LWP がないため、max-lwps 制御がこのゾンビプロセス発生の可能性から保護することはできません。
数量 (プロセステーブルスロット数)
zone.max-sem-ids
このゾーンに許容されるセマフォー ID の最大数
数量 (セマフォー ID の数)
zone.max-shm-ids
このゾーンに許容される共有メモリー ID の最大数
数量 (共有メモリー ID の数)
zone.max-shm-memory
このゾーンに許容される System V 共有メモリーの合計量
サイズ (バイト)
zone.max-swap
このゾーンのユーザープロセスのアドレス空間マッピングと tmpfs マウントで消費できるスワップの合計量。
サイズ (バイト)

ゾーン規模のリソース制御の構成については、リソース制御と属性の構成およびOracle Solaris ゾーン構成リソース の ゾーン規模のリソース制御の設定を参照してください。

ゾーン規模のリソース制御を大域ゾーンに適用することも可能です。

単位のサポート

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

  • 各リソース制御に適した単位の文字列

  • 倍率値を解釈するときに使用する正しい倍率

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

大域フラグ
リソース制御の種類ごとの文字列
修飾子
倍率
RCTL_GLOBAL_BYTES
バイト
B
1
KB
210
MB
220
GB
230
TB
240
PB
250
EB
260
RCTL_GLOBAL_SECONDS
s
1
Ks
103
Ms
106
Gs
109
Ts
1012
Ps
1015
Es
1018
RCTL_GLOBAL_COUNT
なし
1
K
103
M
106
G
109
T
1012
P
1015
E
1018

リソース制御に倍率値を使用できます。次の例は、倍率付きのしきい値を示します。

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

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

リソース制御値と特権レベル

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

リソース制御の各しきい値は、特権レベルに関連付ける必要があります。次の 3 種類の特権レベルのいずれかを使用します。

  • 基本値 — 呼び出し元プロセスの所有者が変更できます

  • 特権値 — 特権を持っている呼び出し元 (root) だけが変更できます

  • システム値 — オペレーティングシステムによる処理が実行されている間は、固定されます

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

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

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

リソース制御値に対応付けられた大域アクションと局所アクション

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

リソース制御値に対応付けられた大域アクション

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

  • アクティブなシステムリソース制御の大域的状態を表示します

  • 大域ログ作成アクションを設定します

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

  • debug

  • info

  • notice

  • warning

  • err

  • crit

  • alert

  • emerg

デフォルトでは、リソース制御の違反は大域ログ作成では記録されません。レベル n/a は、大域アクションを構成できないリソース制御を示します。

リソース制御値に対応付けられた局所アクション

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

none

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

deny

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

signal=

リソース制御値を超えたときに大域シグナルメッセージを送信するアクションを有効にすることができます。プロセスがしきい値を超えると、プロセスにシグナルが送信されます。プロセスがさらにリソースを消費しても、追加のシグナルが送信されることはありません。使用可能なシグナルは表 3にリストされています。

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

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

表 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 つずつ設定できます。同じリソース上の異なるコンテナレベルでリソース制御がアクティブな場合、まず、もっとも小さいコンテナの制御が実行されます。このため、両方の制御が同時に検出された場合は、task.max-cpu-time の前に process.max-cpu-time に対するアクションが実行されます。

図 3  プロセス集合、コンテナの包含関係、およびそのリソース制御セット

image:この図では、包含レベルごとにリソース制御が設定されています。

リソース制御イベントの大域モニタリング

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