GCEでスワップ領域が存在しないことに対する対応

こんにちは、kisseです!

先日、GCEでMySQLが死んでたのでとりあえず起動しようとしたら起動しない問題に直面しました。

結構時間かけて調査したら、スワップ領域が存在しないことが原因だったようなので、スワップ領域の作成について簡単にまとめました。



とりあえずコマンドだけ

もうコマンドの意味とかどうでもいいからって方向け実行コマンド。
(現在の状態とかわからないのでちょっと危険ではあるけど。)

$ dd if=/dev/zero of=/swapfile bs=1M count=1024
$ chmod 600 /swapfile
$ mkswap /swapfile
$ swapon /swapfile

スワップ領域ってそもそもなんだ

僕の場合、この認識が甘かったのでのちに記載する問題に直面しました。
(というか存在は知っていたがパソコンのOSなどでは意識する必要がなかったので思いつかなかった。)

スワップ領域とは、メモリ上に乗り切らなかったデータを一時的に退避させる2次記憶上の領域です。
これがあることによって、限られたメモリでも大きな作業ができるようになります。

逆にこれが設定されてないと、メモリが足りなくなった際にデータを移す先が見つからずに、プロセスが進むことができなくなってしまいます。

このスワップ領域は、普段使うようなパソコンではOSが勝手に作って管理してくれてます。

GCEではスワップ領域が存在しない

GCEでは初期状態ではスワップ領域が存在しないらしいです。
すると、メモリを使い切ってしまった時にプロセスが落ちてしまいます。

僕の場合、GCEの一番小さなインスタンスで、MySQLを動かしていた際に発生しました。
しかも、MySQLの起動コマンドを打ち込んでも、メモリが足りずに起動しないというおまけ付きでした。

GCE上にスワップ領域を作成しよう

freeコマンドで、システムのメモリ領域とスワップ領域の大きさと空き容量を確認することができます。
実際に試してみると、スワップ領域が0となっていることを確認できます。

さて、ここからSwap領域の作成をします。



スワップ領域用のファイルを作成

以下のコマンドを打ち込みます。
dd if=/dev/zero of=/swapfile bs=1M count=1024

ddコマンドとは、 指定したサイズのファイルを作成する といった利用ができるコマンドです。
if=/dev/zeroとは、インプットファイルとして 全てヌル文字のファイルを与える という意味のコマンドです。
/dev/zeroとは、すべてヌル文字のファイルという意味を持つ特殊なファイルです。
of=/swapfileとは、ifで指定されたファイルを/swapfileに書き込みます。
となるので、if=/dev/zero of=/swapfile というオプションは/swapfileという全てヌル文字でフォーマットされたファイルを作成するという意味となります。

bs=1Mとは一度に読み書きするブロックサイズを1MBとするよという指定です。
count=1024とは、書き込みの個数を指定してます。
つまり上の2個のオプションで、1024MB分の書き込みを行うよという意味になります。

ここまででdd if=/dev/zero of=/swapfile bs=1M count=1024の意味は
/swapfile という1024MBのファイルを全てヌル文字にして作ってねという意味になります。

スワップ用ファイルの権限設定

chmod 600 /swapfileでファイル所有者がこのファイルを読み書きできるようにしておきましょう。

スワップ領域の作成

mkswap /swapfileというコマンドでは/swapfileというファイルをスワップ領域として使用できるようにしておきます。

スワップ領域を有効化する

swapon /swapfileでスワップ領域を有効化してあげます。

GCEのインスタンスサイズを変更したら、スワップ領域が消えた!

どうやらこれはそういうものみたいです。
これについては、僕は手動で対応してしまいましたが、
起動時にスワップ領域を有効化するという設定を別途してあげると楽そうです。

一体どれくらいのスワップ領域を設定してあげると良いんだろう

現在、僕はf1-microでモバイルアプリのサーバーサイドを運用してます。
f1-microだとRAMは0.6GB割り当てられます。
そこで、主にメモリを消費するのが、インスタンス内で起動させているMySQLのみです。
freeコマンドを実行してスワップ領域の使用量をチェックしてみたら、まだ300MB程度しか使ってないみたいです。

f1-microで済むようなサービスの場合、スワップ領域は1GB程度用意しておけばとりあえず大丈夫なのではといった様子です。
それ以上になると、そもそもRAMが全く足りてないだとか、ディスク領域使いすぎだよねってことになりそうですね。



おわり

最後まで読んでいただきありがとうございます!

今後も実際にサーバーを運用する中で得た知見を少しずつ残していこうかと思います。

あわせて読みたい