Solaris のシステム管理 (資源管理とネットワークサービス)

第 9 章 資源上限デーモンによる物理メモリーの制御

資源上限デーモン rcapd は、資源上限が定義されたプロジェクト内で動作するプロセスが消費する物理メモリーを規制します。

資源上限デーモンの概要

資源「上限」とは、物理メモリーなどの資源消費量の上限のことです。物理メモリーの上限はプロジェクトごとに設定します。

資源上限デーモンとその関連ユーティリティは、物理メモリーの資源上限を制限および管理するメカニズムを提供します。

資源制御と同様に、資源上限を定義するには、project データベース内にあるプロジェクトエントリの属性を使用します。資源制御はカーネルによって同期的に実行されますが、物理メモリーの資源上限の制限は資源上限デーモンによってユーザーレベルで非同期的に実行されます。 この資源上限の制限は非同期的に実行されるため、資源上限デーモンがサンプリングを行う間隔の分だけ、短時間の遅延が発生します。

rcapd については、rcapd(1M) のマニュアルページを参照してください。プロジェクトと project データベースについては、 第 5 章「プロジェクトとタスク」および project(4) のマニュアルページを参照してください。資源制御については、第 7 章「資源制御」を参照してください。

資源上限制御のしくみ

資源上限デーモンは、物理メモリー上限が定義されたプロジェクトの資源使用率を定期的にサンプリングします。このサンプリング間隔は管理者が指定できます。詳細は、サンプリング間隔の決定を参照してください。システムの物理メモリー使用率が上限実行しきい値を超え、ほかの条件にも適合する場合、資源上限デーモンは、物理メモリー上限が定義されたプロジェクトの資源消費をその上限以下に減らします。

仮想メモリーシステムは物理メモリーを複数の「ページ」に分割します。「ページ」は、Solaris メモリー管理サブシステムにおける物理メモリーの基礎となる単位です。データをファイルからメモリーに読み取るとき、仮想メモリーシステムは 1 度に 1 ページずつ読み取ります。この動作のことを、ファイルの「ページイン」と呼びます。資源消費を減らすとき、資源上限デーモンは、あまり使用されていないページをスワップデバイス (物理メモリーの外にある領域) に再配置します。この動作のことを「ページアウト」と呼びます。

物理メモリーを管理するために、資源上限デーモンは、プロジェクトの作業負荷の常駐セットのサイズを、作業セットのサイズに対して調節します。常駐セットとは、物理メモリーに常駐するページのことです。作業セットとは、作業負荷がその処理サイクル中にアクティブに使用するページのことです。作業セットは、プロセスが動作するモードや処理するデータの種類に応じて、そのときどきで変化します。すべての作業負荷がその作業セットの常駐に十分な物理メモリーにアクセスできるのが理想です。しかし、作業セットは、物理メモリーのほか、二次ディスク記憶装置にも格納することが可能です。

rcapd は 1 度に 1 つのインスタンスしか実行できません。

物理メモリーの使用率を制限する属性

物理メモリー資源の上限をプロジェクトに対して定義するには、常駐セットサイズ (RSS) の上限を設定します。この属性は project データベースの次のエントリに追加します。

rcap.max-rss

プロジェクト内のプロセスが利用できる物理メモリーの合計 (バイト数)。

たとえば、/etc/project データベース内の次の行は、10G バイトの RSS 上限を db というプロジェクトに対して設定します。


db:100::db,root::rcap.max-rss=10737418240

注 –

指定した上限値はシステムによってページのサイズに丸められることがあります。


rcapd の構成

資源上限デーモンを構成するには、rcapadm コマンドを使用します。次のような作業が可能です。

資源上限デーモンを構成するには、スーパーユーザーの特権を持っているか、プロファイルの一覧内に Process Management プロファイルが含まれている必要があります。Process Management 役割と System Administrator 役割には、どちらにも Process Management プロファイルが含まれています。『Solaris のシステム管理 (セキュリティサービス)』の「RBAC 要素: 参照情報」を参照してください。

構成の変更を rcapd に適用するには、構成間隔で自動的に行われるのを待つか (rcapd の動作間隔を参照) 、 SIGHUP を手動で送信します (kill(1) のマニュアルページを参照)。

引数なしで使用した場合、rcapadm は資源上限デーモンの現在の状態を表示します (構成されている場合のみ)。

以下の項では、上限の制限、上限値、および rcapd の動作間隔について説明します。

メモリー上限実行しきい値

メモリー上限実行しきい値 」とは、上限の制限の引き金となる、システム上の物理メモリーの使用率 (パーセンテージ) のことです。システムの物理メモリー使用率がこのしきい値を超えたとき、メモリー上限が制限されます。この使用率には、アプリケーションやカーネルが使用する物理メモリーも含まれます。この使用率は、メモリー上限が制限される方法を決定します。

上限が制限されると、プロジェクトの作業負荷からメモリーがページアウトされることがあります。

作業負荷は、定義された上限までの物理メモリーを使用することが許可されます。システムのメモリー使用率がメモリー上限実行しきい値を下回っている場合、作業負荷は上限より多くのメモリーを使用できます。

上限実行しきい値を設定する方法については、メモリー上限実行しきい値を設定する方法を参照してください。

上限値の決定

プロジェクトの上限の設定が低すぎると、通常の状態でも、作業負荷が効率的に機能するだけのメモリーを使用できない可能性があります。作業負荷がより多くのメモリーを要求するためページングが発生し、システムのパフォーマンスに悪影響がでます。

プロジェクトの上限の設定が高すぎると、上限に達する前に、利用可能な物理メモリーを使い果たす可能性があります。この場合、物理メモリーは、rcapd ではなくカーネルによって効率的に管理されます。

プロジェクトの上限を決定するときには、次の要素を考慮します。

入出力システムへの影響

サンプリングした使用率がプロジェクトの上限を超えている場合、資源上限デーモンはプロジェクトの作業負荷の物理メモリー使用率を減らそうとします。上限が制限されている間は、作業負荷がマッピングしているファイルには、スワップなどのデバイスが使用されます。上限を頻繁に超える作業負荷の場合、そのパフォーマンスは、スワップデバイスのパフォーマンスに大きく左右されます。このような作業負荷を実行することは、作業負荷の上限と同じサイズの物理メモリーを持つマシン上で作業負荷を実行することと似ています。

CPU 使用率への影響

資源上限デーモンの CPU 使用率は、このデーモンが上限を制限するプロジェクトの作業負荷内のプロセスの数と、作業負荷のアドレス空間のサイズによって変化します。

資源上限デーモンの CPU 時間の一部は、作業負荷の使用率のサンプリングに費やされます。作業負荷にプロセスを追加すると、使用率のサンプリングにかかる時間が増えます。

上限値を超えると上限が制限され、資源上限デーモンの CPU 時間がさらに消費されます。消費される CPU 時間は仮想メモリーの量に比例します。消費される CPU 時間は、作業負荷のアドレス空間の合計サイズの変化によって増減します。この情報は、rcapstat の出力の vm 列に報告されます。詳細は、rcapstat による資源使用率の監視および rcapstat(1) のマニュアルページを参照してください。

共有メモリーの報告

資源上限デーモンは、メモリーのどのページがほかのプロセスと共有されているのか、あるいは、同じプロセス内で複数回マッピングされているのかを判断できません。rcapd は各ページが一意であると仮定するため、報告される常駐セットサイズ (RSS) の推定値と実際値は一致しません。

データベースのような作業負荷は共有メモリーを多用します。このような作業負荷では、次のようにプロジェクトの通常の使用率をサンプリングすることによって、適切な初期上限値を決定できます。prstat コマンドに -J オプションを付けて実行し、その出力を使用します。prstat(1M) のマニュアルページを参照してください。

rcapd の動作間隔

rcapd を定期的に実行するように、rcapd の動作間隔を設定できます。

すべての間隔は秒単位で指定します。次の表に、rcapd の動作とそのデフォルトの間隔値を示します。

動作 

デフォルトの間隔値 (秒) 

説明 

scan

15 

プロジェクトの作業負荷内で動作しているプロセスをスキャンする間隔の秒数。最小値は 1秒 

sample

常駐セットサイズのサンプリングから、その後に上限を制限するまでの間の秒数。最小値は 1 秒 

report

5  

ページング統計を更新する間隔の秒数。0 に設定すると、ページング統計は更新されず、rcapstat からの出力も最新の状態を示さない

config

60  

再構成する間隔の秒数。再構成イベントでは、rcapadm は構成ファイルを更新用に読み取って、project データベースに新しいまたは改定されたプロジェクト上限があるかどうかを調べます。SIGHUPrcapd に送信すると、再構成が即座に行われる

間隔を調節する方法については、動作間隔を設定する方法を参照してください。

rcapd スキャン間隔の決定

スキャン間隔とは、rcapd が新しいプロセスを探す頻度のことです。多くのプロセスが動作しているシステムでは、一覧のスキャンに時間がかかるため、スキャン間隔を長くして、消費される CPU 時間の合計を減らしたほうがよい場合もあります。しかし、スキャン間隔は、あるプロセスの存在が上限が定義されている作業負荷に属するとみなされるまでに最低限必要な時間も意味します。生存期間が短いプロセスを数多く実行する作業負荷の場合、スキャン間隔が長いと、rcapd はそれらのプロセスが作業負荷に属さないものとみなす可能性があります。

サンプリング間隔の決定

rcapadm で構成したサンプリング間隔は、作業負荷の使用率をサンプリングして上限を超えていた場合に、rcapd が上限を制限するまでの、最短時間です。サンプリング間隔を短くすると、ほとんどの場合、rcapd が上限を頻繁に制限するため、ページングによる入出力が増えます。しかし、サンプリング間隔を短くすると、特定の作業負荷の物理メモリー使用率が急増した場合に、ほかの作業負荷への影響を抑えることにもなります。サンプリングの合間には、この作業負荷は自由にメモリーを消費でき、上限が定義されているほかの作業負荷のメモリーすらも利用できますが、この合間が狭められることになるのです。

rcapstat に指定したサンプリング間隔が、rcapadmrcapd に指定したサンプリング間隔よりも短い場合、いくつかの間隔の出力はゼロになることがあります。この状況が発生するのは、rcapd が統計を更新する間隔が、rcapadm で指定した間隔よりも長いためです。rcapadm で指定した間隔は、rcapstat で使用されるサンプリング間隔から独立しています。

rcapstat による資源使用率の監視

上限が定義されたプロジェクトの資源使用率を監視するには、rcapstat を使用します。rcapstat の報告例については、rcapstat による報告の生成を参照してください。

報告用のサンプリング間隔、および統計を繰り返す回数を設定できます。

interval

サンプリング間隔を指定します (秒)。デフォルトの間隔は 5 秒です。

count

統計を繰り返す回数を指定します。デフォルトでは、終了シグナルを受信するまで、あるいは、rcapd プロセスが終了するまで、 rcapstat は統計を報告し続けます。

rcapstat が最初に発行する報告では、ページング統計は資源上限デーモンの起動以降の活動を示します。以後の報告では、前回の報告以降の活動を示します。

次の表に、rcapstat の報告の列見出しを示します。

rcapstat の列見出し

説明 

id

上限が定義されたプロジェクトの ID 

project

プロジェクト名 

nproc

プロジェクト内のプロセス数 

vm

プロジェクト内のプロセスが使用する仮想メモリーサイズの合計。単位は、K バイト (K)、M バイト (M)、または G バイト (G) 

rss

プロジェクト内のプロセスが使用すると推定される常駐セットサイズ (RSS) の合計。単位は、K バイト (K)、M バイト (M)、または G バイト (G)。共有されるページは考慮されない 

cap

プロジェクトに定義された RSS 上限。メモリー上限を指定する方法については、物理メモリーの使用率を制限する属性または rcapd(1M) のマニュアルページを参照

at

前回の rcapstat のサンプリング以降、 rcapd がページアウトしようとしたメモリーの合計

avgat

前回の rcapstat のサンプリング以降に発生した各サンプリングサイクル中、rcapd がページアウトしようとしたメモリーの平均。rcapd が RSS をサンプリングする頻度は rcapadm で設定できます。rcapd の動作間隔を参照

pg

前回の rcapstat のサンプリング以降、 rcapd が正常にページアウトしたメモリーの合計

avgpg

前回の rcapstat のサンプリング以降に発生した各サンプリングサイクル中、rcapd が正常にページアウトしたと推定されるメモリーの平均。rcapd が RSS をサンプリングする頻度は rcapadm で設定できます。rcapd の動作間隔を参照

rcapadm による資源上限デーモンの管理

この節では、rcapadm を使用して資源上限デーモンを構成する手順について説明します。詳細は、rcapd の構成および rcapadm(1) のマニュアルページを参照してください。

引数なしで使用した場合、rcapadm は資源上限デーモンの現在の状態を表示します (構成されている場合のみ)。

メモリー上限実行しきい値を設定する方法

上限は、プロセスが利用できる物理メモリーが少なくなるまで制限されないように構成できます。詳細は、メモリー上限実行しきい値を参照してください。

最小値 (デフォルト) は 0 です。これは、メモリー上限が常に制限されることを意味します。最小値を変更するには、次の手順に従います。

  1. スーパーユーザーになります。

  2. rcapadm-c オプションを指定して実行して、メモリー上限を制限するときの物理メモリー使用率を設定します。


    # rcapadm -c percent
    

    percent は 0 から 100 までの値です。この値を大きくするほど、規制が小さくなります。つまり、上限が定義されたプロジェクトの作業負荷は、システムのメモリー使用率がこのしきい値を超えない限り、上限を適用されることなく実行できます。

現在の物理メモリーの使用率と上限実行しきい値を表示する方法については、メモリー使用率とメモリー上限実行しきい値の報告を参照してください。

動作間隔を設定する方法

rcapd の動作間隔では、rcapd が行う定期的な動作の間隔について説明しています。rcapadm を使用して動作間隔を設定するには、次の手順に従います。

  1. スーパーユーザーになります。

  2. -i オプションを使用して、動作間隔の値を設定します。


    # rcapadm -i interval=value,...,interval=value 
    

すべての動作間隔の値の単位は秒です。

資源上限制御を有効にする方法

資源上限制御をシステムで有効にする方法は 2 つあります。

  1. スーパーユーザーになります。

  2. 次のどちらかの方法で資源上限デーモンを有効にします。

    • 資源上限デーモンを有効にして、ただちに起動し、かつ、システムをブートするたびに起動するようにするには、次のように入力します。


      # rcapadm -E
      
    • 資源上限デーモンをただちには起動せず、次回のブート時に有効にするには、-n オプションも指定します。


      # rcapadm -n -E
      

資源上限制御を無効にする方法

資源上限制御をシステムで無効にする方法は 2 つあります。

  1. スーパーユーザーになります。

  2. 次のどちらかの方法で資源上限デーモンを無効にします。

    • 資源上限デーモンを無効にして、ただちに停止し、かつ、システムをブートしても起動しないようにするには、次のように入力します。


      # rcapadm -D
      
    • 資源上限デーモンを停止せずに無効にするには、-n オプションも指定します。


      # rcapadm -n -D
      

注 –

rcapd を安全に無効にするには、rcapadm -D を使用します。資源上限デーモンを強制終了すると (kill(1) のマニュアルページを参照)、プロセスが停止状態のままになり、手動で再起動しなければならない場合があります。プロセスの実行を再開するには、prun コマンドを使用します。 詳細は、prun(1) のマニュアルページを参照してください。


rcapstat による報告の生成

資源上限制御の統計を報告するには、rcapstat を使用します。rcapstat コマンドを使用して報告を生成する方法については、rcapstat による資源使用率の監視を参照してください。この節では、報告の列見出しについても説明します。また、rcapstat(1) のマニュアルページも参照してください。

この節では、さまざまな目的の報告を生成する方法を、例を使用しながら説明します。

上限とプロジェクトの情報の報告

この例では、2 人のユーザーに関連付けられた 2 つのプロジェクトに、上限が定義されています。user1 の上限は 50M バイトで、user2 の上限は 10M バイトです。

次のコマンドは、5 つの報告を 5 秒間のサンプリング間隔で生成します。


user1machine% rcapstat 5 5
    id project  nproc     vm    rss   cap    at avgat    pg avgpg
112270   user1     24   123M    35M   50M   50M    0K 3312K    0K
 78194   user2      1  2368K  1856K   10M    0K    0K    0K    0K
    id project  nproc     vm    rss   cap    at avgat    pg avgpg
112270   user1     24   123M    35M   50M    0K    0K    0K    0K
 78194   user2      1  2368K  1856K   10M    0K    0K    0K    0K
    id project  nproc     vm    rss   cap    at avgat    pg avgpg
112270   user1     24   123M    35M   50M    0K    0K    0K    0K
 78194   user2      1  2368K  1928K   10M    0K    0K    0K    0K
    id project  nproc     vm    rss   cap    at avgat    pg avgpg
112270   user1     24   123M    35M   50M    0K    0K    0K    0K
 78194   user2      1  2368K  1928K   10M    0K    0K    0K    0K
    id project  nproc     vm    rss   cap    at avgat    pg avgpg
112270   user1     24   123M    35M   50M    0K    0K    0K    0K
 78194   user2      1  2368K  1928K   10M    0K    0K    0K    0K 

出力の最初の 3 行は 1 回目の報告です。ここには、2 つのプロジェクトに関する上限とプロジェクトの情報、および rcapd 起動以降のページング統計が記載されています。atpg の列において、user1 にはゼロより大きな値が入っており、user2 にはゼロが入っています。これは、1 回目の報告の期間中、user1 は上限を超えたが、 user2 は超えなかったことを意味します。

2 回目以降の報告では、目立った活動はありません。

プロジェクトの RSS の監視

この例では、プロジェクト user1 の RSS が上限を超えています。

次のコマンドは、5 つの報告を 5 秒間のサンプリング間隔で生成します。


user1machine% rcapstat 5 5

    id project  nproc    vm   rss   cap    at avgat     pg  avgpg
376565   user1      3 6249M 6144M 6144M  690M  220M  5528K  2764K
376565   user1      3 6249M 6144M 6144M    0M  131M  4912K  1637K
376565   user1      3 6249M 6171M 6144M   27M  147M  6048K  2016K
376565   user1      3 6249M 6146M 6144M 4872M  174M  4368K  1456K
376565   user1      3 6249M 6156M 6144M   12M  161M  3376K  1125K

プロジェクト user1 は 3 つのプロセスを持っており、それぞれがアクティブに物理メモリーを使用しています。pg 列の正の値が示しているとおり、rcapd は、このプロジェクトのプロセスの物理メモリーの使用率を上限に合わせて下げようと、メモリーをページアウトし続けています。しかし、rcapd は RSS を上限値未満に保つことに成功していません。これは、rss 値が相応の減少を示していないことでわかります。作業負荷はメモリーをページアウトするとすぐにまたメモリーを使用しており、その結果、RSS の値がまた上がってしまいます。これは、プロジェクトの常駐メモリーがすべてアクティブに使用されており、かつ、作業セットサイズ (WSS) が上限よりも大きいことを意味します。そのため、rcapd は、上限に合わせて作業セットの一部をページアウトせざるを得ません。この状況では、次のうちのどれかが起きるまで、システムのページフォルト率および関連する入出力は高いままです。

この状況では、サンプリング間隔を短くすることで、RSS 値と上限値の差を小さくできる可能性があります。rcapd が作業負荷をサンプリングして上限を制限する頻度が上がるからです。


注 –

ページフォルトが発生するのは、新しいページを作成する必要があるとき、あるいは、システムがスワップデバイスからページをコピーする必要があるときです。


プロジェクトの作業セットサイズの決定

この例では、前の例と同じプロジェクトを使用します。

前の例では、プロジェクト user1 が自分に許可された上限よりも多くの物理メモリーを使用しているところを示しました。この例では、どれくらいのメモリーをプロジェクトの作業負荷が必要とするのかを示します。


user1machine% rcapstat 5 5
    id project  nproc    vm   rss   cap    at avgat     pg  avgpg
376565   user1      3 6249M 6144M 6144M  690M    0K   689M     0K
376565   user1      3 6249M 6144M 6144M    0K    0K     0K     0K
376565   user1      3 6249M 6171M 6144M   27M    0K    27M     0K
376565   user1      3 6249M 6146M 6144M 4872K    0K  4816K     0K
376565   user1      3 6249M 6156M 6144M   12M    0K    12M     0K
376565   user1      3 6249M 6150M 6144M 5848K    0K  5816K     0K
376565   user1      3 6249M 6155M 6144M   11M    0K    11M     0K
376565   user1      3 6249M 6150M   10G   32K    0K    32K     0K
376565   user1      3 6249M 6214M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K
376565   user1      3 6249M 6247M   10G    0K    0K     0K     0K

サイクルの中ほどで、プロジェクト user1 の上限を 6G バイトから 10G バイトに上げました。値を上げることによって上限の制限が止まり、常駐セットサイズが上昇しました。常駐セットサイズを規制するのは、ほかのプロセスと、マシンのメモリー容量だけになりました。rss 列が、プロジェクトの作業セットサイズ (この例では 6247M バイト) を反映して安定する場合があります。この値が、このプロジェクトのプロセスがページフォルトを頻繁に起こさずに動作できる、上限の最小値です。

次の 2 つの図は、上限が 6G バイトと 10G バイトのときに、rcapd user1 に与える影響を示しています。 サンプリング間隔である 5 秒ごとに、rcapd が作業負荷のメモリーの一部をページアウトすることによって、RSS が減り、入出力が増えます。ページアウトの直後、これらのページを必要とする作業負荷は、(動作し続ける限り) メモリーをページインします。このサイクルは、例の中ほどで上限を 10G バイトに上げるまで繰り返され、その後、RSS は 6.1G バイトで安定します。作業負荷の RSS が上限より低くなったため、これ以後ページングは発生しません。同様に、ページングに関連する入出力も止まります。このことは、vmstat (vmstat(1M)のマニュアルページを参照) コマンドまたは iostat ( iostat(1M)のマニュアルページ参照) コマンドで確認できます。以上のようにして、観察時にプロジェクトが行なっていた作業の実行には、6.1G バイトが必要であったと推論できます。

図 9–1 user1 の上限を WSS よりも大きくしたあとに RSS 値が安定する様子

このグラフは、user1 の上限を user1 の WSS よりも高くしたあとに RSS 値が安定したことを示します。

図 9–2 ページインとページアウトの関係、および user1 の上限を上げたあとに入出力が安定する様子

このグラフは、ページインとページアウトの関係、および user1 の上限を上げたあとの入出力の安定を示します。

メモリー使用率とメモリー上限実行しきい値の報告

rcapstat-g オプションを使用すると、次のことを報告できます。

-g オプションを使用すると、各サンプリング間隔に対応する報告の最後に、メモリー使用率と上限実行しきい値を示す行が出力されます。


# rcapstat -g
    id project   nproc    vm   rss   cap    at avgat   pg  avgpg
376565    rcap       0    0K    0K   10G    0K    0K   0K     0K
physical memory utilization: 55%   cap enforcement threshold: 0%
    id project   nproc    vm   rss   cap    at avgat   pg  avgpg
376565    rcap       0    0K    0K   10G    0K    0K   0K     0K
physical memory utilization: 55%   cap enforcement threshold: 0%