Solaris のシステム管理 (デバイスとファイルシステム)

第 20 章 追加スワップ空間の構成 (手順)

この章では、Oracle Solaris OS をインストールしたあとで追加のスワップ空間を構成するためのガイドラインと手順について説明します。

この章で説明する手順は次のとおりです。

この章の内容は以下のとおりです。

スワップ空間について

ユーザーは、次の事柄を決定する上で SunOS のスワップ機構を理解しておく必要があります。

スワップ空間と仮想メモリー

Solaris ソフトウェアは、いくつかのディスクスライスを、ファイルシステムとしてではなく一時記憶域として使用します。これらのスライスを「スワップ」スライスと呼びます。スワップスライスは、システムの物理メモリーが不足し現在のプロセスを処理することができないときに、仮想メモリー記憶域として使用されます。

仮想メモリーシステムは、ディスク上のファイルの物理コピーをメモリー内の仮想アドレスに対応付けます。これらのマッピングに関するデータが入った物理メモリーページは、ファイルシステム内の通常ファイルまたはスワップ空間から読み直されます。メモリーをバックアップしているディスク空間に割り当てられる ID はわからないため、スワップ空間から読み直されたメモリーは「匿名メモリー」と呼ばれます。

Oracle Solaris OS には、「仮想スワップ空間」という概念が導入されています。これは、匿名メモリーページとこれらのページを実際にバックアップする物理記憶域 (またはディスク上にとられたバックアップ用のスワップ空間) の間に位置する層です。システムの仮想スワップ空間は、すべての物理 (ディスク上にとられたバックアップ用のスワップ空間) スワップ空間と現在使用可能な物理メモリーの一部の合計に等しくなります。

仮想スワップ空間の長所は次のとおりです。

スワップ空間と TMPFS ファイルシステム

Solaris 環境では、TMPFS ファイルシステムは /etc/vfstab ファイル内のエントリによって自動的に稼働されます。TMPFS ファイルシステムは、ファイルとそれに関連付けられた情報をディスクではなくメモリー (/tmp ディレクトリ) に格納するので、これらのファイルへのアクセスが高速になります。この機能によって、コンパイラや DBMS 製品のように /tmp の使用量の大きいアプリケーションの場合は、パフォーマンスが大幅に改善されます。

TMPFS ファイルシステムは、システムのスワップリソースから /tmp ディレクトリ内の領域を割り当てます。つまり、/tmp ディレクトリ内の領域を使い果たすと、スワップ空間も使い果たしたことになります。したがって、/tmp ディレクトリの使用量が大きいアプリケーションの場合は、スワップ空間の使用状況を監視しなければ、システムがスワップ空間を使い果たす可能性があります。

スワップリソースが限られているときに TMPFS を使用する場合は、次の方法を使用してください。

ダンプデバイスとしてのスワップ空間

通常、ダンプデバイスとは、システムクラッシュダンプ情報を格納するために予約されているディスク領域のことです。デフォルトでは、UFS ルート環境内のスワップスライスがシステムのダンプデバイスとして構成されます。可能であれば、スワップパーティションを使用する代わりに、代替パーティションを「専用ダンプデバイス」として設定してください。クラッシュダンプの信頼性を高めたり、システム障害が発生したあとのリブート時間を短縮したりできます。専用ダンプデバイスの構成は、dumpadm コマンドで行えます。詳細は、『Solaris のシステム管理 (上級編)』の第 17 章「システムクラッシュ情報の管理 (手順)」を参照してください。

ZFS ルート環境では、スワップとダンプは別々の ZFS ボリュームとして構成されます。このモデルの利点は次のとおりです。

ZFS スワップおよびダンプデバイスの使用方法の詳細については、『Oracle Solaris ZFS 管理ガイド』「スワップデバイスおよびダンプデバイスの ZFS サポート」を参照してください。

Solaris ボリュームマネージャーなどのボリュームマネージャーを使用して UFS 環境内のディスクを管理している場合は、専用ダンプデバイスを Solaris ボリュームマネージャーの管理下に置かないように設定してください。スワップ領域は、Solaris ボリュームマネージャーの管理下に保管することをお勧めします。ただし、使いやすさとパフォーマンスの理由から、Solaris ボリュームマネージャーの管理下で動作しないディスクを専用ダンプデバイスとして設定してください。

スワップ空間と動的再構成

動的再構成時に CPU やシステムボードで障害が発生した場合に対応できるよう、十分なスワップ空間を確保することをお勧めします。スワップ空間が不足していると、CPU やシステムボードで障害が発生した際に、ホストまたはドメインはより少ないメモリーでリブートしなければなりません。

この追加スワップ空間を使用できない場合、メモリー不足のためアプリケーションの起動に失敗する可能性があります。この問題が発生した場合は、ユーザーが介入して、スワップ空間を追加するか、起動に失敗したアプリケーションのメモリー使用の設定を変更する必要があります。

リブート時のメモリー破損に備えて十分な追加スワップ空間が確保されていた場合、メモリーを大量に消費するアプリケーションのすべてが、通常どおりに起動します。したがって、スワップの多発によりシステムの動作は多少遅くなるにしても、ユーザーは通常どおりにシステムを利用できます。

詳細は、使用するハードウェアの動的構成マニュアルを参照してください。

SAN 環境でのスワップ空間の構成

SAN 環境などで、ネットワークで接続されたディスクにスワップ空間を構成するかどうかを判断するには、次の点を確認してください。

スワップ空間の追加が必要かどうかを調べる方法

スワップ空間の追加が必要かどうかを調べるには、swap -l コマンドを使用します。

たとえば、次の swap -l コマンドの出力は、このシステムのスワップ空間がほぼ完全に使い果たされたか、割り当て率が 100% に達していることを示しています。


% swap -l
swapfile             dev   swaplo blocks   free
/dev/dsk/c0t0d0s1   136,1      16 1638608    88

システムのスワップ空間の割り当て率が 100% に達すると、アプリケーションのメモリーページが一時的にロックしてしまいます。アプリケーションエラーが発生しない場合でも、システムパフォーマンスが低下する可能性があります。

システムにスワップ空間を追加する方法については、「UFS ルート環境でスワップファイルを作成して使用可能にする方法」を参照してください。

スワップ関連のエラーメッセージ

次のメッセージは、アプリケーションに匿名メモリーを追加する必要がある場合に表示されます。ただし、バックアップ用のスワップ空間はもう余っていません。


application is out of memory
 
malloc error O
 
messages.1:Sep 21 20:52:11 mars genunix: [ID 470503 kern.warning] 
WARNING: Sorry, no swap space to grow stack for pid 100295 (myprog)

TMPFS 関連のエラーメッセージ

次のメッセージは、ファイルに書き込むときにページを割り当てることができない場合に表示されます。この問題は、TMPFS が許容限度を超えて書き込もうとしたときや、現在実行されているプログラムが大量のメモリーを使用している場合に発生することがあります。


directory: File system full, swap space limit exceeded

次のメッセージは、TMPFS が新しいファイルやディレクトリの作成中に物理メモリーを使い果たしたことを意味します。


directory: File system full, memory allocation failed

TMPFS 関連のエラーメッセージから回復する方法については、tmpfs(7FS) のマニュアルページを参照してください。

スワップ空間の割り当て方法

最初に、スワップ空間は Solaris インストールプロセスの一部として割り当てられます。インストールプログラムによるディスクスライスの自動レイアウトを選択し、かつスワップスライスのサイズを手作業で変更しない場合、Solaris インストールプログラムは UFS ルート環境にデフォルトのスワップ領域 (512M バイト) を割り当てます。ZFS ルート環境では、デフォルトのスワップサイズは通常 512M バイトから 2G バイトの範囲です。

スワップ空間の割り当て方法については、「スワップ空間の計画」を参照してください。

UFS ルート環境にスワップファイルを作成することで、システムに追加のスワップ空間を割り当てることができます。スワップファイルは ZFS ルート環境ではサポートされていません。スワップファイルの作成方法については、「スワップ空間の追加」を参照してください。

スワップ空間と /etc/vfstab ファイル

システムのインストールが完了すると、/etc/vfstab ファイルにスワップスライスとスワップファイルが一覧表示されます。スワップスライスとスワップファイルは、システムのブート時に /sbin/swapadd スクリプトによって有効になります。

/etc/vfstab ファイル内のスワップデバイスエントリには、次の情報が入っています。

スワップファイルが入っているファイルシステムは、スワップファイルが有効になる前にマウントしておかなければなりません。このため、/etc/vfstab ファイル内で、ファイルシステムをマウントするエントリが、スワップファイルを有効にするエントリより前に入っていることを確認してください。

スワップ空間の計画

スワップ空間のサイズを決定する上でもっとも重要な要素は、システムのソフトウェアアプリケーションの要件です。たとえば、コンピュータ支援設計シミュレータ、データベース管理製品、トランザクションモニター、地質分析システムなどの大型アプリケーションは、200 - 1000M バイトのスワップ空間を消費することがあります。

アプリケーションのスワップ空間の要件については、アプリケーションベンダーに問い合わせてください。

アプリケーションベンダーに問い合わせてもスワップ空間の要件を判断できない場合は、次のシステムタイプ別のガイドラインに従ってスワップ空間を割り当ててください。

システムタイプ 

スワップ空間のサイズ 

専用ダンプデバイスのサイズ 

約 4G バイトの物理メモリーを備えたシステム 

1G バイト 

1G バイト 

約 8G バイトの物理メモリーを備えた中型のサーバー 

2G バイト 

2G バイト 

約 16 - 128G バイトの物理メモリーを備えたハイエンドサーバー 

4G バイト 

4G バイト 

128G バイトを超える物理メモリーを備えたハイエンドサーバー 

物理メモリーサイズの 1/4 

物理メモリーサイズの 1/4 


注 –

クラッシュダンプの内容は圧縮されるため、ダンプデバイスを物理メモリーと同じサイズにする必要はありません。デフォルトでは、ダンプ内容の値はカーネルページに設定されます。ただし、すべてのメモリーページをダンプするようにダンプ内容の値が設定されている場合は、ダンプサイズを物理メモリーの半分以上に増やすことを検討してください。


UFS ベースのシステムでのスワップ空間の割り当て

上記の一般的なガイドラインのほかに、次の場合に UFS ベースのシステムにスワップ空間やディスク領域を割り当てることを検討してください。

ZFS ベースのシステムでのスワップ空間の割り当て

ZFS ルートファイルシステムの初期インストール、または UFS ファイルシステムから ZFS ルートファイルシステムへの Solaris Live Upgrade の実行時に、スワップ領域が ZFS ルートプール内の ZFS ボリュームに、通常は 512M バイトから 2G バイトの範囲で自動的に作成されます。Solaris Live Upgrade を使用して UFS から ZFS に移行する場合は、既存のスワップ領域のサイズに基づいてスワップボリュームが作成されます。

ZFS ルートプールでは、スワップデバイスが固定サイズのスライスに事前に割り当てられることはないため、あとでスワップサイズを変更するのは非常に簡単です。

アプリケーションのスワップ要件を評価してから、初期インストール時またはインストール後に必要に応じて、デフォルトのスワップサイズを使用することも、スワップボリュームのサイズを調整することもできます。

初期インストール時のデフォルトのダンプボリュームサイズは、dumpadm の情報と物理メモリーのサイズに基づいて、カーネルにより計算されます。Live Upgrade を実行して UFS ルートファイルシステムから ZFS ルートファイルシステムに移行する際、デフォルトのダンプボリュームサイズが ZFS BE の物理メモリーの半分のサイズ (512M バイトから 2G バイト) に設定されます。

ZFS 環境では、ファイルシステムはプールの領域を消費するため、/var/crash ディレクトリは、保存するクラッシュダンプの数に応じて必要な容量を消費します。

スワップリソースの監視

/usr/sbin/swap コマンドを使用してスワップ領域を管理します。2 つのオプション -l-s は、スワップリソースに関する情報を表示します。

swap -l コマンドを使用すると、システムのスワップ領域を確認できます。有効になっているスワップデバイスやファイルは、swapfile カラムの下に表示されます。次に例を示します。


# swap -l
swapfile             dev  swaplo blocks   free
/dev/dsk/c0t0d0s1   136,1      16 1638608 1600528

ZFS ルートファイルシステムを備えるシステムでは、swap - l コマンドにより、ZFS ボリュームパス名が出力されることを除いて、類似の出力が得られます。次に例を示します。


# swap -l
swapfile                  dev  swaplo blocks   free
/dev/zvol/dsk/rpool/swap 256,1      16 1058800 1058800

swap -s コマンドを使用すると、スワップリソースを監視できます。


# swap -s
total: 57416k bytes allocated + 10480k reserved = 67896k used, 
833128k available

used 値と available 値の合計は、システム上の合計スワップ空間に等しくなります。これには、物理メモリーの一部とスワップデバイス (またはファイル) が含まれます。

使用可能なスワップ空間と使用済みスワップ空間の容量 (swap -s の出力内) を使用して、時間経過に伴うスワップ空間の使用状況を監視できます。システムパフォーマンスが適正であれば、swap -s を使用するとどの程度のスワップ空間が使用可能であるかがわかります。システムパフォーマンスが低下したときは、使用可能なスワップ空間の容量を検査して減少していないかどうかを調べてください。これによって、システムに対するどのような変更が原因でスワップ空間の使用量が増大したかを識別できます。

このコマンドを使用するときには、カーネルとユーザープロセスが物理メモリーをロックして解除するたびに、スワップに使用できる物理メモリーの容量が動的に変化するので注意してください。


注 –

swap -l コマンドでは、スワップ空間が 512 バイトのブロック数として表示されます。swap -s コマンドでは、スワップ空間が 1024 バイトのブロック数として表示されます。swap -l で表示されたブロック数を合計して K バイトに変換すると、結果は「used + available」(swap -s の出力) より小さくなります。これは、swap -l では、スワップ空間の計算に物理メモリーが算入されないからです。


次の表に、swap -s コマンドの出力とその説明を示します。

表 20–1 swap -s コマンドの出力

キーワード 

説明 

bytes allocated

現在バックアップ用の記憶域 (ディスク上にとられたバックアップ用のスワップ空間) として使用可能なスワップ空間の合計容量を表す 1024 バイトのブロック数。 

reserved

現在は割り当てられていないが、あとから使用できるようにメモリーによって回収されるスワップ空間の合計容量を表す 1024 バイトのブロック数。 

used

割り当て済みまたは予約済みのスワップ空間の合計容量を表す 1024 バイトのブロック数。 

available

あとから予約や割り当てに使用可能なスワップ空間の合計容量を表す 1024 バイトのブロック数。 

スワップ空間の追加

システム構成を変更して新しいソフトウェアパッケージをインストールした後に、スワップ空間を追加しなければならないことがあります。その場合に望ましいのは、mkfile コマンドと swap コマンドを使用して、既存の UFS または NFS ファイルシステムの一部を補助スワップ空間として指定する方法です。次の節で説明するように、これらのコマンドを使用すると、ディスクをパーティションに分割し直さなくても、スワップ空間を追加できます。

スワップ空間を追加するもう 1 つの方法は、既存のディスクをパーティションに分割し直すか、別のディスクを追加することです。ディスクのパーティション分割をやり直す方法については、第 10 章ディスクの管理 (概要)を参照してください。

UFS ルート環境でのスワップファイルの作成

UFS ルートファイルシステムで使用されるスワップファイルを作成できます。スワップファイルは ZFS ルート環境では現在サポートされていません。次の手順でスワップファイルを作成します。

mkfile コマンド

mkfile コマンドは、NFS のマウント済みスワップ空間またはローカルスワップ空間に使用できるファイルを作成します。スティッキビットが設定され、ファイルに 0 が埋め込まれます。スワップファイルのサイズは、バイト数 (デフォルト) として指定するか、接尾辞 kbm を使用して、それぞれ K バイト数、ブロック数、M バイト数として指定できます。

次の表に、mkfile コマンドのオプションを示します。

表 20–2 mkfile コマンドのオプション

オプション 

説明 

-n

空のファイルを作成します。サイズが表示されます。ただし、データが書き込まれるまでディスクブロックは割り当てられません。 

-v

作成されたファイル名とサイズが表示されます。 


注 –

-n オプションは、NFS スワップファイルの作成時のみ使用してください。


ProcedureUFS ルート環境でスワップファイルを作成して使用可能にする方法

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

    root の権限がなくてもスワップファイルを作成できます。しかし、スワップファイルが誤って上書きされないように、root を所有者にしておくとよいでしょう。

  2. 必要に応じて、スワップファイル用のディレクトリを作成します。

  3. スワップファイルを作成します。


    # mkfile nnn[k|b|m] filename
    

    指定したサイズ nnn (K バイト、バイト、または M バイト) とファイル名でスワップファイルが作成されます。

  4. スワップファイルを有効にします。


    # /usr/sbin/swap -a /path/filename
    

    絶対パス名を使用してスワップファイルを指定しなければなりません。スワップファイルが追加され、ファイルシステムがマウント解除されるか、またはシステムがリブートされるまで使用可能になります。プロセスまたはプログラムがスワップファイルにスワップしているときは、ファイルシステムのマウントを解除できないことに注意してください。

  5. ファイルのフルパス名を指定し、ファイルシステムのタイプとして swap を指定して、スワップファイルのエントリを /etc/vfstab ファイルに追加します。


    /path/filename   -      -       swap     -     no     -
  6. スワップファイルが追加されたことを確認するには、次のように入力します。


    $ /usr/sbin/swap -l
    

    注 –

    スワップファイルがアクティブにならない場合は、次のサービスが稼働していることを確認してください。


    # svcs nfs/client
    STATE          STIME    FMRI
    enabled        14:14:34 svc:/network/nfs/client:default 


例 20–1 UFS ルート環境でスワップファイルを作成して使用可能にする

次の例は、/files/swapfile という 100M バイトのスワップファイルを作成する方法を示しています。


# mkdir /files
# mkfile 100m /files/swapfile
# swap -a /files/swapfile
# vi /etc/vfstab
(An entry is added for the swap file):
/files/swapfile   -      -       swap     -     no     -
# swap -l
swapfile             dev  swaplo blocks   free
/dev/dsk/c0t0d0s1   136,1      16 1638608 1600528
/files/swapfile        -       16 204784  204784

Oracle Solaris ZFS ルート環境でのスワップ空間の追加または変更

次の節では、ZFS ルート環境でスワップ空間を追加または変更する方法を説明します。システムまたはアプリケーションで追加のスワップ空間が必要かどうかを確認する方法については、前述の節を参照してください。

ProcedureOracle Solaris ZFS ルート環境でスワップ空間を追加する方法

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

  2. 現在のスワップボリュームを確認します。

    使用中のスワップボリュームは削除できません。現在のスワップボリュームが使用中かどうかは、blocks 列に示されるブロックと free 列に示されるブロックを比較して確認できます。2 つの列のブロックが等しい場合、スワップ領域は使用中ではありません。次に例を示します。


    # swap -l
    swapfile                 dev  swaplo   blocks   free
    /dev/zvol/dsk/rpool/swap 256,1      16 1058800 1058800
  3. 次のいずれかを選択して、スワップボリュームのサイズを変更します。

    1. 現在のスワップ領域が使用中でない場合、現在のスワップボリュームのサイズを変更できます。

      次に例を示します。


      # zfs get volsize rpool/swap
      NAME        PROPERTY  VALUE    SOURCE
      rpool/swap  volsize   517M     -
      # zfs set volsize=2g rpool/swap
      # zfs get volsize rpool/swap
      NAME        PROPERTY  VALUE    SOURCE
      rpool/swap  volsize   2G       -
    2. 現在のスワップ領域が使用中の場合は、別のスワップボリュームを追加できます。

      次に例を示します。


      # zfs create -V 2G rpool/swap2
      
    3. 2 番目のスワップボリュームを有効にします。

      次に例を示します。


      # swap -a /dev/zvol/dsk/rpool/swap2
      # swap -l
      swapfile                  dev  swaplo   blocks   free
      /dev/zvol/dsk/rpool/swap  256,1      16 1058800 1058800
      /dev/zvol/dsk/rpool/swap2 256,3      16 4194288 4194288

スワップファイルの削除

不要になったスワップ空間は、削除できます。

Procedure不要になったスワップ空間を削除する方法

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

  2. スワップ空間を削除します。


    # /usr/sbin/swap -d /path/filename
    

    スワップファイル名が削除されるので、スワッピングに使用できなくなります。ファイルそのものは削除されません。

  3. /etc/vfstab ファイルを編集して、スワップファイルのエントリを削除します。

  4. ほかの目的に使用できるようにディスク領域を復元します。


    # rm /path/filename
    

    スワップ空間がファイルの場合は削除します。また、スワップ空間が別のスライスに入っていて、不要なことがわかっている場合は、新しいファイルシステムを作成してマウントします。

    ファイルシステムのマウント方法については、第 18 章ファイルシステムのマウントとマウント解除 (手順)を参照してください。

  5. 削除したスワップファイルが使用できなくなっていることを確認します。


    # swap -l
    

例 20–2 不要になったスワップ空間を削除する

次の例は、/files/swapfile スワップファイルを削除する方法を示しています。


# swap -d /files/swapfile
# (Remove the swap entry from the /etc/vfstab file)
# rm /files/swapfile
# swap -l
swapfile             dev  swaplo  blocks   free
/dev/dsk/c0t0d0s1   136,1      16 1638608 1600528