このセクションでは、リソース制御に関連したフラグ、アクション、およびシグナルについて説明します。
rlimit はプロセスベースです。rlimit は、プロセスによるさまざまなシステムリソースの消費に制限の境界を設けます。プロセスが作成する各プロセスは元のプロセスを継承します。リソース制限は値のペアによって定義されます。これらの値は、現在の (ソフト) 制限と最大の (ハード) 制限を指定します。
プロセスによって、ハードリミットがソフトリミット以上の値に不可逆的に下げられる可能性があります。ルート ID を持つプロセスだけがハード制限を引き上げることができます。setrlimit() および getrlimit() を参照してください。
rlimit 構造体には、ソフト制限とハード制限を定義する 2 つのメンバーが含まれます。
rlim_t rlim_cur; /* current (soft) limit */ rlim_t rlim_max /* hard limit */
rctl は、プロジェクトデータベース内で定義されたプロセス、タスク、およびプロジェクトによるリソース消費を制御することで、rlimit のプロセスベース制限を拡張します。
アプリケーションは、アプリケーションがリソース制御を処理する方法に応じて、次の幅広いカテゴリに分類されます。行われるアクションに基づいて、リソース制御をさらに分類できます。ほとんどはエラーを報告して操作を終了します。その他のリソース制御では、アプリケーションが操作を再開し、削減されたリソース使用率に適応できます。増加する値での漸進的な一連のアクションを各リソース制御に対して指定できます。
リソース制御の属性リストは、特権レベル、しきい値、しきい値を超えた場合に実行されるアクションで構成されます。
リソース制御の各しきい値は、次のいずれかの特権レベルに関連付けられている必要があります。
特権レベルは呼び出し元プロセスの所有者が変更できます。RCPRIV_BASIC はリソースのソフトリミットに関連付けられています。
特権レベルは特権を持っている呼び出し元 (root) だけが変更できます。RCPRIV_PRIVILEGED はリソースのハードリミットに関連付けられています。
setrctl(2) は大域ゾーンの特権ユーザーとして呼び出された場合にのみ成功します。非大域ゾーン内では、root はゾーン規模の制御を設定できません。
特権レベルはオペレーティングシステムインスタンスの期間中は固定されたままです。
図 4 は、/etc/project ファイルの process.max-cpu-time リソース制御によって定義されるシグナルの特権レベルを設定する際のタイムラインを示しています。
ローカルアクションとローカルフラグは、このリソース制御ブロックで表される現在のリソース制御値に適用されます。ローカルアクションとローカルフラグは値固有です。リソース制御に設定される各しきい値に対して、次のローカルアクションとローカルフラグを使用できます。
このリソース制御値を超えた場合に実行されるローカルアクションはありません。
rctlblk_set_local_action() によって設定された指定のシグナルが、値シーケンス内にこのリソース制御値を配置したプロセスに送信されます。
このリソース制御値が検出された場合、リソースの要求は拒否されます。この制御に RCTL_GLOBAL_DENY_ALWAYS が設定されている場合、すべての値で設定されます。この制御に RCTL_GLOBAL_DENY_NEVER が設定されている場合、すべての値でクリアされます。
このリソース制御値は、この制御のリソースの最大量に対するリクエストを表します。このリソース制御に RCTL_GLOBAL_INFINITE が設定されている場合、RCTL_LOCAL_MAXIMAL は決して超えることのない無制限のリソース制御値を示します。
大域フラグは、このリソース制御ブロックで表される現在のすべてのリソース制御値に適用されます。大域アクションと大域フラグは rctladm(1M) によって設定されます。大域アクションと大域フラグは setrctl() と一緒に設定することはできません。大域フラグはすべてのリソース制御に適用されます。リソース制御に設定される各しきい値に対して、次の大域アクションと大域フラグを使用できます。
この制御でリソース制御値を超えた場合に実行される大域アクションはありません。
この制御に関連付けられたシーケンス上でリソース制御値を超えた場合、syslog() 機能によって標準メッセージが記録されます。
制限値の単位の文字列を秒として定義します。
制限値の単位の文字列を数として定義します。
制限値の単位の文字列をバイトとして定義します。
フラグは rctladm(1M) を使用してこのリソース制御に RCTL_GLOBAL_SYSLOG を設定できないことを意味します。
RCPRIV_BASIC 特権を持つ値はこの制御では許可されません。
権限を持たない呼び出し元が、この制御の特権付きリソース制御値の値を下げることができます。
この制御で制御値を超えた場合に実行されるアクションに、常にリソースの拒否が含まれます。
この制御で制御値を超えた場合に実行されるアクションから、常にリソースの拒否が除外されます。リソースは常に許可されますが、ほかのアクションも実行できます。
ローカルアクションの有効なシグナルに SIGXFSZ シグナルが含まれます。
ローカルアクションの有効なシグナルに SIGXCPU シグナルが含まれます。
この制御で許可されるローカルアクションはありません。リソースは常に許可されます。
このリソース制御は無制限値の概念をサポートしています。通常、無制限値は CPU 時間のような蓄積型のリソースにのみ適用されます。
通常、タスクまたはプロジェクトに関連するリソース制御は、監視用の制御値をサポートしません。タスクまたはプロセスに設定された RCPRIV_BASIC 特権制御値は、値を設定したプロセスがこの値を超えた場合にのみアクションを生成します。
次の図は、ゾーン、タスク、プロセス、およびプロジェクトに関連付けられたリソース制御セットを示しています。
図 3 ゾーン、タスク、プロジェクト、およびプロセスのリソース制御セット
プロセスモデルの包含レベルごとにリソース制御を設定して、1 つのリソースに複数のリソース制御を設定できます。プロセスと集合タスクまたは集合プロジェクトの両方に対して、同じリソースでリソース制御をアクティブにできます。この場合、プロセスに対するアクションが優先されます。たとえば、両方の制御が同時に検出された場合は、task.max-cpu-time の前に process.max-cpu-time に対するアクションが実行されます。
プロジェクトに関連付けられたリソース制御には次が含まれます。
1 つのプロジェクトで消費可能な CPU リソース量に対する絶対的な制限。project.cpu-cap 設定と同様、100 の値は 1 つの CPU の 100% を意味します。125 の値は 125% になります。CPU キャップの使用時は、100% がシステム上の 1 つの CPU の上限となります。
公平配分スケジューラ FSS(7) と一緒に使用する際にこのプロジェクトに付与される CPU 配分の数。
ハードウェアによる暗号化処理の高速化のために libpkcs11 が使用できるカーネルメモリーの合計量。カーネルバッファーおよびセッション関連の構造体の割り当ては、このリソース制御に対してチャージされます。
ロックされる物理メモリーの許容合計量。
project.max-device-locked-memory (これは削除されています) が、このリソース制御に置き換えられたことに注意してください。
1 つのプロジェクトに許容される System V メッセージキューの最大数。
イベントポートの許容最大数。
このプロセスで同時に使用できるプロセステーブルスロットの最大数。
1 つのプロジェクトに許容されるセマフォー ID の最大数。
このプロジェクトに許容される共有メモリー ID の最大数。
このプロジェクトに許容されるメッセージキュー ID の最大数。
このプロジェクトに許容される System V 共有メモリーの合計量。
このプロジェクトで同時に使用できる LWP の最大数。
このプロジェクトに許容されるタスクの最大数
このプロジェクトに許容される契約の最大数
このタスクのプロセスで使用できる最長 CPU 時間 (秒)。
このタスクのプロセスで同時に使用できる LWP の最大数。
このタスクのプロセスで同時に使用できるプロセステーブルスロットの最大数。
このプロセスで使用できる、セグメントサイズの総計としての最大アドレス空間 (バイト)。
プロセスによって作成されるコアファイルの最大サイズ (バイト)。
このプロセスで使用できる最長 CPU 時間 (秒)。
このプロセスで使用できる最大のファイル記述子インデックス。
このプロセスでの書き込みに使用できる最大ファイルオフセット (バイト)。
メッセージキュー上のメッセージの最大数。この値は msgget() 時にリソース制御からコピーされます。
メッセージキュー上のメッセージの最大数 (バイト)。この値は msgget() 時にリソース制御からコピーされます。新しい project.max-msg-qbytes の値を設定した場合、そのあとに作成される値でのみ初期化が行われます。新しい project.max-msg-qbytes の値は既存の値に影響しません。
1 つのセマフォーセットに許容されるセマフォーの最大数。
1 つの semop() 呼び出しに許容されるセマフォー操作の最大数。この値は msgget() 時にリソース制御からコピーされます。新しい project.max-sem-ops の値はそのあとに作成される値の初期化にのみ影響し、既存の値には影響しません。
イベントポートごとに許容されるイベントの最大数。
ゾーン規模のリソース制御は、ゾーンがインストールされたシステムで使用できます。ゾーン規模のリソース制御は、ゾーン内のすべてのプロセスエンティティーによる総リソース消費を制限します。
1 つの非大域ゾーンで消費可能な CPU リソース量に対する絶対的な制限。project.cpu-cap 設定と同様、100 の値は 1 つの CPU の 100% を意味します。125 の値は 125% になります。CPU キャップの使用時は、100% がシステム上の 1 つの CPU の上限となります。
ゾーンに対する公平配分スケジューラ (FSS) のCPU 配分の数の制限。スケジューリングクラスは FSS である必要があります。CPU 配分は、まずゾーンに対して割り当てられたあとで、project.cpu-shares エントリの指定に従って、ゾーン内のプロジェクトに分配されます。zone.cpu-shares の数が大きいゾーンは、配分数が少ないゾーンよりも多くの CPU を使用できます。
ゾーンで使用できるロックされた物理メモリーの合計量。
ゾーンによって作成できる lofi デバイスの最大数。
このゾーンで同時に使用できる LWP の最大数
このゾーンに許容されるメッセージキュー ID の最大数
このゾーンで同時に使用できるプロセステーブルスロットの最大数
通常のプロセスとゾンビプロセスはどちらもプロセステーブルスロットを占有します。そのため、max-processes リソース制御はゾンビプロセスによってプロセステーブルが使い果たされるのを防ぎます。ゾンビプロセスには定義上 LWP が含まれないため、ゾンビプロセスがプロセステーブルを使い尽くすのを max-lwps で防ぐことはできません。
このゾーンに許容されるセマフォー ID の最大数
このゾーンに許容される共有メモリー ID の最大数
このゾーンに許容される共有メモリーの合計量
このゾーンのユーザープロセスのアドレス空間マッピングと tmpfs マウントで消費できるスワップの合計量。
詳細は、Oracle Solaris 11.3 でのリソースの管理 の ゾーン規模のリソース制御を参照してください。
ゾーン規模のリソース制御の構成については、Oracle Solaris ゾーン構成リソース の 第 1 章, 非大域ゾーンの構成およびOracle Solaris ゾーンの作成と使用 の 第 1 章, 非大域ゾーンの計画および構成方法を参照してください。
zonecfg コマンドを使用して、非大域ゾーンがインストールされたシステムの大域ゾーンにゾーン規模のリソース制御を適用できます。また、setctrl コマンドは大域ゾーンの特権ユーザーとして呼び出された場合にのみ成功します。非大域ゾーン内では、root はゾーン規模のリソース制御を設定できません。
リソース制御に設定された各しきい値に対して、次の制限付きシグナルセットを使用できます。
プロセスを終了します。
リソース制御の制限を超えた場合にリソース制御機能によって生成されるシグナル。
開いた回線上でキャリアが検出されなくなった場合に、端末を制御しているプロセスグループにハングアップシグナルである SIGHUP が送信されます。
ジョブ制御シグナル。プロセスを停止します。端末以外からの停止シグナル。
プロセスを終了します。ソフトウェアによって送信される終了シグナルです。
プロセスを終了します。プログラムを強制終了します。
プロセスを終了します。ファイルサイズの制限超過です。RCTL_GLOBAL_FILE_SIZE プロパティーを持つリソース制御でのみ使用できます。
プロセスを終了します。CPU 時間の制限超過です。RCTL_GLOBAL_CPUTIME プロパティーを持つリソース制御でのみ使用できます。
特定の制御のグローバルプロパティーに起因して、その他のシグナルが許可される場合があります。
図 4 シグナルに対する権限レベルの設定