この章では、Solaris Resource Manager の操作原理と主要な概念を説明します。「作業負荷の構成」では説明を補足するため、単純な階層の例を示します (より複雑な階層の例は、第 9 章「高度な使用方法」で説明します)。
Solaris Resource Manager では、Solaris カーネルを基本的に拡張した l ノード (limit ノード) が中心にあります。l ノードは UNIX のユーザー ID (UID) に対応するもので、個々のユーザー、ユーザーグループ、アプリケーション、特殊要件などを表わします。l ノードはユーザー ID を使用して索引付けされます。l ノードは、資源の割り当てポリシーを記録したり、資源の総使用量データをプロセスごとにユーザーやユーザーグループ、アプリケーションのレベルで記録したりするときに使用されます。
l ノードはユーザー ID で識別しますが、アクセス権に影響する資格情報とは異なります。資格の構造には、プロセスがファイルの読み込み、書き込み、および変更を実行できるかどうかが設定されます。l ノード構造は、資源の制限と使用量を追跡するために使用されます。
別の制限セットを使用したい場合は、srmuser(1SRM) を使用して異なる l ノードに接続します。この変更は資格構造には影響せず、資格構造は元のユーザー ID に関連付けられており、プロセスのアクセス権は変更されないことに注意してください。
Solaris Resource Manager 管理モデルでは、l ノードが「スケジューリングツリー」と呼ばれる階層構造に編成されます。スケジューリングツリーはユーザー ID を使って編成され、各 l ノードはツリーにおいてその親のユーザー ID を参照します。
スケジューリングツリーのサブツリーは「スケジューリンググループ」と呼ばれ、スケジューリンググループのルートにあるユーザーがグループのヘッダーです。(root ユーザーは、スケジューリングツリー全体のグループヘッダーです。) グループヘッダーには、グループ内の資源ポリシーを管理する機能を持たせることができます。
l ノードを最初に作成するときにはユーザー ID ファイルを解析して作成します。Solaris Resource Manager をインストールした後は、l ノード管理コマンド (limadm(1MSRM)) で追加の l ノードを作成し、l ノードを親に割り当てます。スケジューリングツリーのデータはテキストファイルのデータベースに格納されるので、必要に応じて limadm を使用して変更できます。
l ノードが使用するユーザー ID はシステムアカウント (エントリがシステムパスワードマップにある) に対応する必要はありませんが、各 l ノードのユーザー ID に対しシステムアカウントをできるだけ作成してください。葉 (leaf) ではない l ノード (階層でその l ノードの下に従属 l ノードがあるもの) の場合は、その l ノードに対応するアカウントは純粋に管理用であり、ユーザーがそれにログインすることはないかもしれません。しかし、この l ノードが、ログインを行う実ユーザーの l ノードとして、この葉ではない l ノードに接続されているプロセスを実行することもできます。
Solaris Resource Manager のスケジューリンググループとグループヘッダーは、/etc/group データベースに定義されているシステムグループとは関係ありません。グループヘッダーを含め、スケジューリングツリーの各 1 ノードは、固有のユーザー ID を持つ実システムユーザーに対応しています。
階層制限値のグループヘッダーに割り当てると、この制限値が、そのユーザーの使用量だけでなく、スケジューリンググループのすべてのメンバーの使用量の合計に適用されます。したがって、制限値は個々のメンバーの他にグループ全体にも適用されます。資源はグループヘッダーに割り当てられるので、グループヘッダーは、同じグループに属するユーザーやユーザーグループにこの資源を割り当てることができます。
プロセスは必ず l ノードに接続され、init プロセスは常に root l ノードに接続されます。fork(2) システムコールでプロセスを作成すると、このプロセスは親と同じ l ノードに接続されます。プロセスは、Solaris Resource Manager のシステムコールで任意の l ノードに再接続できます。ただし、十分な権限が必要です。権限を設定できるのは、中央のシステム管理者か、適切な管理権限を許可されたユーザーだけです。
Solaris Resource Manager ソフトウェアでは、システム資源として CPU 使用量 (プロセッサ使用率)、仮想メモリー、プロセス数、ユーザーまたはスケジューリンググループの現在のログイン回数、および端末の接続時間を制御します。
表 2-1 Solaris Resource Manager の機能
システム 資源 |
割り当て ポリシー |
管理 |
測定 |
使用量データ |
---|---|---|---|---|
CPU 使用量 |
有 ユーザー ID 単位 |
有 |
有 ユーザー ID 単位 |
有 |
仮想メモリー |
有 (ユーザー単位、プロセス単位) |
有 (ユーザー単位、プロセス単位) |
有 (ユーザー単位、プロセス単位) |
有 |
プロセス数 |
有 |
有 |
有 |
有 |
ユーザー/スケジューリンググループのログイン |
有 |
有 |
有 |
有 |
接続時間 |
有 |
有 |
有 |
有 |
Solaris Resource Manager は各資源の使用量をユーザーごとに追跡管理します。ユーザーには、CPU の使用量以外のすべての資源の使用量に対し、強い制限値を割り当てることができます。使用量がこの強い制限値に達すると、ユーザーはその資源を使用できなくなります。強い制限値は、カーネルか、それぞれの資源を管理するソフトウェアによって直接適用されます。
制限値としてゼロを指定すると、制限がないことを意味します。ルート l ノードのすべての制限値属性はゼロに設定してください。
通常、すべてのシステム資源は、「固定 (または再生不能) 資源」と「再生可能資源」に分けられます。Solaris Resource Manager は、システム資源をその種類に応じて管理します。
固定または再生不能資源は、仮想メモリー、プロセス数、ユーザーまたはスケジューリンググループの現在のログイン回数、接続時間などの有限の資源です。固定資源は使用した (割り当てた) 後、解放 (割り当て解除) できますが、所有者がこの割り当てを解除するまでは、他のエンティティがこの資源を使用することはできません。Solaris Resource Manager は、使用量と制限値のモデルを使って、使用される固定資源の量を制御します。「使用量」は、使用されている現在の資源として定義され、「制限値」は Solaris Resource Manager で可能な使用量の最大値です。
再生可能資源は、CPU 使用時間などの連続している資源です。再生可能資源は消費するだけで、消費したものは再利用できません。再生可能資源を使用できるのはその時点に限られています。したがって、その時点で使用しなければ、それを使用することはできません。これに似たものに太陽光があります。ある時点では太陽から一定量の光しか到達しませんが、この光は次の数百万年に渡って到達します。 そのため、再生可能資源は、無駄にしないために明示的に割り当て直さなくても、他のユーザーに割り当てられます。
Solaris Resource Manager は、使用量、制限値、および減少のモデルを使って、ユーザーが再生資源を使用する量を制限します。使用量は使用された資源の合計として定義され、グループ内の他のユーザーと比較した使用量の割合で設定されます。「減少」とは、過去の使用量を管理から除くために使用する期間を示すものです。次の資源量 (たとえば、クロックチック) は、減少した合計使用量の値が、与えられた割当数に比べて最も少ない動作中の l ノードに割り当てられます。減少使用量の値は、過去の合計使用量から、半減期モデルによって決まる過去の使用量を引いたものです。
再生可能な CPU 資源の割り当ては、「Solaris Resource Manager SHR スケジューラ」と呼ばれるフェアシェアスケジューラによって制御されます。
各 l ノードには、いくつかの CPU 割当数が与えられます。l ノードに対応するプロセスには、動作中の l ノードの割当数の合計に対する比率として CPU 資源が割り当てられます。(動作中とは、その l ノードに動作中のプロセスが接続されていることを意味します。) 資源を割り当てる対象は動作中の l ノードだけです。動作中のプロセスが動作し、CPU 時間を必要とするのは、これらの l ノードだけです。
プロセスが CPU チックを使用すると、この l ノードの CPU 使用量属性が増えます。スケジューラは、すべてのプロセスの優先順位を調整して、相対的な CPU 使用率が、すべての動作中の l ノードの相対的な CPU 割当率にそれぞれのレベルで収束するようにします。このようにして、ユーザーは、他のユーザーの動作と関係なく、長期的には少なくとも CPU サービスの権利に相当する量を受け取ります。
スケジューラは階層的です。つまり、スケジューラは、グループが、メンバーの動作とは関係なく、グループの権利に相当する量を受け取るようにします。Solaris Resource Manager SHR スケジューラは長期的なスケジューラです。Solaris Resource Manager は、すべてのユーザーとアプリケーションがスケジューラ期間の間に公平な量を得られるようにします。つまり、CPU 使用量の少ないユーザーが CPU の要求を開始すると、このユーザーには、CPU 使用量の多いユーザーよりも多くの資源が与えられます。これは、ユーザーの相対的な使用量が相対的に「公平」な割当数になるまで続きます。権利に対し現在使用量が多ければ、将来使用できる量はそれだけ少なくなります。
さらに、Solaris Resource Manager には、過去の使用を考慮に入れないための減少期間があります。これはシステム管理者が設定します。減少モデルには半減期減少モデルが使用され、半減期の間に資源の 50 パーセントが減少します。そのため、使用量が常に一定しているユーザーが短期間に処理を大量に行うユーザーの犠牲になることはありません。半減期減少期間は、半減する期間を設定し、スケジューラの応答性に影響を与えます。デフォルト値は 120 秒です。長い半減期は、長いバッチジョブのような均等使用に適し、短い半減期は、ユーザーとの対話処理に適しています。値が小さいと、応答がシステム全体に渡り均一化する傾向になりますが、システム全体の資源割り当ての計算や保守の正確さが多少失われます。管理者の設定値とは別に、スケジューラは、極端な状況であっても資源の枯渇が起こるのを防ぎ、適正な動作ができるようにします。
Solaris Resource Manager SHR スケジューラが Solaris の標準スケジューラよりも優れている主な点は、SHR スケジューラが個別のプロセスの代わりにユーザーやアプリケーションをスケジュールするということです。l ノードに関連付けられたすべてのプロセスには一連の制限値が適用されます。1 人のユーザーが 1 つの動作中のプロセスを実行するような単純な場合には、対応する l ノードの制限値が各プロセスの制限値です。グループのメンバーがそれぞれ複数のプロセスを実行するときのように、l ノードに複数のプロセスが接続されている場合には、すべてのプロセスに全体として l ノードの制限値が適用されます。したがって、同時にいくつのプロセスを実行していても、ユーザーやアプリケーションが、それぞれに持つ権利の割当率よりも多くの CPU を使用することはできません。権利を割当数として割り当てる方法は単純でわかりやすく、ユーザーの割当数を変更した場合の効果も予測が容易です。
SHR スケジューラが優れているもう 1 つの点は、個々のスレッド (技術的には Solaris では、スケジュールされるエンティティは軽量プロセス (LWP) です) のスケジュールを管理すると同時に、ユーザーに CPU 資源を配分していることです。
この概念は、次の方程式で表現されます。
new_SRM_priority は、システムの優先順位に対応付けされます。new_SRM_priority の優先順位が高いほど、システムの優先順位が低くなります。また、この逆も当てはまります。各減少期間では、CPU_usage は半分に削減され、最新の使用量によって増分されます。
さらに各ユーザーには、ログインなどに関するフラグのセットがあります。これは、一種のブール変数で、特定のシステム特権を有効または無効にするときに使用します。フラグはユーザーごとに設定したり、親の l ノードから継承したりできます。
ユーザーの使用量、制限値、およびフラグは、どのユーザーでも読み取れますが、これを変更できるのは、適切な管理特権を持ったユーザーだけです。
Solaris Resource Manager は、使用可能な CPU を無駄にすることはありません。ユーザーの割り当てが少なくても、競合するユーザーがいなければ、使用可能なすべての CPU がこのユーザーに与えられます。その結果、ユーザーは、パフォーマンスが通常よりも一定していないと感じることがあります。非常に少ない実効割当率を持つユーザーが競合なしに対話プロセスを実行すると、ジョブの実行が速いように見えます。しかし、それより高い実効割当率を持つユーザーが CPU 時間を要求すると、最初のユーザーよりも多くの CPU がこのユーザーに与えられるため、最初のジョブは速度が著しく低下します。しかし、Solaris Resource Manager は、ある程度の長期的な観点から、正当なユーザーが孤立化して作業が全くできない状態にならないようにします。最大の nice 値を持つプロセスを除き、Solaris Resource Manager がスケジュールするすべてのプロセスには、スケジューラによって CPU が規則的に割り当てられます。さらに、スケジューラのロジックにより、ログインしたばかりのユーザーに、計算上は「公平」であっても、既存ユーザーを犠牲にして過度の CPU が与えられることはありません。
仮想メモリーは固定資源モデルで管理されます。仮想メモリーの制限値は、ある l ノードに接続されているすべてのプロセスの合計メモリーサイズに適用されます。さらに、プロセス別の仮想メモリー制限値が、プロセスの仮想アドレス空間サイズの合計に適用されます。この合計には、すべてのコード、データ、スタック、ファイルマッピング、および共有ライブラリが含まれます。これらの制限値は両方とも階層的に使用されます。仮想メモリーの制限値は、仮想メモリーの枯渇を防止するのに有効です。たとえば、Solaris Resource Manager は、メモリーをリークしているアプリケーションが、すべてのユーザーを犠牲にして不当な量の仮想メモリーを使用するのを防ぎます。そのような場合には、そのプロセス自身の仮想メモリーがなくなるか、場合によってはその資源グループの他のプロセスのメモリーがなくなります。
同時に実行できるプロセスの数は、階層的な制限値を持つ固定資源モデルで制御されます。
システム管理者とグループヘッダーは、端末のログイン特権、ログイン回数、および接続時間の制限値を設定できます。これらは、Solaris Resource Manager によって階層的に使用されます。ユーザーの接続時間が制限値に近づくと、警告メッセージがユーザーの端末に送信されます。接続時間が制限値に達すると、通知が送信され、ユーザーは短い猶予時間の後にログアウトされます。
Solaris Resource Manager は過去の接続時間の使用量を徐々に減少させるため、最新の使用量だけが考慮されます。減少の早さを制御する半減期パラメータはシステム管理者が設定します。長い半減期は均等使用に適し、短い半減期はユーザーとの対話処理に適しています。
システム管理者は、ユーザーの l ノードの作成と削除を実行できます。システム管理者は、l ノードの管理特権を設定することもできます。たとえば、ユーザーごとに管理特権を選択して割り当てることもできます。階層的管理特権を持つユーザーを副管理者と呼びます。副管理者は、自らがグループヘッダーであるサブツリー内のユーザーの l ノードを変更することができます。
副管理者は、通常、自分の制限値やフラグを変更したり、グループ内のフラグや使用量を変更して自分のフラグや制限値の適用を回避したりできません。
中央のシステム管理者 (またはスーパーユーザー) は自身を含め、どのユーザーの制限値、使用量、フラグでも変更できます。uselimadm フラグを設定すれば、この特権を一般ユーザーにも許可できます。
システム管理者は資源の使用情報を参照できますが、ユーザーを基準とした情報と、資源の使用量の作業負荷から見た情報という 2 つの視点があります。
Solaris Resource Manager システムが維持する情報 (主に資源の現在の使用量および総使用量) を使用すれば、管理者はシステム資源の課金処理を包括的に行うことができます。Solaris Resource Manager には課金プログラムは含まれていませんが、独自の資源課金システムを開発する上で、ユーティリティプログラムをベースとして使用できます。
課金手順の設定に関する詳細は、第 8 章「使用量データ」を参照してください。
Solaris Resource Manager を使用して資源管理を効果的に行うには、資源階層を慎重に設計することが重要です。Solaris Resource Manager は l ノードツリーを使用して資源階層を実現します。
l ノードツリーの各ノードは、パスワードマップのユーザー ID に関連付けられているので、作業負荷はパスワードマップの値と対応している必要があります。階層内の葉ノードに対応するため、ユーザーを追加する必要がある場合があります。これらの特殊なユーザーは、実際にはプロセスやジョブを実行しませんが、葉ノードのための管理ポイントとして機能します。
図 2-1 に示す単純な階層は、Chuck と Mark という 2 人のユーザーの処理資源を制御するために作成されました。この 2 人のユーザーは、いろいろな時点で CPU 資源を大量に消費するため、一日に何度もお互いに影響を与えあっています。
この問題を解決するには、単一レベルの階層を作成して、それぞれのユーザーに公平に CPU の割当数を与えます。
この単純な階層は、limadm コマンドを使用して、root 共有グループに Chuck と Mark という子を指定して作成します。
# limadm set sgroup=root chuck # limadm set sgroup=root mark |
どちらのユーザーにも資源の 50 パーセントを割り当てるには、それぞれに同じ数値の CPU 割当数を指定します (この例では割当数にそれぞれ 50 を指定していますが、両者に 1 を指定しても同じ結果が得られます)。limadm コマンドを使用して、割当数を指定します。
# limadm set cpu.shares=50 chuck # limadm set cpu.shares=50 mark |
Chuck と対応している l ノードの変更を参照するには、liminfo コマンドを使用します。
# liminfo -c chuck Login name: chuck Uid (Real,Eff): 2001 (-,-) Sgroup (uid): root (0) Gid (Real,Eff): 200 (-,-) Shares: 50 Myshares: 1 Share: 41 % E-share: 0 % Usage: 0 Accrued usage: 0 Mem usage: 0 B Term usage: 0s Mem limit: 0 B Term accrue: 0s Proc mem limit: 0 B Term limit: 0s Mem accrue: 0 B.s Processes: 0 Current logins: 0 Process limit: 0 Last used: Tue Oct 4 15:04:20 1998 Directory: /users/chuck Name: Hungry user Shell: /bin/csh Flags: |
liminfo コマンドで表示されるフィールドについては、「一般的なアプリケーションサーバー」を参照してください。また、liminfo フィールドについては、liminfo(1SRM) のマニュアルぺージを参照してください。