Solaris Resource Manager の SHR スケジューラは、CPU 資源の割り当てを制御するためのものです。管理者は、割当数の概念によって、ユーザー、グループ、アプリケーションの CPU 資源に対する相対的な権利を簡単に制御できます。割当数の考え方は会社の株に似ています。重要なのはいくつ持っているかではなく、他の株主との対比です。
Solaris Resource Manager のスケジューラに関連する属性が l ノードごとに 4 つあります。cpu.shares、cpu.myshares、cpu.usage、および cpu.accrue です。liminfo(1SRM) を実行すると、これらの属性が他の情報とともに表示されます。
Solaris Resource Manager のスケジューリングは、SHR スケジューリングクラスによって行われます。SHR スケジューリングクラスには、nice(1)、priocntl(1)、renice(1)、dispadmin(1M) の各コマンドのサポートも含まれます。システムコールのレベルでは、SHR は TS スケジューリングクラスと互換性があります。
ユーザーの cpu.shares 属性は、親と動作中のピアの間で CPU の使用権利を配分するときに使用します。ユーザーの cpu.myshares 属性は、そのユーザーに動作中の子ユーザーがあるときだけ意味があります。この属性は、これらの子ユーザーとの関係において CPU 使用権利の割合を決めるときに使用します。
たとえば、親 P に子 A と B があり、グループ P の中で P、A、B がそれぞれ割当を 1 ずつ持っているとします。つまり、A と B の cpu.shares に 1 を、P の cpu.myshares に 1 をそれぞれ設定します。この場合、P、A、B は、それぞれ CPU の使用権利としてグループの合計権利分の 3 分の 1 を持ちます。
したがって、ユーザーの実際の CPU の使用権利は、親の相対的な権利によって変わります。すなわち、親の権利は、親のピアの cpu.shares と親の親の cpu.myshares に対する親の cpu.shares の相対的な値によって変わります。このような関係は、スケジューリングツリーの上部方向に対しても同じです。
システム管理上の理由により、root l ノードに接続されたプロセスは shares 属性の影響を受けません。root l ノードに接続されたプロセスは、要求する CPU 資源をほとんど得ることができます。
CPU をかなり占有するプロセスを root l ノードに接続すると他のプロセスに顕著な影響が出るため避けてください。そのために、次の予防措置をとる必要があります。
中央のシステム管理者アカウントに、スーパーユーザーアカウントとは別の独自のユーザーID を設定します。管理目的以外の目的でログインする時には、このアカウントを使用します。管理機能を行うためにスーパーユーザーのユーザー ID が必要な場合には、中央のシステム管理者は、自分の l ノードに接続したまま su(1) コマンドを使ってユーザー ID を変更できます。
init.d(4) スクリプトで srmuser(1SRM) コマンドを使えば、デーモンプロセスを root 以外の l ノードに接続できます。起動スクリプトで起動したプロセスは、デフォルトで、実効ユーザー ID として root を持ち、root l ノードに接続されます。このユーザーコマンドでは、実効ユーザー ID が root のままデーモンを独自の l ノードに接続できます。このため、デーモンのどれかが CPU をかなり占有しても問題ありません。
スケジューリングツリーの必ずしもすべてのグループヘッダーが、プロセスを実行する実際のユーザーである必要はありません。このような場合には、CPU の割当数を与える必要がないので、この l ノードの cpu.myshares 属性をゼロにします。このようなグループヘッダーの CPU.accrue 属性にも、グループのすべてのメンバーに対する負担が加算されます。
動作中の l ノードの CPU 割当率は cpu.shares と cpu.myshares 属性で決まります。非動作中のユーザーの割当数はこの割合に影響しません。動作中のユーザーが 1 人だけの場合は、そのユーザーに使用可能な CPU 資源のすべてが割り当てられます。同じ割当数を持つ動作中のユーザーが同じグループに 2 人いる場合は、それぞれに 50 パーセントの割当率が与えられます。割当率の詳しい計算方法については、割当率の計算を参照してください。
l ノードに接続されているプロセスが CPU チックを負担するたびに、cpu.usage 属性が増加します。使用量属性の値は、Solaris Resource Manager の大域パラメータである使用量減少に指定された速度で指数的に減少します。使用量減少の速度 (半減期を秒数で指定したもの) は、srmadm(1MSRM) コマンドで設定します。
現在のスケジューリングクラスに関係なく、すべてのプロセスには l ノードがありますが、SHR スケジューリングクラス以外のプロセスには負担させません。
accrued usage 属性は usage 属性の場合と同じ量ずつ増加しますが、減少しません。したがって、accrued usage 属性は、この属性が最後にリセットされてから、この l ノードとそのメンバーに接続されたすべてのプロセスの使用量の合計を表わします。
l ノードの現在の実効割当率は、その l ノードに割り当てられた割当率と cpu.usage 属性で決まります。Solaris Resource Manager のスケジューラは、l ノードに接続されているすべてのプロセスの優先順位を調整して、作業速度がその l ノードの実効割当率に比例するようにします。あるいは、この l ノードに接続されている実行可能プロセスの数に反比例するようにします。
l ノードに接続された各プロセスには、Solaris Resource Manager 固有の内部データがオペレーティングシステムのカーネルによって維持されます。このような値のうち、スケジューリングのために最も重要なものは sharepri 値です。どの時点でも、sharepri 値が最も小さいプロセスが、CPU を使用する最も高い優先順位を獲得します。
スケジューリングツリー構造に関連した、管理者が考慮すべき点を次に示します。
スケジューリングツリーは、資源と特権を制御する階層を表わすために Solaris Resource Manager が使用する構造です。副管理者がスケジューリングツリーの通常ならアクセスできないサブツリーにアクセスできるようになると、中央のシステム管理者の許可なしに、資源を追加使用し、特別なアクセス権を獲得するようになります。たとえば、管理者が l ノードを削除し、親のないサブツリーが残った場合などです。
中央のシステム管理者は、limreport(1SRM) コマンドの組み込み識別子 orphan を使って、スケジューリングツリーから親のない部分を見つけることができます。親のない部分が見つかったら、直ちに再接続する必要があります。
新しく作成する l ノードの大部分にはゼロの値が入るため、ほとんどのフラグにはデフォルト値が継承されます。ほとんどのフラグはデバイス特権を表わすためのものであるため、これは望ましいことです。 l ノードの作成時に uselimadm と admin の 2 つのフラグが、明示的に消去されます。そのため、新しいユーザーが管理特権を自動的に取得するのを防ぐことができます。
下記のツリーは、グループヘッダーと一般ユーザーから成る構造を定義したものです。ツリーの一番上が root ユーザーです。グループヘッダー l ノードには、その cpu.shares 属性と cpu.myshares 属性の値を表す 2 つの数字を示します。葉 l ノードには、shares 属性の値を表す 1 つの数字を示します。
図 6-1 では、現在 l ノード A、C、および N にプロセスが接続されています。W にも W スケジューリンググループのメンバーにもプロセスがないので、一番上のレベルでは CPU は A と M の間で配分されます。A と M の割当数の割合は 3:1 なので、一番上のレベルでは 75 パーセントがグループ A に、25 パーセントがグループ M に配分されます。
次に、グループ A に割り当てられた 75 パーセントが、動作中のユーザー (A と C) の間で、グループ A における割当数の割合 (1:2) に応じて配分されます。A とその子の割当数を決めるときには myshares 属性が使用されます。したがって、ユーザー A にはグループに割り当てられた割当数の 3 分の 1 が、C には 3 分の 2 が与えられます。グループ M の中でプロセスを持つ l ノードは N だけなので、M に割り当てられた割当数はすべてが N に与えられます。
使用可能な CPU の割当率配分は、A が 0.25、C が 0.5、N が 0.25 になります。
次に、A、C、および N プロセスがどれも連続して CPU を要求し、システムに最大 2 台の CPU があるとします。この場合、Solaris Resource Manager は、使用可能な CPU 資源の合計が次の割合で個々のプロセスに渡るようにプロセスをスケジューリングします。
2 つの A プロセス: それぞれ 12.5 パーセント
C プロセス: 50 パーセント
3 つの N プロセス: それぞれ 8.3 パーセント
個々のプロセスの進捗速度は、各 l ノードの目標を満たすように制御されます。3 つ以上の CPU があるシステムで、これら 6 つのプロセスだけが動作している場合、C プロセスが 50 パーセントの権利分を使用できないと、残りは A と N の割合に従って配分されます。
ユーザーは、通常のプロセスが緊急でないプロセスに妨げられることがないように、Solaris 環境の nice 機能を使ってプロセスの優先順位を下げることができます。Solaris Resource Manager では、ユーザーがこの機能を使う目的は、優先順位を低くすることによって CPU 時間の負担を下げるためです。
Solaris Resource Manager で、この機能を実装するには、nice を指定されたプロセスの sharepri 減少速度を管理者が変更します。管理者は、srmadm(1MSRM) コマンドの Solaris Resource Manager の大域パラメータである pridecay を使って、通常の nice 値と最大の nice 値を持つプロセスの優先順位に対する減少速度を設定します。その間にある nice 値の速度は内挿され、最小 nice 値までの速度は外挿されます。たとえば、通常のプロセスの優先順位 (sharepri など) が半減期 2 秒で減少し、最大の nice 値を持つプロセスの優先順位が半減期 60 秒で減少すると指定できます。
この結果、nice を使用して優先順位を下げられたプロセスは、同じ l ノードの他のプロセスよりも少ない割合の CPU 割当率を受け取ります。Solaris Resource Manager では、実行可能なプロセスのキューが CPU の数を超えない限り、nice が他の l ノードのプロセスの実効速度に影響することはほとんどありません。
Solaris Resource Manager は、最大の nice 値を持つプロセス (たとえば、nice -19 コマンドで起動されたもの) に対し特別な処理をします。このようなプロセスは、他のプロセスが CPU を要求しないために CPU がアイドル状態である場合だけ、CPU チックを受け取ります。
nice については、nice(1) と nice(2SRM) のマニュアルページを参照してください。Solaris Resource Manager と他の資源制御機能の関係については、Solaris Resource Manager と類似製品の違いを参照してください。
Sun Enterprise サーバーの動的再構成 (DR) 機能では、ユーザーがシステムボードの取り付けや取り外しを動的に行うことができます。これには、プロセッサ、メモリー、入出力デバイスなどのシステム資源を含みます。Solaris Resource Manager は、現在使用可能なプロセッサ資源をスケジューリングのために追跡管理し、変更があると適切に処理して、使用可能なプロセッサ資源を資格のあるユーザーやプロセスに公平に再配分します。
Solaris Resource Manager は、プロセスの仮想メモリーサイズを制御するだけで、プロセスやユーザーが使用する物理メモリーは制御しないため、DR 操作でメモリーが変更されても、Solaris Resource Manager のメモリー制限検査には影響ありません。
idle l ノード (srmidle) は、カーネルのすべてのアイドル CPU コストを負担するものとして管理者が指定した l ノードです。インストール時に srmidle はユーザー ID 41 で作成されます。srmidle l ノードにはゼロ割当数を指定します。そのため接続されるプロセスは、他のプロセスが動作中でないときだけ実行されます。srmidle l ノードは、srmadm コマンドを使って割り当てます。
ブート時のデフォルトの idle l ノードは root l ノードです。マルチユーザーモードへ移行するときに、init.d スクリプトは、アカウント srmidle があれば、その l ノードを idle l ノードにします。この動作をカスタマイズするには、使用する別の l ノードを /etc/init.d/init.srm スクリプトに指定します。
idle l ノードが root でない場合は、root の直接の子でなければなりません。
other l ノード (srmother) は、最初のインストール後に作成される新しいユーザーのデフォルトの親 l ノードとしてシステム管理者が割り当てる l ノードです (当初のデフォルトの親 l ノードは root です)。srmother l ノードはインストール時にシステムによって自動的に作成され、変更できません。デフォルト値として割当数 1 を持ちます。したがって、この l ノードに接続される l ノードは CPU にアクセスできます。srmother l ノードは、ユーザー ID 43 で作成されました。
srmother l ノードには、資源の制限値も特別な特権も指定しません。CPU 割当数として 1 以上を指定します。
Solaris Resource Manager では、setuid(2SRM) システムコールの結果として、呼び出し側のプロセスが新しい l ノードに接続されます。たとえば、新しい l ノードが存在しないために接続の変更ができないと、このプロセスは srmlost l ノード (srmlost) に接続されます。この l ノードは、Solaris Resource Manager をインストールするときに作成されます。この接続にも失敗するか、srmlost l ノードが指定されていない場合は、setuid には影響を与えずにプロセスは現在の l ノードで継続されます。
init.srm スクリプトは、マルチユーザーモードへの移行時に srmlost l ノードを設定します。この動作を変更するには、使用する l ノードを /etc/init.d/init.srm ファイルに指定します。セキュリティ侵害を防ぐために、srmlost l ノードには CPU 割当数として 1 を指定し、特別な特権を指定しないようにします。これらの値を変更する場合は、変更を行うときにこのユーザーの諸要件を考慮に入れてください。
srmlost l ノードは、ユーザー ID 42 で作成されました。