この記事は公開から1年以上が経過しています。内容が古い場合があるのでご注意下さい。

これまでEC2インスタンスでswapを作る時は、クラスメソッドさんが紹介されている方法で、swapファイルを作成するようにしていました。

Amazon EC2(Linux)のswap領域ベストプラクティス

しかし、この方法だと、CentOS7などXFSのファイルシステム上では、fallocateで作成した領域に対しては、swaponの実行に失敗してしまったので、その対応方法についてです。

fallocateの代替案

fallocateの代替案を探したり考えたりしましたが、妙案思いつかず、ddコマンドでやることにしました。

ちなににfallocateでやると以下の様に、swaponで失敗します。

# fallocate -l 1G /swapfile
# mkswap /swapfile
# swapon /swapfile
swapon: /swapfile: swapon failed: Invalid argument

rc.localへの追記

EXT4とXFSの両方に対応できるように、以下の内容をrc.localに追記します。
これは、先ほどのクラスメソッドさんのブログのものを少し修正したものです。

# MAKE SWAP FILE
SWAPFILENAME=/swap.img
MEMSIZE=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`

if [ $MEMSIZE -lt 2097152 ]; then
    SIZE=$((MEMSIZE * 2))
elif [ $MEMSIZE -lt 8388608 ]; then
    SIZE=$MEMSIZE
elif [ $MEMSIZE -lt 67108864 ]; then
    SIZE=$((MEMSIZE / 2))
else
    SIZE=4194304
fi

# SELECT FILE SYSTEM
FSTYPE=`df -T |grep /$ | grep xfs | wc -l`

if [ $FSTYPE -eq 1 ]; then
    # For XFS
    dd if=/dev/zero of=$SWAPFILENAME count=$SIZE bs=1K && mkswap $SWAPFILENAME && swapon $SWAPFILENAME
elif [ $FSTYPE -eq 0 ]; then
    # For EXT4 
    fallocate -l "$SIZE"k $SWAPFILENAME && mkswap $SWAPFILENAME && swapon $SWAPFILENAME
fi

XFSの場合、ddコマンドを使うので若干時間がかかってしまいますが、RHEL7やCentOS7の場合でも、これまでと同じように、インスタンスタイプに合わせたSWAPファイルが作成されるようになります。

ddコマンドにかかる時間

今回の場合、XFSだと最大で8GBのファイルをddコマンドで作成することになりますが、m4.largeで15分程度かかりました。

単なるサーバ再起動でも、dd実行にかかる時間には注意するようにしましょう。

EBSへのディスクI/Oについて

ddコマンドを使うと、fallocateに比べて、ファイル作成時にディスクI/Oが多くなりますが、EBSは汎用SSDのgp2タイプを想定しているので、I/O課金は想定していないものになります。

注意点

RHEL7、CentOS7では、rc.localに実行権限が無いので、予め実行権限を付けておくことを忘れないようにします。

ちなみに、rc.localには以下の記載があります。

# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

以上です。

関連記事:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です