EC2-CentOSでエフェメラルディスクにSwapファイルを簡単に作成する方法

2015.05.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。今日はEC2でCentOSを立ち上げた時に必要となるちょっとした小技を備忘録として書きます。

CentOSはAmazon Linuxと同じようにはいかない

Swapファイルはシステムを組む上で必要なものですがEBSは容量課金なのでSwapで使ってしまうのはもったいないです。EBSに色々なデータが増えてくるとOOM Killerの餌食になる可能性も充分考えられます。 そこでSwapファイルは無料でついてくるエフェメラルディスクに置くのがベストプラクティスと言えます。 Amazon Linuxの場合はec2-swapというパッケージを使って

sudo rpm -ivh http://repo.classmethod.info/yum/x86_64/cm-repo-release-0.2.0-1.noarch.rpm
sudo yum install --enablerepo=classmethod-test -y ec2-swap

みたいに済ませてしまうのですが、CentOSだとうまく動いてくれません。なので手作業で設定するのですが、毎回忘れがちになるのでここに書いておこうと思います。

設定方法

事前準備

まず前提条件としてEC2を立ち上げる時にエフェメラルディスクをつけてください。エフェメラルディスクを付けられないインスタンスタイプもあるので注意しましょう。 次にエフェメラルディスクのついているパーティションテーブルをfdisk -lで確認しておきます。私の場合は/dev/xvdfでした。

rc.localに追記

方法は簡単。rc.localの最後にこのコードを書くだけです。

mkfs.ext4 /dev/xvdf

if [ ! -d /media/ephemeral0 ]; then
    mkdir /media/ephemeral0
fi
mount /dev/xvdf /media/ephemeral0

SWAPFILENAME=/media/ephemeral0/swap.img
MEMSIZE=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
 
if [ $MEMSIZE -lt 2097152 ]; then
  SIZE=${((MEMSIZE * 2))}k
elif [ $MEMSIZE -lt 8388608 ]; then
  SIZE=${MEMSIZE}k
elif [ $MEMSIZE -lt 67108864 ]; then
  SIZE=${((MEMSIZE / 2))}k
else
  SIZE=4194304k
fi
 
fallocate -l $SIZE $SWAPFILENAME 
mkswap $SWAPFILENAME 
swapon -a

解説

ではワンライナーで一気に解説していきます。 まずext4でパーティションテーブルにファイルシステムを作成します。次にエフェメラルディスクをマウントします。メモリ容量を取得して適切なSwapファイルサイズを計算します。Swapファイルを作成してSwapを作りswaponします。 以上、簡単ですね。あとは再起動して実際にこのコードを走らせてもらえればSwapファイルがエフェメラルディスクに作成されます。下の例はm3.largeのEC2にCentOSを立ててSwapファイルを作成した結果です。

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvde        20G  9.5G  9.2G  51% /
tmpfs           3.6G     0  3.6G   0% /dev/shm
/dev/xvdf        30G  7.1G   21G  26% /media/ephemeral0

まとめ

いかがでしょうか。あくまでこれは基本で、凝ればいくらでも凝ることはできると思います(パスを変数化したりとか)。あ、ec2-swapのCentOSバージョンを作ればいいのか。

参考サイト