t3.nanoみたいなメモリが0.5GBぐらいしかないインスタンスで遊んだりすると、ちょっとサービス起動したり、下手するとパッケージの大量アップデートなどがあるだけでメモリ不足になることがあります。
EC2に限らず昨今のクラウドサービスの仮想マシンは基本的にswapが設定されていないのですが、それだと色々困ったので、今回はcloud-initでswapの設定をやってみようと思います。
※ここではAWSを前提に進めていきますが、だいたいどの環境でも一緒でしょう。
インスタンスストアがない場合
既存のボリュームにswapファイルを作りましょう。
気の利いた設定機能はないのでruncmd
でゴリゴリ書きます。
流れとしてはこのような感じになります。
-
dd
コマンドでswap用のファイルを作る -
mkswap
でスワップ領域を作る -
swapon
でスワップ領域を有効化する - 再起動時に自動マウントされるように
/etc/fstab
に設定を書いておく
#cloud-config
runcmd:
- [ sh, -c, "dd if=/dev/zero of=/swapfile bs=64M count=32" ]
- [ sh, -c, "chmod 600 /swapfile; mkswap /swapfile; swapon /swapfile" ]
- [ sh, -c, "echo '/swapfile none swap defaults 0 0' >> /etc/fstab" ]
サイズは環境に合わせて適宜調整してください。
dd
のブロックサイズ(bs
)はあまり大きくするとメモリ不足でエラーになるので、小さめにしたほうが無難です(ブロックサイズ分のメモリを消費するため)。
時々「dd
よりfallocate
がいいよ」みたいな記事を見かけますが、fallocated
で作成したファイルをswapon
しようとするとエラーになるケースが存在するのでdd
が無難だと思います。
インスタンスストアをまるまるswapにする場合
インスタンスストアがあってそれをまるまるswapにする場合は……調べてみても古めの記事しか出てこないのと、実際に試したことがないので、ここではあえて触れません。
ただ、やることは大体同じでしょう。最初からデバイスがマウントされてるので、少し手順が変わるだけです。
cloud-config ephemeral swap
とかで検索すると参考になりそうな記事が出てきます。