Solaris のシステム管理 (資源管理とネットワークサービス)

第 10 章 資源プール

この章では、マシン資源のパーティション分割に使用される資源プールについて説明します。資源プールを使用すると、作業負荷によって特定の資源が重複して消費されないように、作業負荷を分離することができます。このような方法で資源を確保すると、さまざまな作業負荷が混在するシステム上で予測どおりのパフォーマンスを得ることができます。

概要

資源プールは、プロセッサセットの構成やスケジューリングクラスの割り当て (オプション) に対して一貫した構成メカニズムを提供します。

図 10-1 資源プールのフレームワーク

この図は、プールがプロセッサセットとオプションのスケジューリングクラスから構成されていることを示しています。

資源プールは、複数のパーティションをグループ化することにより、ラベル付けされている作業負荷とハンドルを対応付けることができます。/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) で提供されます。プログラムからプール構成を操作するには、このライブラリを使用します。

プールのフレームワーク

資源プールのフレームワークは、マシンのビューを独自の構成ファイルに格納します。このファイルの格納場所は、プールのフレームワークの実装によって異なります。この構成ファイルは、プールのフレームワークにとってのマシンのビューを表します。この構成ファイルには、構成されたプールとパーティション分割可能な資源の編成に関する情報も含まれます。各プールには次のものが含まれます。

システム上でのプールの実装

プールをシステム上に実装するには、次のどちらかの方法を使用します。

  1. Solaris ソフトウェアが起動すると、init スクリプトは /etc/pooladm.conf ファイルが存在するかどうかをチェックします。このファイルが存在する場合は、pooladm が呼び出され、この構成をアクティブなプール構成にします。システムは、/etc/pooladm.conf で指定されている編成に従って、独自の構成ファイルを作成します。マシンの資源は指定どおりにパーティション分割されます。

  2. Solaris 環境が起動しているときは、pooladm コマンドを使用して、プール構成が存在しない場合はプール構成を起動したり、プール構成を変更したりできます。デフォルトでは、pooladm/etc/pooladm.conf の内容を使用します。ただし、別のディレクトリとファイル名を指定し、そのファイルを使用してプール構成を変更することもできます。

動的再構成の処理と資源プール

動的再構成 (DR) を使用すると、システムの実行中にハードウェアを再構成できます。DR は使用可能な資源量に影響を与えるので、プール機能を DR 操作に含めておく必要があります。DR 処理が開始されると、プールのフレームワークは構成の妥当性を検証します。

現在のプール構成が無効にならないかぎり、DR 処理は、独自の構成ファイルが更新されるまで実行を続けます。無効な構成とは、使用可能な資源でサポートできない構成のことです。

DR 処理によってプール構成が無効になった場合、操作は失敗し、メッセージログにメッセージが書き込まれます。構成処理を強制的に最後まで実行するには、DR の強制オプションを使用します。強制オプションで処理を続行すると、プール構成は、新しい資源構成に合うように変更されます。

プール構成の作成

構成ファイルには、システム上で作成されるプールに関する記述が含まれます。構成ファイルには、操作可能な構成要素と、そのリソースタイプが記述されています。

種類 

説明 

pset

プロセッサセット資源 

pool

資源の対応付けを示す名前付きの集合 

system

マシンレベルの実体 

操作可能な構成要素については、poolcfg(1M) を参照してください。

構成ファイル /etc/pooladm.conf は、次の 2 つの方法で作成できます。

poolcfg または libpool を使用して、/etc/pooladm.conf ファイルを変更します。このファイルを直接編集しないでください。

検出によって構成を作成する方法

/usr/sbin/poolcfg コマンドの -c オプションに discover を指定して、プール構成ファイルを作成します。作成される /etc/pooladm.conf ファイルには、既存のプロセッサセットが含まれます。

  1. スーパーユーザーになります。

  2. 次のコマンドを入力します。


    # poolcfg -c discover
    

デフォルトのファイル名 /etc/pooladm.conf を使用する代わりに別のファイル名を指定することもできます。別のファイル名を指定すると、poolcfg コマンドは指定した別のファイルに対して実行されます。

たとえば、検出された構成を /tmp/foo ファイルに記録するには、次の手順に従います。

  1. スーパーユーザーになります。

  2. 次のコマンドを入力します。


    # poolcfg -c discover /tmp/foo
    

新しい構成を作成する方法

/usr/sbin/poolcfg コマンドの -c オプションの引数に create を指定して、tester というシステムに簡単な構成ファイルを作成します。-c オプションの引数に空白が含まれている場合は、引用符で囲んでください。

  1. スーパーユーザーになります。

  2. 次のコマンドを入力します。


    # poolcfg -c 'create system tester'
    
  3. 構成ファイルの内容を読みやすい形式で表示します。


    # poolcfg -c info
    system tester
            int system.version 1
            boolean system.bind-default true
            string system.comment

構成の変更方法

単純な構成を拡張するには、batch というプロセッサセットと batch というプールを作成して、両者を対応付けて結合します。-c オプションの引数に空白が含まれている場合は、引用符で囲んでください。

  1. スーパーユーザーになります。

  2. batch というプロセッサセットを作成します。


    # poolcfg -c 'create pset batch (uint pset.min = 2; uint pset.max = 10)'
    
  3. batch というプールを作成します。


    # poolcfg -c 'create pool batch'
    
  4. プロセッサセットとプールを対応付けて結合します。


    # poolcfg -c 'associate pool batch (pset batch)'
    
  5. 対応付けた後の構成を表示します。


    # 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 に対応付ける方法を示します。

  1. スーパーユーザーになります。

  2. batch プールを変更して、FSS に対応付けます。


    # poolcfg -c 'modify pool batch (string pool.scheduler="FSS")'
    
  3. 対応付けた後の構成を表示します。


    # 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 でコマンドファイルを使用する方法

poolcfg -f を使用すると、poolcfg コマンドの -c オプションに指定する引数をテキストファイルから入力できます。この手法は、一連の操作を 1 つずつ実行する場合に使用します。複数のコマンドを処理した場合でも、それらのコマンドがすべて正常に終了するまで、構成は更新されません。特に大規模な構成や複雑な構成の場合は、この手法を使用した方が、個々のサブコマンドを起動するよりも便利です。

  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)
    
  2. スーパーユーザーになります。

  3. 次のコマンドを入力します。


    # /usr/sbin/poolcfg -f poolcmds.txt
    

プール構成の起動と終了

pooladm(1M) を使用して、特定のプール構成を起動したり、実行中のプール構成を終了したりします。

プール構成を起動する方法

デフォルトの静的構成ファイル /etc/pooladm.conf 内の構成を起動するには、「commit configuration」を意味する -c オプションを指定して、pooladm を実行します。

  1. スーパーユーザーになります。

  2. 次のコマンドを入力します。


    # /usr/sbin/pooladm -c
    

プール構成を終了する方法

実行中の構成とプロセッサセットなどの関連するすべての資源を削除するには、「remove configuration」を意味する -x オプションを使用します。

  1. スーパーユーザーになります。

  2. 次のコマンドを入力します。


    # /usr/sbin/pooladm -x
    

pooladm コマンドの -x オプションを使用すると、独自の動的構成ファイルだけでなく、その動的構成ファイルに対応付けられているすべての資源構成も削除されます。つまり、-x オプションは、無効なプール構成から回復するためのメカニズムを提供します。すべてのプロセスは、マシン上のすべての資源を共有します。


注 -

1 つのプロセッサセット内でスケジューリングクラスを混在させると、予期できない結果が生じる可能性があります。pooladm -x を使って無効な構成から回復する場合は、priocntl(1) を使用して、実行中のプロセスを別のスケジューリングクラスに移動する必要があります。


プールへの結合

実行中のプロセスをプールに結合するには、次の 2 つの方法を使用できます。

プロセスをプールに結合する方法

次の手順では、プロセス (現在のシェルなど) を手動で ohare というプールに結合します。

  1. スーパーユーザーになります。

  2. 次のコマンドを入力します。


    # poolbind -p ohare $$
    

タスクまたはプロジェクトをプールに結合する方法

タスクまたはプロジェクトをプールに結合するには、poolbind コマンドに -i オプションを指定します。次の例では、airmiles プロジェクト内のすべてのプロセスを laguardia プールに結合します。

  1. スーパーユーザーになります。

  2. 次のコマンドを入力します。


    # poolbind -i project -p laguardia airmiles
    

project 属性を使って新しいプロセスをプールに結合する方法

プロジェクト内の新しいプロセスを自動的にプールに結合するには、project.pool 属性を project データベース内の各エントリに追加します。

たとえば、studiobackstage という 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 プールに結合されます。

project 属性を使ってプロセスを別のプールに結合する方法

上記の構成を使用することにより、ユーザー paul は自分が起動したプロセスに結合されているプールを変更できます。newtask を使用して、passes プロジェクトで起動されるプロセスを backstage プールにも結合できます。

  1. passes プロジェクトでプロジェクトを起動します。


    $ newtask -l -p passes
    
  2. プロジェクトに結合されているプールを検証します。


    $ poolbind -q $$
    process id 6384 : pool 'backstage'