Go to main content
リソース管理および Oracle® Solaris ゾーン開発者ガイド

印刷ビューの終了

更新: 2016 年 11 月
 
 

リソース制御のフラグとアクション

このセクションでは、リソース制御に関連したフラグ、アクション、およびシグナルについて説明します。

rlimit、リソース制限

rlimit はプロセスベースです。rlimit は、プロセスによるさまざまなシステムリソースの消費に制限の境界を設けます。プロセスが作成する各プロセスは元のプロセスを継承します。リソース制限は値のペアによって定義されます。これらの値は、現在の (ソフト) 制限と最大の (ハード) 制限を指定します。

プロセスによって、ハードリミットがソフトリミット以上の値に不可逆的に下げられる可能性があります。ルート ID を持つプロセスだけがハード制限を引き上げることができます。setrlimit() および getrlimit() を参照してください。

rlimit 構造体には、ソフト制限とハード制限を定義する 2 つのメンバーが含まれます。

rlim_t     rlim_cur;       /* current (soft) limit */
rlim_t     rlim_max        /* hard limit */

rctl、リソース制御

rctl は、プロジェクトデータベース内で定義されたプロセス、タスク、およびプロジェクトによるリソース消費を制御することで、rlimit のプロセスベース制限を拡張します。


注 - リソース制限の設定には、rlimit の使用よりも rctl メカニズムが推奨されます。rlimit 機能を使用する唯一の理由は、UNIX プラットフォーム間の移植性が求められる場合です。

アプリケーションは、アプリケーションがリソース制御を処理する方法に応じて、次の幅広いカテゴリに分類されます。行われるアクションに基づいて、リソース制御をさらに分類できます。ほとんどはエラーを報告して操作を終了します。その他のリソース制御では、アプリケーションが操作を再開し、削減されたリソース使用率に適応できます。増加する値での漸進的な一連のアクションを各リソース制御に対して指定できます。

リソース制御の属性リストは、特権レベル、しきい値、しきい値を超えた場合に実行されるアクションで構成されます。

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

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

RCPRIV_BASIC

特権レベルは呼び出し元プロセスの所有者が変更できます。RCPRIV_BASIC はリソースのソフトリミットに関連付けられています。

RCPRIV_PRIVILEGED

特権レベルは特権を持っている呼び出し元 (root) だけが変更できます。RCPRIV_PRIVILEGED はリソースのハードリミットに関連付けられています。

setrctl(2) は大域ゾーンの特権ユーザーとして呼び出された場合にのみ成功します。非大域ゾーン内では、root はゾーン規模の制御を設定できません。

RCPRIV_SYSTEM

特権レベルはオペレーティングシステムインスタンスの期間中は固定されたままです。

図 4 は、/etc/project ファイルの process.max-cpu-time リソース制御によって定義されるシグナルの特権レベルを設定する際のタイムラインを示しています。

ローカルアクションとローカルフラグ

ローカルアクションとローカルフラグは、このリソース制御ブロックで表される現在のリソース制御値に適用されます。ローカルアクションとローカルフラグは値固有です。リソース制御に設定される各しきい値に対して、次のローカルアクションとローカルフラグを使用できます。

RCTL_LOCAL_NOACTION

このリソース制御値を超えた場合に実行されるローカルアクションはありません。

RCTL_LOCAL_SIGNAL

rctlblk_set_local_action() によって設定された指定のシグナルが、値シーケンス内にこのリソース制御値を配置したプロセスに送信されます。

RCTL_LOCAL_DENY

このリソース制御値が検出された場合、リソースの要求は拒否されます。この制御に RCTL_GLOBAL_DENY_ALWAYS が設定されている場合、すべての値で設定されます。この制御に RCTL_GLOBAL_DENY_NEVER が設定されている場合、すべての値でクリアされます。

RCTL_LOCAL_MAXIMAL

このリソース制御値は、この制御のリソースの最大量に対するリクエストを表します。このリソース制御に RCTL_GLOBAL_INFINITE が設定されている場合、RCTL_LOCAL_MAXIMAL は決して超えることのない無制限のリソース制御値を示します。

大域アクションと大域フラグ

大域フラグは、このリソース制御ブロックで表される現在のすべてのリソース制御値に適用されます。大域アクションと大域フラグは rctladm(1M) によって設定されます。大域アクションと大域フラグは setrctl() と一緒に設定することはできません。大域フラグはすべてのリソース制御に適用されます。リソース制御に設定される各しきい値に対して、次の大域アクションと大域フラグを使用できます。

RCTL_GLOBAL_NOACTION

この制御でリソース制御値を超えた場合に実行される大域アクションはありません。

RCTL_GLOBAL_SYSLOG

この制御に関連付けられたシーケンス上でリソース制御値を超えた場合、syslog() 機能によって標準メッセージが記録されます。

RCTL_GLOBAL_SECONDS

制限値の単位の文字列を秒として定義します。

RCTL_GLOBAL_COUNT

制限値の単位の文字列を数として定義します。

RCTL_GLOBAL_BYTES

制限値の単位の文字列をバイトとして定義します。

RCTL_GLOBAL_SYSLOG_NEVER

フラグは rctladm(1M) を使用してこのリソース制御に RCTL_GLOBAL_SYSLOG を設定できないことを意味します。

RCTL_GLOBAL_NOBASIC

RCPRIV_BASIC 特権を持つ値はこの制御では許可されません。

RCTL_GLOBAL_LOWERABLE

権限を持たない呼び出し元が、この制御の特権付きリソース制御値の値を下げることができます。

RCTL_GLOBAL_DENY_ALWAYS

この制御で制御値を超えた場合に実行されるアクションに、常にリソースの拒否が含まれます。

RCTL_GLOBAL_DENY_NEVER

この制御で制御値を超えた場合に実行されるアクションから、常にリソースの拒否が除外されます。リソースは常に許可されますが、ほかのアクションも実行できます。

RCTL_GLOBAL_FILE_SIZE

ローカルアクションの有効なシグナルに SIGXFSZ シグナルが含まれます。

RCTL_GLOBAL_CPU_TIME

ローカルアクションの有効なシグナルに SIGXCPU シグナルが含まれます。

RCTL_GLOBAL_SIGNAL_NEVER

この制御で許可されるローカルアクションはありません。リソースは常に許可されます。

RCTL_GLOBAL_INFINITE

このリソース制御は無制限値の概念をサポートしています。通常、無制限値は CPU 時間のような蓄積型のリソースにのみ適用されます。

RCTL_GLOBAL_UNOBSERVABLE

通常、タスクまたはプロジェクトに関連するリソース制御は、監視用の制御値をサポートしません。タスクまたはプロセスに設定された RCPRIV_BASIC 特権制御値は、値を設定したプロセスがこの値を超えた場合にのみアクションを生成します。

ゾーン、プロジェクト、プロセス、およびタスクに関連付けられたリソース制御セット

次の図は、ゾーン、タスク、プロセス、およびプロジェクトに関連付けられたリソース制御セットを示しています。

図 3  ゾーン、タスク、プロジェクト、およびプロセスのリソース制御セット

image:図は、ゾーン、タスク、プロジェクト、およびプロセスのリソース制御セットを示しています。

プロセスモデルの包含レベルごとにリソース制御を設定して、1 つのリソースに複数のリソース制御を設定できます。プロセスと集合タスクまたは集合プロジェクトの両方に対して、同じリソースでリソース制御をアクティブにできます。この場合、プロセスに対するアクションが優先されます。たとえば、両方の制御が同時に検出された場合は、task.max-cpu-time の前に process.max-cpu-time に対するアクションが実行されます。

プロジェクトに関連付けられたリソース制御

プロジェクトに関連付けられたリソース制御には次が含まれます。

project.cpu-cap

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

project.cpu-shares

公平配分スケジューラ FSS(7) と一緒に使用する際にこのプロジェクトに付与される CPU 配分の数。

project.max-crypto-memory

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

project.max-locked-memory

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

project.max-device-locked-memory (これは削除されています) が、このリソース制御に置き換えられたことに注意してください。

project.max-msg-ids

1 つのプロジェクトに許容される System V メッセージキューの最大数。

project.max-port-ids

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

project.max-processes

このプロセスで同時に使用できるプロセステーブルスロットの最大数。


注 - 通常のプロセスとゾンビプロセスはどちらもプロセステーブルスロットを占有します。そのため、max-processes リソース制御はゾンビプロセスによってプロセステーブルが使い果たされるのを防ぎます。ゾンビプロセスには定義上 LWP が含まれないため、ゾンビプロセスがプロセステーブルを使い尽くすのを max-lwps で防ぐことはできません。
project.max-sem-ids

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

project.max-shm-ids

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

project.max-msg-ids

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

project.max-shm-memory

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

project.max-lwps

このプロジェクトで同時に使用できる LWP の最大数。

project.max-tasks

このプロジェクトに許容されるタスクの最大数

project.max-contracts

このプロジェクトに許容される契約の最大数

タスクに関連付けられたリソース制御

タスクに関連付けられたリソース制御には次が含まれます。

task.max-cpu-time

このタスクのプロセスで使用できる最長 CPU 時間 (秒)。

task.max-lwps

このタスクのプロセスで同時に使用できる LWP の最大数。

task.max-processes

このタスクのプロセスで同時に使用できるプロセステーブルスロットの最大数。


注 - 通常のプロセスとゾンビプロセスはどちらもプロセステーブルスロットを占有します。そのため、max-processes リソース制御はゾンビプロセスによってプロセステーブルが使い果たされるのを防ぎます。ゾンビプロセスには定義上 LWP が含まれないため、ゾンビプロセスがプロセステーブルを使い尽くすのを max-lwps で防ぐことはできません。

プロセスに関連付けられたリソース制御

プロセスに関連付けられたリソース制御には次が含まれます。

process.max-address-space

このプロセスで使用できる、セグメントサイズの総計としての最大アドレス空間 (バイト)。

process.max-core-size

プロセスによって作成されるコアファイルの最大サイズ (バイト)。

process.max-cpu-time

このプロセスで使用できる最長 CPU 時間 (秒)。

process.max-file-descriptor

このプロセスで使用できる最大のファイル記述子インデックス。

process.max-file-size

このプロセスでの書き込みに使用できる最大ファイルオフセット (バイト)。

process.max-msg-messages

メッセージキュー上のメッセージの最大数。この値は msgget() 時にリソース制御からコピーされます。

process.max-msg-qbytes

メッセージキュー上のメッセージの最大数 (バイト)。この値は msgget() 時にリソース制御からコピーされます。新しい project.max-msg-qbytes の値を設定した場合、そのあとに作成される値でのみ初期化が行われます。新しい project.max-msg-qbytes の値は既存の値に影響しません。

process.max-sem-nsems

1 つのセマフォーセットに許容されるセマフォーの最大数。

process.max-sem-ops

1 つの semop() 呼び出しに許容されるセマフォー操作の最大数。この値は msgget() 時にリソース制御からコピーされます。新しい project.max-sem-ops の値はそのあとに作成される値の初期化にのみ影響し、既存の値には影響しません。

process.max-port-events

イベントポートごとに許容されるイベントの最大数。

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

ゾーン規模のリソース制御は、ゾーンがインストールされたシステムで使用できます。ゾーン規模のリソース制御は、ゾーン内のすべてのプロセスエンティティーによる総リソース消費を制限します。

zone.cpu-cap

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

zone.cpu-shares

ゾーンに対する公平配分スケジューラ (FSS) のCPU 配分の数の制限。スケジューリングクラスは FSS である必要があります。CPU 配分は、まずゾーンに対して割り当てられたあとで、project.cpu-shares エントリの指定に従って、ゾーン内のプロジェクトに分配されます。zone.cpu-shares の数が大きいゾーンは、配分数が少ないゾーンよりも多くの CPU を使用できます。

zone.max-locked-memory

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

zone.max-lofi

ゾーンによって作成できる lofi デバイスの最大数。

zone.max-lwps

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

zone.max-msg-ids

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

zone.max-processes

このゾーンで同時に使用できるプロセステーブルスロットの最大数


注 - zone.max-processes リソース制御は、1 つのゾーンがあまりに多くのプロセステーブルスロットを消費してほかのゾーンに影響を与えるのを防ぐことによって、リソースの隔離性を高めます。ゾーン内のプロジェクト間でのプロセステーブルスロットリソースの割り当ては、project.max-processes リソース制御を使用して制御できます。この制御のグローバルプロパティー名は max-processes です。zone.max-processes リソース制御は、zone.max-lwps リソース制御を含むこともできます。zone.max-processes が設定されていて zone.max-lwps が設定されていない場合、zone.max-lwps はゾーンのブート時に暗黙的に zone.max-processes の 10 倍に設定されます。

通常のプロセスとゾンビプロセスはどちらもプロセステーブルスロットを占有します。そのため、max-processes リソース制御はゾンビプロセスによってプロセステーブルが使い果たされるのを防ぎます。ゾンビプロセスには定義上 LWP が含まれないため、ゾンビプロセスがプロセステーブルを使い尽くすのを max-lwps で防ぐことはできません。


zone.max-sem-ids

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

zone.max-shm-ids

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

zone.max-shm-memory

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

zone.max-swap

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

詳細は、Oracle Solaris 11.3 でのリソースの管理 の ゾーン規模のリソース制御を参照してください。

ゾーン規模のリソース制御の構成については、Oracle Solaris ゾーン構成リソース の 第 1 章, 非大域ゾーンの構成およびOracle Solaris ゾーンの作成と使用 の 第 1 章, 非大域ゾーンの計画および構成方法を参照してください。

zonecfg コマンドを使用して、非大域ゾーンがインストールされたシステムの大域ゾーンにゾーン規模のリソース制御を適用できます。また、setctrl コマンドは大域ゾーンの特権ユーザーとして呼び出された場合にのみ成功します。非大域ゾーン内では、root はゾーン規模のリソース制御を設定できません。

リソース制御で使用するシグナル

リソース制御に設定された各しきい値に対して、次の制限付きシグナルセットを使用できます。

SIGBART

プロセスを終了します。

SIGXRES

リソース制御の制限を超えた場合にリソース制御機能によって生成されるシグナル。

SIGHUP

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

SIGSTOP

ジョブ制御シグナル。プロセスを停止します。端末以外からの停止シグナル。

SIGTERM

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

SIGKILL

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

SIGXFSX

プロセスを終了します。ファイルサイズの制限超過です。RCTL_GLOBAL_FILE_SIZE プロパティーを持つリソース制御でのみ使用できます。

SIGXCPU

プロセスを終了します。CPU 時間の制限超過です。RCTL_GLOBAL_CPUTIME プロパティーを持つリソース制御でのみ使用できます。

特定の制御のグローバルプロパティーに起因して、その他のシグナルが許可される場合があります。


注 - 不正なシグナルが指定された setrctl() の呼び出しは失敗します。

図 4  シグナルに対する権限レベルの設定

image:シグナルに対する権限レベルの設定