名前 | 概要 | はじめに | 概念 | 資源の制御 | レポート作成ツール | 副管理者およびグループ管理者 | l ノードの管理 | 属性 | 関連項目 | 警告 | 注意事項
Solaris Resource Manager は、Solaris オペレーティング環境を拡張するものです。次の機能を提供します。
システム資源 (CPU、仮想メモリー、端末接続時間と接続数、およびプロセス数) のユーザーへの明示的な割り当て
各ユーザーの資源の使用状況についてのアカウンティング情報の蓄積
完全に階層化されたユーザーのグループ化。より高い組織的なレベルで、同じ程度の制御とアカウンティングが可能
副管理者によるユーザーの管理の分散化機能
次のコマンドを入力してください。
liminfo
Solaris Resource Manager が動作している場合、ユーザーの資源とアカウンティング情報が分類されて表示されます。これが Solaris Resource Manager のほとんどの機能を理解するためのヒントになります。
Solaris Resource Manager のマニュアルページのデフォルトのディレクトリは /usr/srm/man です。SunOS のマニュアルページのデフォルトのディレクトリは /usr/man です。
Solaris Resource Manager は、各ユーザーについての特別な情報を持っています。カーネルの内部的なユーザーの表現が変更され、各ユーザーは「l ノード」と呼ばれる新しい構造を持つようになります。各ユーザーの l ノードはユーザー ID 番号で索引付けされます。l ノードには、Solaris Resource Manager に必要な各ユーザーの特別な情報がすべて入っています。liminfo で表示されるほとんどの情報は l ノードから取得されます。
また、次のような特別な l ノードもあります。
常に存在します。これはスケジューリングツリーの root であり、制限を受けません。
srmadm(1MSRM) を参照してください。
srmadm(1MSRM) を参照してください。
limadm(1MSRM) を参照してください。
l ノード内のデータフィールドのことを「属性」と呼びます。属性は名前で参照されます。各属性は次の型の 1 つを持ちます。
integer; 時間間隔 (秒単位)
integer; システムの基準時点 (1970 年 1 月 1 日) に相対的な日付と時刻 (秒単位)
integer; ユーザー ID
enum { inherit, set, clear, group }
型が integer
または long
の属性は、現在すべて符号なし (unsigned) として扱われます。
flag は boolean
に似ていて、set または clear のどちらかに評価されます。3 番目の値 group はデバイスのフラグに限って使用されます (たとえば、terminal.flag.devicename)。特別な値 inherit については、後述の「階層的な制御」を参照してください。
l ノードは、スケジューリングツリーと呼ばれる階層構造でシステム全体に配置されます。スケジューリングツリーの根本の l ノードが root です。root は、root の真下の階層にある l ノードの「親」であり、この l ノードは、root の「子」です。この親子関係は階層のどのレベルでも同じです。スケジューリングツリーの各サブツリーは「スケジューリンググループ」、各サブツリーのルートにある l ノードはグループの「ヘッダー」と呼ばれます。スケジューリンググループ内のヘッダー以外のすべての l ノードは、そのヘッダーのスケジューリンググループの「メンバー」です。
システム管理者は、スケジューリンググループを使用して、そのシステムを使用する組織、部門、およびプロジェクトを表わすことができます。スケジューリンググループは、グループデータベースに定義された「ファイルグループ」とは関係ありません。
内側の l ノードも外側の l ノードもユーザーを表わすためには、各グループヘッダーに固有なユーザー ID が必要です。グループヘッダーのユーザーには、そのスケジューリンググループのメンバーに対する制限された管理権を与えることもできます。ユーザーをグループヘッダーと区別するための特別な属性はありません。つまり、グループヘッダーとは、スケジューリングツリーでの、1 人または複数の他のユーザーの親であるユーザーのことです。
スケジューリングツリーの構造は次の属性により定義されます。
Uid; 管理者により割り当てられます。スケジューリングツリーでの、l ノードの親のユーザー ID です。この属性の値は root の l ノードには意味がなく、ゼロに評価されます。
システム管理者は Solaris Resource Manager をカスタマイズして、すべての種類の資源を制御できます。次に、Solaris Resource Manager で制御できるシステム資源を示します。
CPU (プロセス実行率)
仮想メモリーのサイズ
プロセス数
端末の接続時間と接続回数
各ユーザーの資源割り当ては、l ノード内の usage 属性と limit 属性で制御されます。usage の値は、資源が消費されると増加し、資源が解放されると減少します。limit の値は、usage の上限値です。通常、limit がゼロの場合は制限がないことを意味します。アカウンティング情報は accrue 属性に保存されます。この値は決して減少することがなく、長期間の資源の消費を測定します。flag 属性はさまざまな特権を制御します。
資源は階層的に制御されます。つまり、単一のユーザーであるかのように、グループ全体に資源を割り当てることができます。このためには、l ノードの資源制限は、その l ノードがヘッダーであるスケジューリンググループの使用量の合計に対して設定します。
階層的に制御される資源の usage 属性は、ユーザーが所有する資源の使用量と、子の l ノードの usage 属性の合計です。また、ユーザーが所有する資源の使用量を示す myusage 属性もあります。limit 属性は usage 属性には適用されますが、myusage 属性には適用されません。
特権は、特別なフラグ値 inherit で階層的に制御されます。フラグの値がテストされ、inherit であると評価された場合、この値はスケジューリングツリーの親の l ノードから取得されます。親の値も inherit である場合、実際の値が見つかるまで、あるいは root の l ノードに到達するまで、スケジューリングツリーの上方向に検索が続けられます。root の l ノードのフラグが inherit である場合、構成可能なシステム全体のデフォルト値が使用されます。
システム内のすべてのプロセスは l ノードに接続され、その l ノードのカーネルの制限と特権を受けます。プロセスがフォークすると、子は親と同じ l ノードに接続されます。init プロセスとすべてのシステムプロセスは、通常、root の l ノードに接続されたままです。プロセスが異なる l ノードに接続されるのは、setuid(2) システムコールを呼び出すときだけです。このためには、スーパーユーザーの特権を持っていなければなりません。
動作中の l ノードとは、1 つまたは複数のプロセスが接続されている l ノード、あるいは 1 つまたは複数の動作中のメンバーを持つ l ノードのことです。つまり、あるプロセスがある l ノードに接続されているとき、その l ノードと、その l ノードのスケジューリングツリーにおけるすべての親が動作中になります。
Solaris Resource Manager がカーネルにインストールされているが、l ノードデータベースが存在しない場合、すべてのプロセスは代理の root l ノードに接続されます。代理の root l ノードは、l ノードファイルが開かれたときに、実 root l ノードに置換されます。
Solaris Resource Manager の CPU スケジューラ (SHR) は Solaris 時分割スケジューラ (TS) とは異なり、LWP ではなく、他のユーザーと比較することによりユーザーをスケジューリングします。LWP と比較する場合、並行実行するプロセスが増加すると、ユーザーが獲得できる CPU サービスが減少します。
Solaris Resource Manager が有効であるとき、スケジューリングクラスモジュール (SHR) がロードされます。SHR は機能的な意味で TS クラスを置換したものです。これにより、通常は init プロセスが SRM クラスで起動されます。したがって、init により起動されるすべての LWP のプロセスも SRM クラスで起動されます。LWP は実時間スケジューリング用の RT クラスに移動できます。つまり、システムカーネルプロセスは SYS クラスのままです。SRM クラスの LWP だけが Solaris Resource Manager でスケジューリングされます。
スケジューリングクラスに関わらず、すべての LWP のプロセスは常に同じ l ノードに接続されます。アドレス空間の所有権 (つまり、資格) のように、l ノード接続はすべての LWP のプロセスに影響するプロセス属性です。
次に、関連する属性を示します。
integer
; 管理者により割り当てられます。グループ全体に与えられる割当数です。この属性は、親グループが持つ権利のうち、どれだけの割合が当該グループに割り当てられるのかを定義します。割り当てられる割合は、親
l ノードの cpu.myshares とすべての動作中の同等な l ノードの cpu.shares との合計との比率です。
integer
; 管理者により割り当てられます。グループヘッダーのユーザーに与えられる割当数です。この属性は、グループが持つ権利のうち、どれだけの割合がグループヘッダーのユーザーに割り当てられるのかを定義します。この割当率は、すべての動作中の子
l ノードの cpu.shares の合計との比率です。外側の l ノードには意味がありません。
double
; カーネルにより蓄積および徐々に減少します。最近の CPU サービスに対する負担の蓄積合計。
double
; カーネルにより蓄積します。CPU サービスに対する負担の蓄積合計。
date
; カーネルにより設定されます。cpu.usage 属性が更新された最新時刻。
CPU 使用権利は、各ノードに shares と myshares を割り当てることのできる管理者により選択されます。これは、会社における役割と似ています。絶対的な量は重要でなく、他の l ノードの割当量との比較だけが意味を持ちます。管理者は、希望の CPU 使用権利に比例している限り、これら 2 つの属性にどのような数も選択できます。さらに、スケジューリングツリーのあるレベルでの数の選択は、他のレベルまたは枝での選択とは完全に無関係です。
たとえば、次のようなスケジューリングツリーのレベル (または枝) を考えてみてください。このツリーでは、ユーザー A1 がヘッダーで、ユーザー B1、B2、および B3 が子です。
A1 |
cpu.shares=250, |
cpu.myshares=15 |
B1 |
cpu.shares=10, |
cpu.myshares=100 |
B2 |
cpu.shares=20, |
cpu.myshares=3000 |
B3 |
cpu.shares=5, |
cpu.myshares=2 |
このレベルの割当数の合計は、ヘッダーの myshares + 子の shares = 15 + (10 + 20 + 5) = 50 です。このとき、グループ A1 が 60% の CPU 使用権利を持っていると仮定します。ユーザー A1 は (15 / 50) x 60% = 18%、グループ B1 は (10 / 50) x 60% = 12%、グループ B2 は (20 / 50) x 60% = 24%、グループ B3 は (5 / 50) x 60% = 6% の CPU 使用権利を持っていることになります。これらの権利は、B1、B2、および B3 の下で同様な方法でさらに分割されます。
例で示しているように、l ノードの shares 属性は他の l ノードと比較しながら l ノードの CPU 使用権利を定義します。これらの属性が長期間この CPU 権利を使用すれば、Solaris Resource Manager は、l ノードが使用権利と比例する CPU サービスを受けることを保証します。
動作中でない l ノードを無視することにより、スケジューラは関連する値を 0 から 1 までの割合として直接計算します。この割合のことを形式的に割当率と呼びます。l ノードがアクティブになったとき、あるいは動作中でなくなったとき、つまり myshares 属性または shares 属性が変更されたとき、すべての割当率は計算し直されます。
プロセスが実行されるとき、接続されている l ノードの cpu.usage 属性に負担が蓄積されます。カーネルは定期的にすべての l ノードの CPU 使用量を徐々に減らします。つまり、CPU 使用量に減少係数 (1 よりも小さい数) を掛けます。これにより、スケジューリングにおいて、より新しい CPU 使用量が重点的に考慮されます。スケジューラは頻繁にすべてのプロセスの優先順位を調整し、各 l ノードの相対的な CPU 使用量をその割当率に収束させます。この負のフィードバックメカニズムにより、各ユーザーやグループが受ける CPU サービス割当率を直接制御できます。
どのような場合でも要求は一様でないため、ユーザーは割当率どおりの CPU 率を受け取ることはありません。l ノードの実効割当率とは、割当率との CPU 使用量のバランスを復元するために受け取らなければならない CPU 率のことです。ユーザーの実効割当率とは、要求した場合にユーザーが受け取れるおおよその CPU 率のことです。
nice コマンドはプロセスに適切な影響を与えます。つまり、nice 値が高くなるほど、プロセスがゆっくりと実行されることを意味します。しかし、Solaris Resource Manager では、このようなプロセスには負担が割引されて蓄積されるため、ユーザーは nice を使用することでも利益を得ます。最大の nice 値は特別に扱われます。つまり、このようなプロセスはバックグラウンドプロセスとなり、バックグラウンドでないプロセスが CPU を要求していないとき、すなわち、使用できる CPU が余っているときにだけスケジューリングされます。priocntl コマンドを使用すると、プロセスの nice 値を設定または表示できます。詳細は、nice(1) と priocntl(1MSRM) を参照してください。
次に、関連する属性を示します。
long
; 読み取り専用。カーネルにより計算されます。l
ノードに接続されたすべてのプロセスが占有する仮想メモリー空間の合計です (バイトまたは 1K バイト単位)。
long
; 読み取り専用。カーネルにより計算されます。l ノードとそのメンバーの l ノードに接続されたすべてのプロセスが占有する仮想メモリー空間の合計です
(バイトまたは 1K バイト単位)。この値は、l ノードの memory.myusage に、すべての子の l
ノードの memory.usage 属性の合計を加えたものです。
long
; 管理者により割り当てられます。memory.usage 属性の最大許容値です (バイト単位)。継承により制限されていない限り、ゼロの値は無制限を意味します。
long
; 管理者により割り当てられます。l ノードに接続された任意の個々のプロセスが占有する可能性がある仮想メモリー空間の最大許容値です
(バイト単位)。継承により制限されていない限り、ゼロの値は制限がないことを意味します。
long
; カーネルにより蓄積されます。memory.usage 属性の値を一定の時間、連続して蓄積した正確な合計です
(毎秒バイト単位)。
メモリーは、mmap(2) などのいくつかのシステムコールによるスタックページフォルトにより割り当てられます。メモリー制限に達した場合、このようなシステムコールは失敗します。スタックフォルトが失敗するとプロセスは終了します (終了シグナルが代替スタックに補足されている場合を除きます)。システムコールが失敗すると、プログラムには仮想メモリー (スワップ空間) がなくなったように見えます。プログラムの中には、これを事実と受け止め、通常の動作を継続し、警告を出力するものもあります。また、完全に失敗し、診断メッセージを出力するプログラムもあります。Solaris Resource Manager は、影響を受けるすべてのローカルユーザーの端末に警告メッセージを書き込みます (limdaemon(1MSRM) を参照してください)。
メモリーのアカウンティングと制限は、スケジューリングクラスに関係なく、プロセスに適用されます。
次に、関連する属性を示します。
long
(時間間隔); limdaemon(1MSRM)
により増加および減少します。現在グループに負荷されている接続時間です (秒単位)。1.0 以外のデバイスコストが設定されている場合、実際の接続時間とは異なる可能性があります。
long
(時間間隔); 管理者により割り当てられます。減衰点ごとに terminal.usage
属性から削除される値です。
time
; 管理者により割り当てられます。減少点間の時間間隔です。
date
; 管理者により割り当てられ、limdaemon(1MSRM) により更新されます。最新の減少点が発生した時刻です。
long
(時間間隔); 管理者により割り当てられます。terminal.usage 属性の最大許容値です。inherit により制限されていない限り、ゼロの値は制限がないことを意味します。
long
(時間間隔); limdaemon(1MSRM) により増加します。グループの接続時間の合計です (秒単位)。
flag
; 管理者により割り当てられます。これらのフラグはすべてのデバイスに存在する必要はありません。対応するフラグが存在し、set であると評価された場合、あるいは対応するフラグが存在しない場合、ユーザーは当該デバイスにログインできます。
ログインは、特別な PAM モジュール (pam_srm(5SRM)) 経由で Solaris Resource Manager に認識されます。
ログイン時、ユーザーとそのユーザーが属するすべてのスケジューリンググループの接続時間上限値がチェックされます。ユーザーの端末使用時間が上限値を超えている場合、通知がユーザーに送られ、ログインは拒否されます。そうでない場合、デバイスの名前とコストが出力され、ユーザーにログインが許可されます。スーパーユーザーには、このようなチェックは行われません。
ログイン中、任意のユーザーまたはスケジューリンググループが 5 分以内に接続時間の上限値に達する場合、このようなすべてのユーザーまたはスケジューリンググループのメンバーの端末に警告メッセージが書き込まれます。上限値に達すると、即座にログアウトするように要求するメッセージが書き込まれます。数秒後 (デフォルトの猶予期間は 30 秒)、要求されたユーザーがまだログインしている場合、そのユーザーに関連するプロセスに SIGTERM シグナルが送信され、さらに約 15 秒後、SIGKILL シグナルが送信されます。
Solaris Resource Manager のデーモンプロセス (limdaemon(1MSRM)) により、定期的に端末使用量が更新され、端末制限の設定が行われます。このデーモンが動作していない場合、使用量は増加せず、ログイン時にチェックされる上限値以外の制限の監視も行われません。接続時間のアカウンティングと制限は、スケジューリングクラスに関係なく、プロセスに適用されます。
ユーザーが上限値に達するか、接続時間の制限に近づいたとき、警告メッセージが limdaemon(1MSRM) プロセスによりユーザーの端末に書き込まれます。メッセージは直接ユーザーの端末に書き込まれます。このとき、utmp エントリからデバイス名が検索され、write(2) システムコールが使用されます。警告は簡潔で人間が読めるテキスト形式です。通常、次のように表示されます。
User username "resource limit reached" by username.
1 番目の username は上限値に達した l ノードです。すべてのユーザーに影響を与えるため、この l ノードがヘッダーであるスケジューリンググループ内のすべてのユーザーにメッセージが配信されます。2 番目の username は、上限値に達したアクションを起こしたユーザーです。
特権は通常 flag 属性で制御します。次に、定義済みの属性を示します。
flag
; 管理者により割り当てられます。設定されている場合、ユーザーは副管理者として
l ノードを自由に追加、変更、および削除できます。また、任意の l ノード中の任意の属性を変更でき、さらに任意の l ノードにプロセスを接続できます。このフラグはスーパーユーザーには影響を与えません。スーパーユーザーは常にこれらの特権を持ちます。次の flag.admin と「副管理者」および「グループ管理者」を参照してください。
flag
; 管理者により割り当てられます。設定されている場合、ユーザーはグループ管理者です。このフラグは特権を与えますが、その l ノードが影響を与えるのは、グループヘッダーであるスケジューリングサブツリー内のユーザーだけに制限されます。このフラグはスーパーユーザーには影響を与えません。スーパーユーザーは常にこれらの特権を持ちます。「副管理者」および「グループ管理者」を参照してください。
flag
; 管理者により割り当てられます。設定されている場合、ユーザーはログインできず、リモートシェルまたは実行デーモン経由で接続が拒否されます。nologin フラグと onelogin フラグの両方が設定されている場合、nologin が優先されます。
flag
; 管理者により割り当てられます。設定されている場合、ユーザーは 1 度に 1 回のログイン接続しかできません。このため、リモートシェルまたは実行デーモン経由の接続はログインとしてカウントされます。nologin フラグと onelogin フラグの両方が設定されている場合、nologin が優先されます。
integer
; 読み取り専用。Solaris Resource Manager のカーネルにより計算されます。現在のログイン数です。この値は、Solaris
Resource Manager が認識するログインまたはリモート接続数を表わします。この属性は厳密には特権を制御しません。しかし、onelogin フラグと asynckill フラグに関連するため、ここに記述しました。
flag
; 管理者により割り当てられます。設定されている場合、logins 属性の値がゼロになったとき、l
ノードに接続されているすべてのプロセスが強制終了されます。
flag
; 管理者により割り当てられます。設定されている場合、logins 属性の値がゼロになったとき、l
ノードに接続されているすべてのプロセスの nice 値が最低値に設定されます。
limreport(1SRM) は、すべてのユーザーが利用可能な簡単で強力なレポート作成プログラムです。limreport はパスワードマップを逐次走査し、指定した selection 式に従ってユーザーを選択します。選択したユーザーごとにレポートが出力されます。書式は print(3C) の形式で指定します。選択の式とレポートへの挿入の式で、任意の l ノード属性とパスワードマップフィールドを参照できます。
liminfo(1SRM) は、呼び出し元ユーザーの l ノードの内容についてのレポートを出力します。あるいは、ユーザーリストの l ノードについての情報を連続で出力します。利用可能なレポートの書式は 5 つあります。このうち 3 つの書式は人間が読みやすいように設計されています。4 番目の書式はフィルタが吸収できるように特別に設計されています。5 番目の書式はデバッグ用です。
uselimadm フラグ (特権を参照) が設定されているユーザーは副管理者です。副管理者は中央管理者と同じ権利を持ちます。グループ管理者には、admin フラグだけが設定されます。
次の節「l ノードの管理」で記述しているツールについては、スーパーユーザーはすべての機能を使用でき、グループ管理者には一部の機能が制限されます。
次のコマンドでは l ノードを管理できます。
limadm(1MSRM) は、l ノードの属性を変更するためのメインとなるツールです。変更は、指定した属性に対する数値または記号の代入、加算、または減算として表わされます。スーパーユーザーと uselimadm ユーザーは limadm を使用して、任意の l ノードの任意の書き込み可能な属性を変更できます。副管理者は、自分が所有するスケジューリンググループのメンバー以外に割り当てられた l ノードの上限値や特権は変更できません。存在しない l ノードの属性に有効な代入を行うと、その l ノードが作成されます。対応するユーザー ID への最初の参照をパスワードマップに作成した直後には、このコマンドを使用して、l ノードを作成してください。
また、limadm(1MSRM) は、動作中でない外側の l ノードを削除するのにも使用できます。副管理者は、自分のスケジューリンググループのメンバー以外の l ノードは削除できません。このコマンドを使用して l ノードを削除してから、対応するユーザー ID への最後の参照をパスワードマップから削除してください。
limdaemon(1MSRM) は、ブート時、Solaris Resource Manager の起動スクリプトで自動的に起動されます。そして、すべての l ノード (あるいは指定したユーザーリストの l ノード) にある端末の usage 属性を減少させます。使用量の値の自然減少を調節するには、各 l ノード中の decay、interval、および lastdecay 属性を使用します。
srmuser(1SRM) は、指定した l ノードにシェルを接続し、(任意) 指定したコマンドを実行します。このコマンドは、別のユーザーの代わりにコストが高い操作を実行し、使用した CPU やメモリーを管理者ではなくユーザーに負担させるときに使用します。su(1M) とは異なり、このコマンドは実ユーザー ID や実効ユーザー ID を変更しません。
nice(1), su(1M), mmap(2), setuid(2), write(2), printf(3C), liminfo(1SRM), limreport(1SRM), srmstat(1SRM), srmuser(1SRM), dispadmin(1MSRM), limadm(1MSRM), limdaemon(1MSRM), priocntl(1MSRM), srmadm(1MSRM), srmkill(1MSRM), brk(2SRM), nice(2SRM), setuid(2SRM), pam_srm(5SRM)
『Solaris Resource Manager 1.3 のシステム管理』
新たに作成した l ノードのほとんどの属性はデフォルトでゼロです。ただし、cpu.shares と cpu.myshares だけは最小値 (1) に設定され、uselimadm フラグと admin フラグは clear に、これ以外のすべてのフラグは inherit に設定されます。したがって、他のユーザーへの管理特権はデフォルトで拒否されます。つまり、ユーザーが何らかの制限を受けるのは、意図的なアクションがあるときだけです。したがって、副管理者はアクションを起こす前に、その決定の含意を完全に考慮しなければなりません。
Solaris Resource Manager のシステムは強力で幅広く影響します。したがって、間違った使用は望ましくない重大な結果を引き起こすことになります。Solaris Resource Manager のユーザーは明確な方針の元にシステム管理を行なってください。
現在 Solaris Resource Manager のメッセージ通知機能では、ローカルユーザーだけにメッセージを送信します。
ローカルユーザーに配信されるロケール固有の翻訳メッセージは、limdaemon プロセスのロケールに従うので、ユーザーによって異なる可能性があります。
このマニュアルページは、SunOS 5.6、SunOS 5.7、および SunOS 5.8 に適用できます。
名前 | 概要 | はじめに | 概念 | 資源の制御 | レポート作成ツール | 副管理者およびグループ管理者 | l ノードの管理 | 属性 | 関連項目 | 警告 | 注意事項