この章では、マシン資源のパーティション分割に使用される資源プールについて説明します。資源プールを使用すると、作業負荷によって特定の資源が重複して消費されないように、作業負荷を分離することができます。このような方法で資源を確保すると、さまざまな作業負荷が混在するシステム上で予測どおりのパフォーマンスを得ることができます。
資源プールは、プロセッサセットの構成やスケジューリングクラスの割り当て (オプション) に対して一貫した構成メカニズムを提供します。
資源プールは、複数のパーティションをグループ化することにより、ラベル付けされている作業負荷とハンドルを対応付けることができます。/etc/project データベースにある各プロジェクトのエントリは、そのエントリに対応付けられた資源プールを持つことができます。プロジェクトで開始される新しい作業は、適切なプールに結合されます。
資源プールメカニズムは主に、5 つ以上の CPU を搭載する大規模なマシンで使用されます。ただし、小規模なマシンでもこの機能を活用することができます。小規模なマシンでは、重要でない資源パーティションを共有するプールを作成できます。重要な資源にだけ、専用のプールが使用されます。
資源プールは、以下で説明するように、多くの管理作業に適用できる汎用メカニズムを提供します。
プールの機能を使用して、1 つのサーバーを 2 つのプールに分割します。
一方のプールは、ログインセッションとタイムシェアリングユーザーによる対話型作業に使用されます。もう一方のプールは、バッチシステムを介して投入されるジョブに使用されます。
アプリケーションの要件に基づいて、対話型アプリケーション用の資源をパーティション分割します。
ユーザーが期待するサービスレベルを設定します。
最初は、目標とする最終的なサービスの一部だけを実行するマシンを導入することがあります。マシンをオンラインにしたときに、予約方式の資源管理メカニズムが確立していなければ、ユーザーがサービスに不満を持つ可能性があります。
たとえば、フェアシェアスケジューラは CPU の使用率を最適化します。ユーザーから見ると、1 つしかアプリケーションを実行していないマシンの応答時間は、複数のアプリケーションがロードされているマシンの応答時間に比べ、極端に速くなります。アプリケーションごとに個別のプールを用意することにより、各アプリケーションで使用可能な CPU 数の上限をあらかじめ設定してから、すべてのアプリケーションを運用することができます。
多数のユーザーをサポートするサーバーをパーティション分割します。
サーバーのパーティション分割によって、ユーザーごとの応答が時間をより確実に予測できる分離メカニズムが提供されます。
ユーザーをグループに分割して個別のプールに結合し、フェアシェアスケジューラ (FSS) 機能を使用すれば、CPU 割り当てを調整して、優先順位を持つユーザーグループをサポートできます。このような割り当ては、ユーザーの役割や課金などに基づいて行えます。
資源プールを使用して、変動する作業負荷に対応します。
サイトでの作業負荷の変動が月次、四半期、年次などの周期で予想できる場合があります。このような変動がサイトで予想できる場合は、cron(1M) ジョブで pooladm を実行して、複数のプール構成を使い分けることができます。
RT スケジューラと専用のプロセッサ資源を使用して、リアルタイムプールを作成します。
次の表に示すコマンドは、プール機能に対する主要な管理インタフェースを提供します。
コマンド名 |
説明 |
---|---|
pooladm(1M) |
特定の構成を起動したり、現在の構成を終了したりする。オプションを指定しないで実行すると、pooladm は、現在実行中のプール構成を表示する |
poolbind(1M) |
プロジェクト、タスク、およびプロセスを手動でプールに結合できる |
poolcfg(1M) |
プール構成ファイルの作成と変更を行う。-c オプションに info を指定して実行すると、poolcfg は現在の構成を表示する |
ライブラリの API は、libpool(3LIB) で提供されます。プログラムからプール構成を操作するには、このライブラリを使用します。
資源プールのフレームワークは、マシンのビューを独自の構成ファイルに格納します。このファイルの格納場所は、プールのフレームワークの実装によって異なります。この構成ファイルは、プールのフレームワークにとってのマシンのビューを表します。この構成ファイルには、構成されたプールとパーティション分割可能な資源の編成に関する情報も含まれます。各プールには次のものが含まれます。
プロセッサセットまたは CPU 資源のパーティションへの参照
プールのデフォルトのスケジューリングクラスを示すプロパティ
プールをシステム上に実装するには、次のどちらかの方法を使用します。
Solaris ソフトウェアが起動すると、init スクリプトは /etc/pooladm.conf ファイルが存在するかどうかをチェックします。このファイルが存在する場合は、pooladm が呼び出され、この構成をアクティブなプール構成にします。システムは、/etc/pooladm.conf で指定されている編成に従って、独自の構成ファイルを作成します。マシンの資源は指定どおりにパーティション分割されます。
Solaris 環境が起動しているときは、pooladm コマンドを使用して、プール構成が存在しない場合はプール構成を起動したり、プール構成を変更したりできます。デフォルトでは、pooladm は /etc/pooladm.conf の内容を使用します。ただし、別のディレクトリとファイル名を指定し、そのファイルを使用してプール構成を変更することもできます。
動的再構成 (DR) を使用すると、システムの実行中にハードウェアを再構成できます。DR は使用可能な資源量に影響を与えるので、プール機能を DR 操作に含めておく必要があります。DR 処理が開始されると、プールのフレームワークは構成の妥当性を検証します。
現在のプール構成が無効にならないかぎり、DR 処理は、独自の構成ファイルが更新されるまで実行を続けます。無効な構成とは、使用可能な資源でサポートできない構成のことです。
DR 処理によってプール構成が無効になった場合、操作は失敗し、メッセージログにメッセージが書き込まれます。構成処理を強制的に最後まで実行するには、DR の強制オプションを使用します。強制オプションで処理を続行すると、プール構成は、新しい資源構成に合うように変更されます。
構成ファイルには、システム上で作成されるプールに関する記述が含まれます。構成ファイルには、操作可能な構成要素と、そのリソースタイプが記述されています。
種類 |
説明 |
---|---|
pset |
プロセッサセット資源 |
pool |
資源の対応付けを示す名前付きの集合 |
system |
マシンレベルの実体 |
操作可能な構成要素については、poolcfg(1M) を参照してください。
構成ファイル /etc/pooladm.conf は、次の 2 つの方法で作成できます。
poolcfg を使って現在のシステム上の資源を検出し、その結果を構成ファイルに記録します。
この方法では、ファイルを簡単に作成できます。プール機能で操作できるシステム上のアクティブな資源とコンポーネントがすべて記録されます。資源には、既存のプロセッサセットの構成が含まれます。最後に、プロセッサセットの名前を変更したり、必要に応じてプールを作成したりして、構成を変更できます。
poolcfg を使用して、新しいプール構成を作成します。
この方法は、他のマシンの構成を作成する場合や、作成済みの構成を後で現在のマシンに適用する場合に使用します。
poolcfg または libpool を使用して、/etc/pooladm.conf ファイルを変更します。このファイルを直接編集しないでください。
/usr/sbin/poolcfg コマンドの -c オプションに discover を指定して、プール構成ファイルを作成します。作成される /etc/pooladm.conf ファイルには、既存のプロセッサセットが含まれます。
デフォルトのファイル名 /etc/pooladm.conf を使用する代わりに別のファイル名を指定することもできます。別のファイル名を指定すると、poolcfg コマンドは指定した別のファイルに対して実行されます。
たとえば、検出された構成を /tmp/foo ファイルに記録するには、次の手順に従います。
/usr/sbin/poolcfg コマンドの -c オプションの引数に create を指定して、tester というシステムに簡単な構成ファイルを作成します。-c オプションの引数に空白が含まれている場合は、引用符で囲んでください。
スーパーユーザーになります。
次のコマンドを入力します。
# poolcfg -c 'create system tester' |
構成ファイルの内容を読みやすい形式で表示します。
# poolcfg -c info system tester int system.version 1 boolean system.bind-default true string system.comment |
単純な構成を拡張するには、batch というプロセッサセットと batch というプールを作成して、両者を対応付けて結合します。-c オプションの引数に空白が含まれている場合は、引用符で囲んでください。
スーパーユーザーになります。
batch というプロセッサセットを作成します。
# poolcfg -c 'create pset batch (uint pset.min = 2; uint pset.max = 10)' |
batch というプールを作成します。
# poolcfg -c 'create pool batch' |
プロセッサセットとプールを対応付けて結合します。
# poolcfg -c 'associate pool batch (pset batch)' |
対応付けた後の構成を表示します。
# poolcfg -c info system tester int system.version 1 boolean system.bind-default true string system.comment pool batch boolean pool.default false boolean pool.active true int pool.importance 1 string pool.comment pset batch pset batch int pset.sys_id -2 string pset.units population boolean pset.default true uint pset.max 10 uint pset.min 2 string pset.comment boolean pset.escapable false uint pset.load 0 uint pset.size 0 |
プールをスケジューリングクラスに対応付けることで、プールに結合されているすべてのプロセスがこのスケジューラを使用できるようになります。このためには、pool.scheduler プロパティにスケジューリングクラスの名前を設定します。次の例は、batch というプールを FSS に対応付ける方法を示します。
スーパーユーザーになります。
batch プールを変更して、FSS に対応付けます。
# poolcfg -c 'modify pool batch (string pool.scheduler="FSS")' |
対応付けた後の構成を表示します。
# poolcfg -c info system tester int system.version 1 boolean system.bind-default true string system.comment pool batch boolean pool.default false boolean pool.active true int pool.importance 1 string pool.comment string pool.scheduler FSS pset batch pset batch int pset.sys_id -2 string pset.units population boolean pset.default true uint pset.max 10 uint pset.min 2 string pset.comment boolean pset.escapable false uint pset.load 0 uint pset.size 0 |
poolcfg -f を使用すると、poolcfg コマンドの -c オプションに指定する引数をテキストファイルから入力できます。この手法は、一連の操作を 1 つずつ実行する場合に使用します。複数のコマンドを処理した場合でも、それらのコマンドがすべて正常に終了するまで、構成は更新されません。特に大規模な構成や複雑な構成の場合は、この手法を使用した方が、個々のサブコマンドを起動するよりも便利です。
入力ファイルを作成します。
$ cat> poolcmds.txt create system tester create pset batch (uint pset.min = 2; uint pset.max = 10) create pool batch associate pool batch (pset batch) |
スーパーユーザーになります。
次のコマンドを入力します。
# /usr/sbin/poolcfg -f poolcmds.txt |
pooladm(1M) を使用して、特定のプール構成を起動したり、実行中のプール構成を終了したりします。
デフォルトの静的構成ファイル /etc/pooladm.conf 内の構成を起動するには、「commit configuration」を意味する -c オプションを指定して、pooladm を実行します。
実行中の構成とプロセッサセットなどの関連するすべての資源を削除するには、「remove configuration」を意味する -x オプションを使用します。
pooladm コマンドの -x オプションを使用すると、独自の動的構成ファイルだけでなく、その動的構成ファイルに対応付けられているすべての資源構成も削除されます。つまり、-x オプションは、無効なプール構成から回復するためのメカニズムを提供します。すべてのプロセスは、マシン上のすべての資源を共有します。
1 つのプロセッサセット内でスケジューリングクラスを混在させると、予期できない結果が生じる可能性があります。pooladm -x を使って無効な構成から回復する場合は、priocntl(1) を使用して、実行中のプロセスを別のスケジューリングクラスに移動する必要があります。
実行中のプロセスをプールに結合するには、次の 2 つの方法を使用できます。
poolbind(1M) コマンドを使用して、特定のプロセスを名前付き資源プールに結合する
project(4) データベース内の project.pool 属性を使用して、新しいログインセッションや newtask(1) で起動されるタスクが結合されているプールを特定する
次の手順では、プロセス (現在のシェルなど) を手動で ohare というプールに結合します。
タスクまたはプロジェクトをプールに結合するには、poolbind コマンドに -i オプションを指定します。次の例では、airmiles プロジェクト内のすべてのプロセスを laguardia プールに結合します。
プロジェクト内の新しいプロセスを自動的にプールに結合するには、project.pool 属性を project データベース内の各エントリに追加します。
たとえば、studio と backstage という 2 つのプールを持つ構成が存在するものとします。/etc/project ファイルの内容は、次のとおりです。
user.paul:1024::::project.pool=studio user.george:1024::::project.pool=studio user.ringo:1024::::project.pool=backstage passes:1027::paul::project.pool=backstage |
この構成の場合、ユーザー paul によって起動されるプロセスは、デフォルトで studio プールに結合されます。
上記の構成を使用することにより、ユーザー paul は自分が起動したプロセスに結合されているプールを変更できます。newtask を使用して、passes プロジェクトで起動されるプロセスを backstage プールにも結合できます。