EC2-CentOSでエフェメラルディスクにSwapファイルを簡単に作成する方法
こんにちは、せーのです。今日は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バージョンを作ればいいのか。
参考サイト
- https://dev.classmethod.jp/cloud/ec2linux-swap-bestpractice/
- https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s2-diskpartrecommend-x86.html
- http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/InstanceStorage.html
- http://aws.amazon.com/jp/ec2/instance-types/
- https://github.com/classmethod-aws/ec2-swap/blob/master/source/etc/rc.d/init.d/ec2-swap