resource-controls - プロジェクトデータベースから使用可能なリソース制御
リソース制御の機能は、プロジェクトデータベースから構成されます。project(5) を参照してください。リソース制御は、次のユーティリティーから設定および変更できます:
プログラムでは、setrctl(2) を使用してリソース制御値を設定します。
前のリソース制御に加えて、pooladm(8) および poolcfg(8) ユーティリティーからアクセス可能なリソースプールもあります。プログラムでは、リソースプールは libpool(3LIB) ライブラリから操作できます。
使用可能なリソース制御を次に示します:
このプロセスで使用できる、セグメントサイズについて集計されたアドレス空間の最大量で、バイト数で表現されます。
バッキングストアに書き込まれる可能性のあるページの ADI メタデータを格納するためのメモリーの合計量。バイト数で表現されます。各 ADI ページで必要となるメタデータの最大量は、sysconf() (_SC_ADI_METADATA_MAX) によって決まります。SHM_SHARE_MMU フラグを指定して作成された共有メモリーページなど、バッキングストアに決して書き込まれることのないページでは、メタデータメモリーは予約されません。mlock() ページ用のメタデータが予約されるかどうかは、実装に依存します。詳細は、sysconf(3C) および mlock(3C) のマニュアルページを参照してください。
このプロセスによって作成されるコアファイルの最大サイズで、バイト数で表現されます。
このプロセスで使用できる最大 CPU 時間で、秒数で表現されます。
このプロセスで使用できる最大ヒープメモリーで、バイト数で表現されます。
このプロセスで使用できる最大のファイル記述子インデックスで、整数で表現されます。
このプロセスでの書き込みに使用できる最大ファイルオフセット。バイト数で表現されます。
インターバルタイマーの許容可能な最大数で、整数で表現されます。
メッセージキュー上のメッセージの最大数 (msgget() の時点でリソース制御からコピーされる値) で、整数で表現されます。
メッセージキュー上のメッセージの最大バイト数 (msgget() の時点でリソース制御からコピーされる値) で、バイト数で表現されます。
イベントポートごとのイベントの許容可能な最大数で、整数で表現されます。
セマフォーセットごとに許可されるセマフォーの最大数で、整数で表現されます。
semop 呼び出しごとに許可されるセマフォー操作の最大数 (semget() の時点でリソース制御からコピーされる値)。整数で表現され、操作の数を指定します。
プロセスが保有できるキューに入れられた未処理のシグナルの最大数。
このプロセスで使用できる最大スタックメモリーセグメントで、バイト数で表現されます。
プロジェクトで使用できる CPU リソースの最大容量。使用される単位は、プロジェクト内のすべてのユーザースレッドで使用できる 1 つの CPU の割合 (%) です。整数で表現されます。リアルタイムスケジューリングクラスで実行されているスレッドに上限は適用されません。このリソース制御は、syslog アクションをサポートしていません。
公平配分スケジューラで使用するためにプロジェクトに付与される CPU 共有の数 (FSS(4) を参照)。使用される単位は共有の数 (整数) です。このリソース制御は、syslog アクションをサポートしていません。
プロジェクト内で許可される契約の最大数で、整数で表現されます。
暗号化操作に使用できるカーネルメモリーの最大容量。カーネル内のバッファーおよびセッション関連の構造体の割り当ては、このリソース制御に対してチャージされます。
許可される遅延ポストの最大数で、整数で表現されます。
デバイスドライバとユーザープロセス (DISM/ISM/OSM を含む) によってロックされた物理メモリーの合計容量であり、バイト数として表されます。
プロジェクトで同時に使用できる LWP の最大数で、整数で表現されます。
プロジェクトに対して許可されるメッセージキュー ID の最大数で、整数で表現されます。
イベントポートの許容可能な最大数で、整数で表現されます。
プロジェクトで同時に使用できるプロセスの最大数で、整数で表現されます。
プロジェクトに対して許可されるセマフォー ID の最大数で、整数で表現されます。
プロジェクトに対して許可される共有メモリー ID の最大数で、整数で表現されます。
プロジェクトに対して許可される共有メモリーの合計容量で、バイト数で表現されます。
プロジェクト内で許容可能なタスクの最大数で、整数で表現されます。
指定されたリソースプールをプロジェクトにバインドします。
プロジェクト内のプロセスで使用できる物理メモリーの合計容量 (バイト単位)。
このタスクのプロセスで使用できる最大 CPU 時間で、秒数で表現されます。
このタスクのプロセスで同時に使用できる LWP の最大数で、整数で表現されます。
タスクで同時に使用できるプロセスの最大数で、整数で表現されます。
次のゾーン規模のリソース制御を使用できます:
バッキングストアに書き込まれる可能性のあるページの ADI メタデータを格納するためのメモリーの合計量。バイト数で表現されます。各 ADI ページで必要となるメタデータの最大量は、sysconf() (_SC_ADI_METADATA_MAX) によって決まります。SHM_SHARE_MMU フラグを指定して作成された共有メモリーページなど、バッキングストアに決して書き込まれることのないページでは、メタデータメモリーは予約されません。mlock() ページ用のメタデータが予約されるかどうかは、実装に依存します。詳細は、sysconf(3C) および mlock(3C) のマニュアルページを参照してください。
ゾーンで使用できる CPU 時間に対して制限を設定します。使用される単位は、ゾーン内のすべてのユーザースレッドで使用できる 1 つの CPU の割合 (%) です。整数で表現されます。上限が設けられたゾーン内のプロジェクトに独自の上限がある場合は、最小値が優先されます。このリソース制御は、syslog アクションをサポートしていません。
ゾーンに対する公平配分スケジューラ (FSS) CPU 共有の数に制限を設定します。CPU 配分は、まずゾーンに対して割り当てられたあとで、project.cpu-shares エントリの指定に従って、ゾーン内のプロジェクトに分配されます。整数で表現されます。このリソース制御は、syslog アクションをサポートしていません。
ゾーンで使用できるロックされた物理メモリーの合計量。
ゾーンで使用できる lofi(4D) デバイスの最大数。
1 つのゾーン内の LWP が多すぎて、ほかのゾーンに影響を与えることがないようにすることで、リソースの分離を強化します。ゾーンの LWP の合計数は、project.max-lwps エントリを使用すると、ゾーン内のプロジェクト間でさらに再分割できます。整数で表現されます。
ゾーンに対して許可されるメッセージキュー ID の最大数で、整数で表現されます。
ゾーンで同時に使用できるプロセスの最大数で、整数で表現されます。
ゾーンに対して許可されるセマフォー ID の最大数で、整数で表現されます。
ゾーンに対して許可される共有メモリー ID の最大数で、整数で表現されます。
ゾーンに対して許可される共有メモリーの合計容量で、バイト数で表現されます。
このゾーンのユーザープロセスのアドレス空間マッピングと tmpfs マウントで消費できるスワップ領域 (仮想メモリー) の合計量。
zones(7) を参照してください。
リソース制御は、サイズ (バイト)、時間 (秒)、または数 (整数) の単位で表現できます。これらの単位は、次に指定されている文字列を使用します。
Category Res Ctrl Modifier Scale Type String ----------- ----------- -------- ----- Size bytes B 1 KB 2^10 MB 2^20 GB 2^30 TB 2^40 PB 2^50 EB 2^60 Time seconds s 1 Ks 10^3 Ms 10^6 Gs 10^9 Ts 10^12 Ps 10^15 Es 10^18 Count integer none 1 K 10^3 M 10^6 G 10^9 T 10^12 P 10^15 Es 10^18
リソース制御に倍率値を使用できます。次の例は、倍率付きのしきい値を示します。
task.max-lwps=(priv,1K,deny)
project ファイルでは、1K の値が 1000 に展開されます:
task.max-lwps=(priv,1000,deny)
2 番目の例では、より大きな倍率値が使用されています:
process.max-file-size=(priv,5G,deny)
project ファイルでは、5G の値が 5368709120 に展開されます:
process.max-file-size=(priv,5368709120,deny)
前の例では、上の表で指定されている倍率が使用されています。
単位修飾子 (たとえば、5G) が prctl(1)、projadd(8)、および projmod(8) コマンドによって受け入れられます。プロジェクトデータベース自体で単位修飾子を使用することはできません。
リソース制御に対するしきい値によって、ローカルアクションをトリガーできるか、または (ロギングなどの) グローバルアクションを実行できる時点が構成されます。
リソース制御に対する各しきい値は、特権レベルに関連付けられている必要があります。特権レベルは、次の 3 つの種類のいずれかである必要があります:
呼び出し元プロセスの所有者が変更できます。
現在のプロセス (sys_resource 特権が必要) または prctl(1) (proc_owner 特権が必要) が変更できます。
オペレーティングシステムインスタンスの期間中は固定されます。
リソース制御は、システムまたはリソースプロバイダで定義された 1 つの system 値を持つことが保証されます。system 値は、オペレーティングシステムの現在の実装で提供できるリソースの量を表します。
特権値はいくつでも定義できます。基本値は 1 つだけ許可されます。特権値を指定しないで実行される操作には、デフォルトで、基本レベルの特権が割り当てられます。
リソース制御値の特権レベルは、リソース制御ブロックの特権フィールドで RCTL_BASIC、RCTL_PRIVILEGED、または RCTL_SYSTEM として定義されます。詳細は、setrctl(2)を参照してください。prctl コマンドを使用すると、基本レベルおよび特権レベルに対応付けられている値を変更できます。
privileged の特権レベルを指定する場合は、priv の省略形を使用できます。例:
task.max-lwps=(priv,1K,deny)
リソース制御値に関するアクションには、グローバルとローカルの 2 つのカテゴリがあります。
グローバルアクションは、システム上のすべてのリソース制御のリソース制御値に適用されます。rctladm(8) を使用して、次のアクションを実行できます。
アクティブなシステムリソース制御のグローバルな状態を表示します。
大域ログ作成アクションを設定します。
リソース制御に対応付けられた大域ログ作成アクションは、無効にしたり有効にしたりできます。syslog アクションの程度を設定するには、重要度を syslog=level のように割り当てます。level に設定できる値は次のとおりです。
debug
info
notice
warning
err
crit
alert
emerg
デフォルトでは、リソース制御の違反は大域ログ作成では記録されません。
ローカルアクションは、制御値を超えようとしているプロセスに対して実行されます。リソース制御に設定された各しきい値に対して、1 つ以上のアクションを対応付けることができます。局所アクションには、3 つの種類があります。 none、deny、および signal= です。これら 3 つのアクションは、次のように使用されます。
しきい値を超える量のリソース要求に対して、何のアクションも行いません。このアクションは、アプリケーションの進行に影響を与えることなく、リソースの使用状況を監視するのに役立ちます。また、リソース制御を超えたにもかかわらず、同時に、しきい値を超えたプロセスが影響を受けていないときに表示されるグローバルメッセージを有効にすることもできます。
しきい値を超える量のリソース要求を拒否できます。たとえば、task.max-lwps リソース制御に拒否アクションが指定されている場合、新しいプロセスが制御値を超えると fork() システムコールは失敗します。fork(2) を参照してください。
リソース制御値を超えたときに大域シグナルメッセージを送信するアクションを有効にすることができます。プロセスがしきい値を超えると、プロセスにシグナルが送信されます。プロセスがさらにリソースを消費しても、追加のシグナルが送信されることはありません。使用可能なシグナルを次に一覧表示します。
すべてのリソース制御にすべてのアクションを適用できるわけではありません。たとえば、プロセスは、その所属先のプロジェクトに割り当てられている CPU 配分を超えることはできません。したがって、project.cpu-shares リソース制御に deny アクションを適用することはできません。
実装上の制限により、しきい値に設定できるアクションは、各制御の大域プロパティーによって制限されます。(rctladm(8) を参照してください。)使用可能なシグナルアクションの一覧を次のリストに示します。シグナルについての詳細は、signal(3HEAD) を参照してください。
リソース制御値に使用可能なシグナルを次に示します:
プロセスを終了します。
ハングアップシグナルを送信します。開いた回線上でキャリアが検出されなくなったときに発生します。シグナルは、端末を制御しているプロセスグループに送信されます。
プロセスを終了します。ソフトウェアによって送信される終了シグナルです。
プロセスを終了し、プログラムを強制終了します。
プロセスを停止します。ジョブ制御シグナル。
リソース制御の制限超過です。リソース制御機能によって生成されます。
プロセスを終了します。ファイルサイズの制限超過です。RCTL_GLOBAL_FILE_SIZE プロパティー (process.max-file-size) を持つリソース制御でのみ使用できます。rctlblk_set_value (3C) を参照してください。
プロセスを終了します。CPU 時間の制限超過です。RCTL_GLOBAL_CPUTIME プロパティー (process.max-cpu-time) を持つリソース制御でのみ使用できます。rctlblk_set_value (3C) を参照してください。
システム上のリソース制御には、それぞれ特定のプロパティーセットが対応付けられています。このプロパティーセットは、一連のフラグとして定義されます。これらのフラグは、そのリソースが制御されているすべてのインスタンスに対応付けられます。大域フラグは変更できませんが、これらのフラグは rctladm(8) または setrctl(2) システムコールを使用して取得できます。
ローカルフラグは、特定のプロセスまたはプロセス集合に対するリソース制御の特定のしきい値について、デフォルトの動作と構成を定義します。あるしきい値のローカルフラグが、同じリソース制御で定義されている別のしきい値の動作に影響することはありません。ただし、大域フラグは、特定の制御に対応付けられているすべての値の動作に影響します。ローカルフラグは、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 ]
大域フラグは次を示します:
この制御の特権値を下げるのに、スーパーユーザー特権を必要としません。
しきい値を超えても、リソースへのアクセスは拒否されません。
このリソースのしきい値に達したら、SIGXCPU を送信できます。
リソース制御の時間。
リソース制御のローカル値とアクションを表示するには、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
両方のしきい値に対して max (RCTL_LOCAL_MAXIMAL) フラグが設定され、このリソース制御に対して inf (RCTL_GLOBAL_INFINITE) フラグが定義されています。inf の値は無限大です。この値は制限を与えません。したがって、構成されているように、両方のしきい値は無限大値を意味し、これらの値を上回ることはありません。
1 つのリソースには、複数のリソース制御を設定できます。リソース制御は、プロセスモデルの包含レベルごとに 1 つずつ設定できます。同じリソース上の異なるコンテナレベルでリソース制御がアクティブな場合、まず、もっとも小さいコンテナの制御が実行されます。このため、両方の制御が同時に検出された場合は、task.max-cpu-time の前に process.max-cpu-time に対するアクションが実行されます。
属性についての詳細は、attributes(7) を参照してください。
|
prctl(1), memcntl(2), setrctl(2), rctlblk_set_value(3C), libpool(3LIB), lofi(4D), FSS(4), project(5), attributes(7), pooladm(8), poolcfg(8), projadd(8), projmod(8), rctladm(8)