この章では、Oracle Solaris OS をインストールしたあとで追加のスワップ空間を構成するためのガイドラインと手順について説明します。
この章で説明する手順は次のとおりです。
この章の内容は以下のとおりです。
ユーザーは、次の事柄を決定する上で SunOS のスワップ機構を理解しておく必要があります。
スワップ空間の要件
スワップ空間と TMPFS ファイルシステムとの関係
スワップ空間に関連するエラーメッセージから回復する方法
Solaris ソフトウェアは、いくつかのディスクスライスを、ファイルシステムとしてではなく一時記憶域として使用します。これらのスライスを「スワップ」スライスと呼びます。スワップスライスは、システムの物理メモリーが不足し現在のプロセスを処理することができないときに、仮想メモリー記憶域として使用されます。
仮想メモリーシステムは、ディスク上のファイルの物理コピーをメモリー内の仮想アドレスに対応付けます。これらのマッピングに関するデータが入った物理メモリーページは、ファイルシステム内の通常ファイルまたはスワップ空間から読み直されます。メモリーをバックアップしているディスク空間に割り当てられる ID はわからないため、スワップ空間から読み直されたメモリーは「匿名メモリー」と呼ばれます。
Oracle Solaris OS には、「仮想スワップ空間」という概念が導入されています。これは、匿名メモリーページとこれらのページを実際にバックアップする物理記憶域 (またはディスク上にとられたバックアップ用のスワップ空間) の間に位置する層です。システムの仮想スワップ空間は、すべての物理 (ディスク上にとられたバックアップ用のスワップ空間) スワップ空間と現在使用可能な物理メモリーの一部の合計に等しくなります。
仮想スワップ空間の長所は次のとおりです。
仮想スワップ空間が物理 (ディスク) 記憶域に対応していなくてもかまわないので、大きな物理スワップ空間を確保する必要がなくなります。
SWAPFS という疑似ファイルシステムが、匿名メモリーページのアドレスを提供します。SWAPFS はメモリーページの割り当てを制御するので、ページに対する処理を柔軟に決定できます。たとえば、ディスク上にとられたバックアップ用のスワップ記憶域のページ要件を変更できます。
Solaris 環境では、TMPFS ファイルシステムは /etc/vfstab ファイル内のエントリによって自動的に稼働されます。TMPFS ファイルシステムは、ファイルとそれに関連付けられた情報をディスクではなくメモリー (/tmp ディレクトリ) に格納するので、これらのファイルへのアクセスが高速になります。この機能によって、コンパイラや DBMS 製品のように /tmp の使用量の大きいアプリケーションの場合は、パフォーマンスが大幅に改善されます。
TMPFS ファイルシステムは、システムのスワップリソースから /tmp ディレクトリ内の領域を割り当てます。つまり、/tmp ディレクトリ内の領域を使い果たすと、スワップ空間も使い果たしたことになります。したがって、/tmp ディレクトリの使用量が大きいアプリケーションの場合は、スワップ空間の使用状況を監視しなければ、システムがスワップ空間を使い果たす可能性があります。
スワップリソースが限られているときに TMPFS を使用する場合は、次の方法を使用してください。
サイズオプション (-o size) を指定して TMPFS ファイルシステムをマウントし、TMPFS が使用できるスワップリソースを制御します。
より大きな別のディレクトリをポイントするように、コンパイラの TMPDIR 環境変数の設定を変更します。
コンパイラの TMPDIR 変数を使用すると、コンパイラが /tmp ディレクトリを使用するかどうかだけが制御されます。この変数は、ほかのプログラムによる /tmp ディレクトリの使用には影響しません。
通常、ダンプデバイスとは、システムクラッシュダンプ情報を格納するために予約されているディスク領域のことです。デフォルトでは、UFS ルート環境内のスワップスライスがシステムのダンプデバイスとして構成されます。可能であれば、スワップパーティションを使用する代わりに、代替パーティションを「専用ダンプデバイス」として設定してください。クラッシュダンプの信頼性を高めたり、システム障害が発生したあとのリブート時間を短縮したりできます。専用ダンプデバイスの構成は、dumpadm コマンドで行えます。詳細は、『Solaris のシステム管理 (上級編)』の第 17 章「システムクラッシュ情報の管理 (手順)」を参照してください。
ZFS ルート環境では、スワップとダンプは別々の ZFS ボリュームとして構成されます。このモデルの利点は次のとおりです。
スワップ領域とダンプ領域を含めるためにディスクをパーティションに分割する必要がない。
スワップおよびダンプデバイスが背後の ZFS 入出力パイプラインアーキテクチャーを利用できる。
スワップおよびダンプデバイス上で圧縮などの特性を設定できる。
スワップおよびダンプデバイスのサイズをリセットできる。次に例を示します。
# zfs set volsize=2G rpool/dump # zfs get volsize rpool/dump NAME PROPERTY VALUE SOURCE rpool/dump volsize 2G - |
大規模ダンプデバイスを割り当てる処理には時間がかかることに注意してください。
アクティブなシステムに 2 番目のスワップボリュームを追加して、全体のスワップサイズを増やすことを考慮できる。
ZFS スワップおよびダンプデバイスの使用方法の詳細については、『Oracle Solaris ZFS 管理ガイド』の「スワップデバイスおよびダンプデバイスの ZFS サポート」を参照してください。
Solaris ボリュームマネージャーなどのボリュームマネージャーを使用して UFS 環境内のディスクを管理している場合は、専用ダンプデバイスを Solaris ボリュームマネージャーの管理下に置かないように設定してください。スワップ領域は、Solaris ボリュームマネージャーの管理下に保管することをお勧めします。ただし、使いやすさとパフォーマンスの理由から、Solaris ボリュームマネージャーの管理下で動作しないディスクを専用ダンプデバイスとして設定してください。
動的再構成時に CPU やシステムボードで障害が発生した場合に対応できるよう、十分なスワップ空間を確保することをお勧めします。スワップ空間が不足していると、CPU やシステムボードで障害が発生した際に、ホストまたはドメインはより少ないメモリーでリブートしなければなりません。
この追加スワップ空間を使用できない場合、メモリー不足のためアプリケーションの起動に失敗する可能性があります。この問題が発生した場合は、ユーザーが介入して、スワップ空間を追加するか、起動に失敗したアプリケーションのメモリー使用の設定を変更する必要があります。
リブート時のメモリー破損に備えて十分な追加スワップ空間が確保されていた場合、メモリーを大量に消費するアプリケーションのすべてが、通常どおりに起動します。したがって、スワップの多発によりシステムの動作は多少遅くなるにしても、ユーザーは通常どおりにシステムを利用できます。
詳細は、使用するハードウェアの動的構成マニュアルを参照してください。
SAN 環境などで、ネットワークで接続されたディスクにスワップ空間を構成するかどうかを判断するには、次の点を確認してください。
ローカルに接続されたディスクのスワップ空間の問題を診断する方が、ネットワークで接続されたディスクのスワップ空間の問題を診断するより簡単です。
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 が許容限度を超えて書き込もうとしたときや、現在実行されているプログラムが大量のメモリーを使用している場合に発生することがあります。
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 ファイルにスワップスライスとスワップファイルが一覧表示されます。スワップスライスとスワップファイルは、システムのブート時に /sbin/swapadd スクリプトによって有効になります。
/etc/vfstab ファイル内のスワップデバイスエントリには、次の情報が入っています。
UFS ルートファイルシステムを備えるシステム上のスワップスライスまたはスワップファイルのフルパス名、あるいは ZFS ルートファイルシステムを備えるシステム上のスワップボリュームのパス名
スワップスライスまたはスワップファイルのファイルシステムタイプ
スワップファイルが入っているファイルシステムは、スワップファイルが有効になる前にマウントしておかなければなりません。このため、/etc/vfstab ファイル内で、ファイルシステムをマウントするエントリが、スワップファイルを有効にするエントリより前に入っていることを確認してください。
スワップ空間のサイズを決定する上でもっとも重要な要素は、システムのソフトウェアアプリケーションの要件です。たとえば、コンピュータ支援設計シミュレータ、データベース管理製品、トランザクションモニター、地質分析システムなどの大型アプリケーションは、200 - 1000M バイトのスワップ空間を消費することがあります。
アプリケーションのスワップ空間の要件については、アプリケーションベンダーに問い合わせてください。
アプリケーションベンダーに問い合わせてもスワップ空間の要件を判断できない場合は、次のシステムタイプ別のガイドラインに従ってスワップ空間を割り当ててください。
システムタイプ |
スワップ空間のサイズ |
専用ダンプデバイスのサイズ |
---|---|---|
約 4G バイトの物理メモリーを備えたシステム |
1G バイト |
1G バイト |
約 8G バイトの物理メモリーを備えた中型のサーバー |
2G バイト |
2G バイト |
約 16 - 128G バイトの物理メモリーを備えたハイエンドサーバー |
4G バイト |
4G バイト |
128G バイトを超える物理メモリーを備えたハイエンドサーバー |
物理メモリーサイズの 1/4 |
物理メモリーサイズの 1/4 |
クラッシュダンプの内容は圧縮されるため、ダンプデバイスを物理メモリーと同じサイズにする必要はありません。デフォルトでは、ダンプ内容の値はカーネルページに設定されます。ただし、すべてのメモリーページをダンプするようにダンプ内容の値が設定されている場合は、ダンプサイズを物理メモリーの半分以上に増やすことを検討してください。
上記の一般的なガイドラインのほかに、次の場合に UFS ベースのシステムにスワップ空間やディスク領域を割り当てることを検討してください。
専用ダンプデバイス。
/var/crash ディレクトリ。デフォルトのシステムクラッシュダンプの内容は、カーネルメモリーページのみであり、ダンプは圧縮後に書き込まれます。複数のシステムクラッシュダンプを保持するのでない限り、このディレクトリのサイズをダンプデバイスのサイズに設定することを検討してください。
大型アプリケーション (コンパイラなど) が /tmp ディレクトリを使用するかどうかを決定します。次に、TMPFS によって使用される追加のスワップ空間を割り当てます。TMPFS については、「スワップ空間と TMPFS ファイルシステム」を参照してください。
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 ルートファイルシステムで使用されるスワップファイルを作成できます。スワップファイルは ZFS ルート環境では現在サポートされていません。次の手順でスワップファイルを作成します。
mkfile コマンドを使用してスワップファイルを作成します。
swap コマンドを使用してスワップファイルを有効にします。
システムのブート時に自動的に有効になるように、スワップファイルのエントリを /etc/vfstab ファイルに追加します。
mkfile コマンドは、NFS のマウント済みスワップ空間またはローカルスワップ空間に使用できるファイルを作成します。スティッキビットが設定され、ファイルに 0 が埋め込まれます。スワップファイルのサイズは、バイト数 (デフォルト) として指定するか、接尾辞 k、b、m を使用して、それぞれ K バイト数、ブロック数、M バイト数として指定できます。
次の表に、mkfile コマンドのオプションを示します。
表 20–2 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 |
スワップファイルがアクティブにならない場合は、次のサービスが稼働していることを確認してください。
# svcs nfs/client STATE STIME FMRI enabled 14:14:34 svc:/network/nfs/client:default |
次の例は、/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 |
次の節では、ZFS ルート環境でスワップ空間を追加または変更する方法を説明します。システムまたはアプリケーションで追加のスワップ空間が必要かどうかを確認する方法については、前述の節を参照してください。
スーパーユーザーになります。
現在のスワップボリュームを確認します。
使用中のスワップボリュームは削除できません。現在のスワップボリュームが使用中かどうかは、blocks 列に示されるブロックと free 列に示されるブロックを比較して確認できます。2 つの列のブロックが等しい場合、スワップ領域は使用中ではありません。次に例を示します。
# swap -l swapfile dev swaplo blocks free /dev/zvol/dsk/rpool/swap 256,1 16 1058800 1058800 |
次のいずれかを選択して、スワップボリュームのサイズを変更します。
現在のスワップ領域が使用中でない場合、現在のスワップボリュームのサイズを変更できます。
次に例を示します。
# 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 - |
現在のスワップ領域が使用中の場合は、別のスワップボリュームを追加できます。
次に例を示します。
# zfs create -V 2G rpool/swap2 |
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 |
スーパーユーザーになります。
スワップ空間を削除します。
# /usr/sbin/swap -d /path/filename |
スワップファイル名が削除されるので、スワッピングに使用できなくなります。ファイルそのものは削除されません。
/etc/vfstab ファイルを編集して、スワップファイルのエントリを削除します。
ほかの目的に使用できるようにディスク領域を復元します。
# rm /path/filename |
スワップ空間がファイルの場合は削除します。また、スワップ空間が別のスライスに入っていて、不要なことがわかっている場合は、新しいファイルシステムを作成してマウントします。
ファイルシステムのマウント方法については、第 18 章ファイルシステムのマウントとマウント解除 (手順)を参照してください。
削除したスワップファイルが使用できなくなっていることを確認します。
# swap -l |
次の例は、/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 |