この章の内容は次のとおりです。
管理者は、次の事柄を決定する上で SunOS のスワップ機構を理解しておく必要があります。
スワップ空間の要件
TMPFS ファイルシステムとの関係
スワップ空間に関連するエラーメッセージからの復元
Solaris ソフトウェアは、一時記憶域にファイルシステムではなくディスクスライスを使用します。これらのスライスを「スワップ」スライスと呼びます。 スワップスライスは、システムの物理メモリーが不足し現在のプロセスを処理することができないときに、仮想メモリー記憶域として使用されます。
仮想メモリーシステムは、ディスク上のファイルの物理コピーをメモリー内の仮想アドレスに対応付けます。これらのマッピングに関するデータが入った物理メモリーページは、ファイルシステム内の通常ファイルまたはスワップ空間から読み直されます。メモリーをバックアップしているディスク空間に割り当てられる ID はわからないため、スワップ空間から読み直されたメモリーは anonymous メモリーとして参照されます。
Solaris 環境には、「仮想スワップ空間」という概念が導入されています。これは、anonymous メモリーページとこれらのページを実際にバックアップする物理記憶域 (またはディスク上にとられたバックアップ用のスワップ空間) の間に位置する層です。システムの仮想スワップ空間は、すべての物理 (ディスク上にとられたバックアップ用のスワップ空間) スワップ空間と現在使用可能な物理メモリーの一部の合計に等しくなります。
仮想スワップ空間の長所は次のとおりです。
仮想スワップ空間が物理 (ディスク) 記憶域に対応していなくてもかまわないので、大きな物理スワップ空間を確保する必要がなくなる。
SWAPFS という疑似ファイルシステムが、anonymous メモリーページのアドレスを提供する。SWAPFS はメモリーページの割り当てを制御するので、ページに対する処理を柔軟に決定できる。たとえば、ディスク上にとられたバックアップ用のスワップ記憶域のページ要件を変更できる。
Solaris 環境では、TMPFS ファイルシステムは /etc/vfstab ファイル内のエントリによって自動的に稼働されます。TMPFS ファイルシステムは、ファイルとそれに関連付けられた情報をディスクではなくメモリー (/tmp ディレクトリ内) に格納するので、これらのファイルへのアクセスが高速になります。このため、コンパイラや DBMS 製品のように /tmp の使用量の大きいアプリケーションの場合は、パフォーマンスが大幅に改善されます。
TMPFS ファイルシステムは、システムのスワップ資源から /tmp ディレクトリ内の領域を割り当てます。つまり、/tmp 内の領域を使い果たすと、スワップ空間も使い果たしたことになります。したがって、アプリケーションの /tmp の使用量が大きい場合に、スワップ空間の使用状況を監視しなければ、システムがスワップ空間を使い果たす可能性があります。
TMPFS を使用したいがスワップ資源が限られている場合は、次の方法を使用してください。
サイズオプション (-o size) を指定して TMPFS ファイルシステムをマウントし、スワップ資源 TMPFS をどの程度使用できるかを制御する。
スワップ空間が足りなくなった場合は、コンパイラを TMPDIR
環境変数を使用して、より大きな実際のディレクトリを指すことができる。
コンパイラの TMPDIR
変数を使用すると、コンパイラが /tmp を使用するかどうかだけが制御される。他のプログラムによる /tmp の使用には影響しない。
この節では、スワップ空間を使い果たしたときに表示されるエラーメッセージについて説明します。
次のメッセージは、アプリケーションがさらに anonymous メモリーを取得しようとしたが、バックアップ用のスワップ空間が残っていなかったことを示します。
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) |
directory: File system full, swap space limit exceeded |
このメッセージは、ファイルに書き込むときにページを割り当てることができない場合に表示されます。このエラーは、TMPFS が許容限度を超えて書き込もうとしたときや、現在実行されているプログラムが大量のメモリーを使用している場合に発生することがあります。
directory: File system full, memory allocation failed |
このメッセージは、TMPFS が新しいファイルやディレクトリの作成中に物理メモリーを使い果たしたことを意味します。
TMPFS 関連のエラーメッセージから回復する方法については、TMPFS(7FS) のマニュアルページを参照してください。
最初に、スワップ空間は Solaris インストールプロセスの一部として割り当てられます。インストールプログラムによるディスクスライスの自動レイアウトを選択し、スワップファイルのサイズを手作業で変更しなければ、Solaris インストールプログラムは表 38-1 に示すようにデフォルトのスワップスライスを割り当てます。
表 38-1 デフォルトのスワップ空間割り当て
システム上の物理メモリー |
割り当てられるディレクトリのスワップ空間 |
---|---|
16 〜 63M バイト |
32M バイト |
64 〜 127M バイト |
64M バイト |
128 〜 511M バイト |
128M バイト |
512M バイトを超える場合 |
256M バイト |
スワップファイルを作成すると、スワップ空間をシステムに追加できます。スワップファイルを作成する方法については、「スワップ空間の追加」を参照してください。
システムをインストールすると、スワップスライスとファイルは /etc/vfstab ファイル内に列挙され、システムのブート時に /sbin/swapadd スクリプトによって起動されます。
/etc/vfstab ファイル内のスワップデバイスエントリには、次の情報が入っています。
スワップスライスまたはファイルの完全パス名
スワップのファイルシステムタイプ
スワップファイルが入っているファイルシステムは、スワップファイルが稼働される前にマウントしなければならないので、ファイルシステムをマウントするエントリがスワップファイルを起動するエントリより前に入っていることを、/etc/vfstab ファイル内で確認してください。
スワップ空間のサイズを決定する上で最も重要な要素は、システムのソフトウェアアプリケーションの要件です。たとえば、コンピュータ支援設計シミュレータ、データベース管理製品、トランザクションモニター、地質分析システムなどの大型アプリケーションは、200 〜 1000M バイトのスワップ空間を消費することがあります。
一般にデータファイルのサイズが 10 〜 20M バイトを超えるアプリケーションの場合は、スワップ空間の要件をアプリケーションベンダーに問い合わせてください。
アプリケーションベンダーからスワップ空間の要件を入手できない場合は、次のガイドラインに従ってスワップ空間を割り当ててください。
アプリケーションをサポートするために、次のように割り当てる。
xterm のような通常のアプリケーションごとに 1M バイト
カレンダやメールアプリケーションのような軽量アプリケーションごとに 2 〜 3M バイト
デスクトップパブリッシング (DTP) ソフトウェアのような大型アプリケーションには 20 〜 50M バイト
クラッシュダンプを節約するために、物理メモリー全体を割り当てて最悪の場合のクラッシュダンプを保存する。
システムまたはアプリケーションの要件がわからない場合は、システムの物理メモリーのうち 50% ないし 100% を割り当てる。たとえば、32M バイトの物理メモリーを持つシステムの場合は、16 〜 32M バイトのスワップ空間を割り当てる。これによって、仮想スワップ空間の合計は 48 〜 64M バイトになる。
大型アプリケーション (コンパイラなど) が /tmp ディレクトリを使用するかどうかを決定する。次に、/tmpfs に使用される追加のスワップ空間を割り当てる。TMPFS については、「スワップ空間と TMPFS ファイルシステム」を参照。
/usr/sbin/swap コマンドを使用してスワップ空間を管理します。2 つのオプション -l と -s を使用して、スワップ資源に関する情報を表示します。
swap -l コマンドを使用してシステムのスワップ空間を調べます。有効なスワップデバイスやファイルは、swapfile カラムの下に表示されます。
# swap -l swapfile dev swaplo blocks free /dev/dsk/c0t2d0s1 32,17 8 205624 192704 |
swap -s コマンドを使用してスワップ資源を監視します。
# swap -s total: 10492k bytes allocated + 7840k reserved = 18332k used, 21568k available |
used と available の数値の統計は、システム上の合計スワップ空間に等しくなります。これには、物理メモリーの一部とスワップデバイス (またはファイル) が含まれます。
使用可能なスワップ空間と使用済みスワップ空間の容量 (swap -s の出力内) を使用して、時間経過に伴うスワップ空間の使用状況を監視できます。システムパフォーマンスが適正であれば、swap -s を使用するとどの程度のスワップ空間が使用可能であるかがわかります。システムパフォーマンスが低下したときは、使用可能なスワップ空間の容量をチェックして減少していないかどうかを調べてください。これによって、システムに対するどのような変更が原因でスワップ空間の使用量が増大したかを識別できます。
このコマンドを使用するときには、カーネルとユーザープロセスが物理メモリーをロックして解除するたびに、スワップに使用できる物理メモリーの容量が動的に変化するので注意してください。
swap -l コマンドではスワップ空間が 512 バイトのブロック数として表示され、 swap -s コマンドでは 1024 バイトのブロック数として表示されます。 swap -l の場合はスワップ空間の計算に物理メモリーが含まれないので、 swap -l で表示されたブロック数を合計して K バイト数に換算すると、 (swap -s で出力される) used と available の値の合計よりも少なくなります。
表 38-2 に、swap -s コマンドの出力とその説明を示します。
表 38-2 swap -s コマンドの出力
キーワード |
説明 |
---|---|
bytes allocated |
現在バックアップ用の記憶域 (ディスク上にとられたバックアップ用のスワップ空間) として使用可能なスワップ空間の合計容量を表す 1024 バイトのブロック数 |
reserved |
現在は割り当てられていないが、後から使用できるようにメモリーによって回収されるスワップ空間の合計容量を表す 1024 バイトのブロック数 |
used |
割り当て済みまたは予約済みのスワップ空間の合計容量を表す 1024 バイトのブロック数 |
available |
後から予約や割り当てに使用可能なスワップ空間の合計容量を表す 1024 バイトのブロック数 |
システム構成を変更して新しいソフトウェアパッケージをインストールした後に、スワップ空間を追加しなければならないことがあります。その場合に望ましいのは、mkfile コマンドと swap コマンドを使用して、既存の UFS または NFS ファイルシステムの一部を補助スワップ空間として指定する方法です。次に説明するように、これらのコマンドを使用すると、ディスクをパーティションに分割し直さなくても、スワップ空間を追加できます。
スワップ空間を追加するもう 1 つの方法は、既存のディスクをパーティションに分割し直すか、別のディスクを追加することです。その方法については、第 28 章「ディスクの管理 (概要)」で使用中のシステムに該当する説明を参照してください。
次の手順でスワップファイルを作成します。
mkfile コマンドを使用してスワップファイルを作成する。
swap コマンドを使用してスワップファイルを有効にする。
システムのブート時に自動的に有効になるように、スワップファイルのエントリを /etc/vfstab ファイルに追加する。
mkfile コマンドは、NFS のマウント済みスワップ空間またはローカルスワップ空間に使用できるファイルを作成します。スティッキビットが設定され、ファイルは 0 が埋め込まれます。スワップファイルのサイズは、バイト数 (デフォルト) として指定するか、接尾辞 k、b、m を使用して、それぞれ K バイト数、ブロック数、M バイト数として指定できます。
表 38-3 に、mkfile コマンドのオプションを示します。
表 38-3 mkfile コマンドのオプション
オプション |
説明 |
---|---|
-n |
空のファイルを作成する。サイズは表示されるが、データが書き込まれるまでディスクブロックは割り当てられない。 |
-v |
詳細モード。作成されたファイル名とサイズが表示される。 |
-n オプションは、NFS スワップファイルの作成時のみ使用してください。
スーパーユーザーになります。
root の権限がなくてもスワップファイルを作成できますが、スワップファイルが誤って上書きされないように、root を所有者にしておくとよいでしょう。
# mkfile nnn[k|b|m] filename |
サイズ「nnn」(K バイト数、バイト数、M バイト数) の指定したファイル名のスワップファイルが作成されます。
スワップファイルを有効にします。
# /usr/sbin/swap -a /path/filename |
絶対パス名を使用してスワップファイルを指定しなければなりません。スワップファイルが追加され、ファイルシステムがマウント解除されるか、またはシステムがリブートされるまで使用可能になります。 プロセスまたはプログラムがスワップファイルにスワップしているときは、ファイルシステムのマウントを解除できないことに注意してください。
ファイルの完全パス名を指定し、ファイルシステムのタイプとして swap を指定して、スワップファイルのエントリを /etc/vfstab ファイルに追加します。
/path/filename - - swap - no -
スワップファイルが追加されたことを確認するには、次のように入力します。
/usr/sbin/swap -l |
次の例では、/files/swapfiles という 24M バイトのスワップファイルを作成します。
# mkfile 24m /files/swapfile # swap -a /files/swapfile # vi /etc/vfstab (エントリがスワップファイル用に追加される) /files/swapfile - - swap - no - # swap -l swapfile dev swaplo blocks free /dev/dsk/c0t2d0s1 32,17 8 205624 192704 /files/swapfile - 8 40952 40952 |
スーパーユーザーになります。
次のように swap -d コマンドを使用してスワップ空間を削除します。
# /usr/sbin/swap -d /path/filename |
スワップファイル名がリストから削除されるので、スワッピングに使用できなくなります。ファイルそのものは削除されません。
/etc/vfstab ファイルを編集して、スワップファイルのエントリを削除します。
他の目的に使用できるようにディスク領域を復元します。
# rm swap-filename |
スワップ空間がファイルの場合は削除します。また、スワップ空間が別のスライスに入っていて、不要なことがわかっている場合は、新しいファイルシステムを作成してマウントします。
ファイルシステムをマウントするについての詳細は、第 36 章「ファイルシステムのマウントとマウント解除 (手順)」を参照してください。
次の例は、/files/swapfile スワップファイルを削除します。
# swap -d /files/swapfile # (削除されたスワップエントリを /etc/vfstab ファイルから削除する) # rm /files/swapfile # swap -l swapfile dev swaplo blocks free /dev/dsk/c0t2d0s1 32,17 8 205624 192720 |