仮想サーバーでスワップファイルを作るには

本項目では、AWS EC2などの仮想サーバーで特にメインメモリの小さいインスタンスを使う場合にほぼ必須になる可能性の高い、スワップファイルの作成・割り当て方法について記載を行いたい。というのも、メインメモリの容量の小さいインスタンスではメインメモリの量が少なく、OSや動作しているアプリケーションによってはたちまちメインメモリが枯渇してしまって、処理が止まってしまうといった問題に直面する可能性が高く、それを少しでも防ぐためにスワップファイルを作成する必要があることによるものである。しかも、デフォルトの設定ではスワップ領域が準備されないため、自身で準備を行う必要がある。

スワップファイルのサイズ目安

スワップファイルを作成するに当たって、どれくらいのサイズを作ればいいのかの目安であるが、『Red Hat Enterprise Linux 8 ストレージデバイスの管理 第11章 スワップの使用』によれば、以下が目安として挙げられている。

メインメモリ容量推奨スワップ容量
2GB以下メインメモリ容量の2倍
2〜8GBメインメモリ容量と同じ容量
8GB超4GB以上

例えば、AWS EC2で無料利用枠の対象となるt2.micro [1]一部リージョンではt3.microの場合もある を使う場合は、メインメモリ容量が1GBになるので、作成するスワップファイルのサイズは2GBが目安となる。その上で、現在使っている仮想ストレージの空き容量が十分あるかどうかを確認する。もし不足していた場合は拡張する必要がある。

目安を元に作成するスワップサイズが決まったら、スワップファイルの作成に移りたい。

スワップファイルを作成する

まずは、 ddコマンドでスワップファイルとなるファイルを作成する。書式は以下のようになる。

sudo dd if=/dev/zero of=/swapfile bs=(ブロックサイズ) count=(カウント数)

このコマンドはifで指定されたファイルからofに指定されたファイルにブロック単位で変換した上でコピーするコマンドである[2]cf. 【 dd 】コマンド――ブロック単位でファイルをコピー、変換する – atmarkIT 。今回の場合はまずは容量分のサイズをもったファイルを作成する必要があるため、上記のコマンドで作成するということである。空白のデータとするため、ifには/dev/zeroを指定し、ofにはスワップファイルの作成先を指定する [3]今回の場合は/swapfileとしている

ddコマンドでスワップファイルを作成する場合、bsとcountが掛け算になるため、その掛け算の積がスワップファイルのサイズになるように計算する必要がある。とはいえ、スワップファイルを作成する目的であれば、以下のようにすれば失敗は少ない。

  • bs → 基本的に「1M」を指定する [4]1Gを指定してしまうとメモリ不足で処理できない可能性が高くなる
  • count → 作成するサイズに応じて指定する。例えば2GBとしたい場合はbsが1Mなので、2GBは2048MBと読み替えて、「2048」を指定すれば良い。

上記にしたがって、例えば2GBのスワップを作成する場合は以下のようになる。

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

これでしばらくすればスワップファイルが作成する。スワップファイル作成後はユーザーによるアクセスを防ぐため、以下のコマンドでパーミッションの変更を行う。

sudo chmod 600 /swapfile

パーミッションの設定が完了したら、以下のコマンドでスワップファイルの初期化を行う。

sudo mkswap /swapfile

以上が完了すれば、スワップファイルの作成が完了する。

スワップファイルをマウントする

コマンドラインでマウントする

以下のコマンドを入れることで、スワップ領域が有効化される。

sudo swapon /swapfile

起動時にスワップファイルをマウントする

ただし、上記のコマンドでは現在起動しているセッションでのみ有効となるだけで、再起動した場合はスワップファイルのマウントは自動的に行われない。そこで、/etc/fstabを編集、以下を追加することで、起動時に自動でスワップファイルをマウントするようにする。

/swapfile    swap    swap    defaults    0 0

上記は/swapfileをスワップ領域として起動時に自動的にマウントするための設定である。

最後に

今回はAWS EC2などの仮想サーバーでメモリ容量の小さいインスタンスを使うときに、メモリ容量が足りないといった事態に備えて、ストレージをメモリとして扱うスワップの設定を行うための手順を行った。ただ、スワップはあくまでメモリー容量が足りなくなった時に、本来メインメモリーで保持すべきデータをストレージに退避させて処理を行わせるものであり、なおかつメインメモリーと比較してストレージは転送速度が遅いので、スワップが常態化するようなことは極力起こらないように対応することが求められる。

References

1 一部リージョンではt3.microの場合もある
2 cf. 【 dd 】コマンド――ブロック単位でファイルをコピー、変換する – atmarkIT
3 今回の場合は/swapfileとしている
4 1Gを指定してしまうとメモリ不足で処理できない可能性が高くなる

コメント

タイトルとURLをコピーしました