ユーザーが使用可能なすべてのリソースを消費しないようにするため、N1 Grid Engine 6.1 ソフトウェアは、グローバル、キュー、またはホスト層で設定可能なコンプレックス属性をサポートしています。この階層型のリソース管理手法は強力ではありますが、ギャップが生じます。多数のさまざまなカスタムリソース、ユーザーグループ、およびプロジェクトで構成される大規模な導入では特に重要な意味を持ちます。リソース割り当て機能は、ボトルネックリソースが不足したときに、あるプロジェクトまたは部署がそのリソースを譲るように制御して、こうした企業環境を管理できるようにすることで、このギャップを埋めます。
リソース割り当て機能によって、数種類のリソース、数種類のリソース消費者、クラスタ内のすべてのジョブ、また消費者の組み合わせに対して制限を適用することができます。この意味では、リソースは N1 Grid Engine 構成で認識されている、定義済みコンプレックス属性のすべてです。コンプレックス属性の詳細は、complex(5) のマニュアルページを参照してください。リソースには、slots、 arch、mem_total、num_proc、swap_total、組み込みリソース、あるいは compiler_license のようなカスタム定義のリソースを指定できます。リソース消費者は、ユーザー、キュー、ホスト、プロジェクト、および並列環境単位になります。
リソース割り当て機能は、消費者が任意の時点で使用可能なリソースを制限する手段を提供します。この制限は、ユーザー、部署、およびプロジェクトに優先順位を付ける間接的な手段になります。ユーザーがリソースを取得する優先順位を直接定義するには、「緊急度ポリシーの構成」および 「共有ベースポリシーの構成」で説明しているリソースの緊急度および共有ベースポリシーを利用します。
N1 Grid Engine 6.1 ソフトウェアを使用してリソースを制限するには、qquota および qconf コマンド、または QMON グラフィカルインタフェースを使用します。詳細は、qquota(1) および qconf(1) のマニュアルページを参照してください。
リソース割り当てセットを使用して、任意のジョブ要求に対して最大リソース消費量を指定することができます。リソース割り当てセットを定義すると、スケジューラはそのセットを利用し、割り当て量の超過がないことに注意しながら、次に実行可能なジョブを選択することができます。リソース割り当て量を設定することの最大の意味は、リソース割り当て量を超えないジョブだけがスケジューリングされて、実行されることです。
リソース割り当てセットでは、特定のジョブ要求に対する最大リソース割り当て量を定義します。構成された規則セットのすべてが、常に適用されます。複数のリソース割り当てセットが定義されている場合は、もっとも制限が厳しいセットが適用されます。リソース割り当てセットはどれも、1 つ以上のリソース割り当て規則で構成されます。これらの規則が順に評価され、特定の要求に合致する最初の規則が使用されます。つまり、リソース割り当てセットの中の 1 つのリソース割り当て規則が特定の要求に対する実効規則になります。
リソース割り当てセットは、次の情報で構成されます。
名前 (name) – リソース割り当てセットの名前。
有効 (enabled) – スケジューリングの判定時にリソース割り当てセットを考慮するかどうかを示すブール型値。enabled が true の場合は、リソース割り当てセットは有効になり、スケジューリングの判定時に考慮されます。デフォルト値は false です。
説明 (description) – セットを説明する任意の文字列 (省略可能)。デフォルト値は NONE です。
制限規則 (limit rule) – どのリソース割り当てセットにも、少なくとも 1 つの制限規則が必要です。この規則を limit フィールドに含めます。たとえば、次の制限規則はユーザー全体で最大スロット割り当て数を 10 個に制限します。limit users * to slots=10. 制限規則には、次の情報が含まれます。
名前 (name) – 規則の名前 (省略可能)。使用する場合は、リソース割り当てセット内で一意でなければなりません。
フィルタスコープ (filter scope) – この割り当てを適用するリソース消費者をリスト指定します。各リソース消費者は、1 つのキーワードのあとに消費者のコンマ区切りのリストで設定します。使用できるキーワードは次のとおりです。users、 projects、queues (クラスタキュー)、hosts、および pes (並列環境)。たとえば、users {user1, user2} はリソース消費者の例です。users {user1, user2} hosts * はフィルタスコープの例です。このフィルタスコープは、user1 および user2 に対する最大割り当て量をホストとは別に設定された制限の最大数に制限します。
リソース割り当て定義に拡張可能なリストを含めるには、リソース消費者リストを中括弧 {} で囲みます。
リストから特定のリソースタイプを除外するには、感嘆符 ! を使用します (「否定」記号とも呼ばれることがある)。
制限 (limit) – リソースに対する実際の制限を定義した属性と値のペア。例: virtual_free=2G。属性と値のペアはコンマで区切って複数指定することができます。例: virtual_free=2G,swap_free=1.5G。
次のリソース割り当てセット例は、user1 と user2 に対して、ホストグループ lx_hosts の各ホストの未使用仮想空間の最大割り当て量を 2 ギガバイトに制限します。
{ name max_virtual_free_on_lx_hosts description "resource quota for virtual_free restriction" enabled true limit users {user1,user2} hosts {@lx_host} to virtual_free=2g }
リソース割り当て規則では、必ず、使用可能なリソースの最大値を定義します。だいたいの場合、これらは静的であり、一致するすべてのフィルタスコープに対して同じです。いくつかの異なる規則を、異なるスコープに適用することもできますが、それらの規則はほぼ同じです。この場合は、規則を複製する代わりに、動的制限を定義できます。
動的制限では、代数式を使用して規則制限値を導出します。代数式でコンプレックス属性を参照し、その値を使用して制限値を計算することができます。
次は、動的制限の使用例です。ユーザーは、すべての Linux ホストで 1 CPU 当たり 5 つのスロットの使用が許可されます。
limit hosts {@linux_hosts} to slots=$num_proc*5 |
num_proc の値は、ホスト上のプロセッサ数です。制限は式 $num_proc*5 で求められ、ホストによって異なることがあります。上記の例を展開すると、たとえば次のような制限が考えられます。
CPU 2 つのホストの場合、ユーザーはジョブの実行に 10 個のスロットを使用できます。
CPU 1 つのホストの場合、ユーザーはジョブの実行に 5 個のスロットを使用できます。
num_proc の代わりに、負荷値あるいは消費可能リソースのいずれかとしてホストが認識するほかのコンプレックス属性をすべて使用することができます。