Solaris Resource Manager 1.1 のシステム管理

第 7 章 メモリー制限値、プロセスメモリー制限値、およびプロセス数制限値

管理者は、Solaris Resource Manager を使って次のものを制御できます。

仮想メモリー (合計) を制御するための属性

仮想メモリーの使用量を記録したり、その制限値を設定したりするシステム属性があります。

memory.myusage

l ノードの memory.myusage 属性は、l ノードに接続されているすべてのプロセスの仮想メモリー使用量の合計です。

memory.usage

l ノードの memory.usage 属性は、その memory.myusage 属性とその子 l ノードの memory.usage 属性の合計です。

memory.limit

memory.limit 属性は memory.usage 属性に適用されます。この属性は、この l ノードとすべてのメンバー l ノードに接続されているすべてのプロセスの合計メモリー使用量を制限します。

プロセスメモリー (プロセス別) を制御する属性

プロセス使用量を記録し、その制限値を指定するには、次のシステム属性を使用します。

memory.plimit

l ノードの memory.plimit 属性はプロセスごとの制限値です。その l ノードまたはメンバーに接続されている各プロセスのメモリー使用量に個別に適用されます。

メモリー制限値の技術情報

プロセスがメモリーを増やす場合には、接続されている l ノードのメモリー制限値 (合計とプロセス当たり) の制約を受けます。プロセスがメモリーを増やすには、次の 5 つの方法があります。

  1. malloc(3C) などの割り当てルーチンを呼び出す。これによって、sbrk(2) システムコールが呼び出されます。メモリー制限値を超えると、errno に ENOMEM が設定されたエラーが返されます。

  2. スタックを拡張し、スタックフォルトを引き起こす。通常、これによって、1 ページのメモリーがプロセスに追加されます。メモリー制限値を超えると、SIGSEGV シグナルがプロセスに送信されます。

  3. mmap(2) コマンドを使用する。

  4. fork(2) コマンドを使用する。子のアドレス空間が複製されますが、この空間はまだ親プロセスが所有しています。この複製で新しいアドレス空間が memory.plimit の値を超えることはありません。親プロセスはあらかじめこの制限値以内になければならないからです。しかし、この割り当ては memory.limit の制約を受けます。

  5. exec(2) コマンドを使用する。exec 実行中には、古いアドレス空間が破棄されるので、メモリー使用量が減少します。しかし、新しいプログラムのアドレス空間が大きいために制限値を超えると、exec は失敗することがあります。

動的再構成と仮想メモリー制限値

Enterprise 10000 システムの動的再構成 (DR) 機能は、l ノードに適用される仮想メモリーの制限値に限定的な影響があります。DR では、システムが動作中に、物理メモリーをシステムに追加したり、減らしたりすることができます (システムの仮想メモリープールには、すべての物理メモリーと、システムに構成されたスワップ空間が含まれます)。さらに、Solaris システムの swap(1M) コマンドでは、スワップ空間をシステムに追加 (-a) したり、システムから削除 (-d) したりすることができます。したがって、仮想メモリーの合計は、動作中に大きくなったり、小さくなったりします。

このため、Solaris Resource Manager によって適用される仮想メモリーの制限値に間接的な影響を与えます。仮想メモリーは割当数ではなく絶対単位で管理されるため、動作中にシステムの資源が変わっても、実効制限値は変わりません。この動作は、「動的再構成」で述べたように、プロセッサの動的再構成とは異なります。

プロセス数を制御する属性

プロセス使用量 (プロセスの数) を制御するシステム属性には、次のものがあります。

process.myusage

l ノードの process.myusage 属性は、l ノードに接続されているプロセスの数です。

process.usage

l ノードの process.usage 属性は、その l ノードの process.myusage 属性とその子 l ノードの process.usage 属性の合計です。

process.limit

process.limit 属性は、l ノードの process.usage 属性に適用する制限値です。この l ノードとすべてのメンバー l ノードに同時に接続できるプロセスの数を制限します。

プロセス数に関する技術情報

新しいプロセスの作成には、fork(2)vfork(2) システムコールを使用します。この呼び出しでプロセス制限値を超えると、システムコールは失敗し、EAGAIN エラーが返されます。ほとんどのプログラムは、EAGAIN をシステム資源の一時的な不足と解釈し、短期間のスリープの後で再び fork を出します。fork の失敗の原因が Solaris Resource Manager の制限値にある場合は、永久ループの状態になることがあります。これは、この l ノードの制限値を修正しない限り、fork を行うたびに EAGAIN が返されるためです。