コンテナBuild時にメモリエラーによって、プロセスがkillされてしまうので、なんとかしようと思ってswap領域を確保することにしました。
swap領域とはなにか?
ハードディスクの一部。メモリが不足した際にメモリの内容を一時的に避難させる場所。
メモリの上限以上の処理をできるようにするために存在する。
1,AMIにはswap領域が含まれない
t3.micro インスタンスを使用しているが free -m
で確認してもswap領域はない。
デフォルトでswap領域が確保されているインスタンスもあるが今回利用するt3.microにはなかった
2,swap領域の確保はEBSでやるかインスタンスストアか?
これはEBSの料金体系がI/O回数によるものだった時代の話をしているようで、今ではインスタンスごとのIOPS性能を超えた分だけ追加料金がかかるようになったため料金は変わらないということです。
こういう歴史を知るのは楽しいです。
インスタンスストアでswap領域の確保ができるのは、デフォルトでインスタンスストアが含まれているインスタンスに限られ、以下でサポートされているインスタンスを確認できます。
ちなみに今回swap領域を確保したかったt3.microはサポートされていませんでした。
3,swap領域を既存のEBSで作成する
free -h で現状のメモリ状況を確認します。
availableが357Mとなっており、すぐに開放可能なキャッシュなどとfreeを合わせると357Mが使える分だ、ということがわかります。
swap領域を確保するbashスクリプト
source swapon.sh 2048
で2GB分を作成できる。
これをEC2内で実行する。
#!/bin/bash
echo "script="$0
echo "arg count="$#
# MB単位で受け取る 例)2GB=2048
SWAP_COUNT=${1}
sudo dd if=/dev/zero of=/swapfile bs=1M count=${SWAP_COUNT}
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon -s
# sudo 権限で/etc/fstabに書き込み、永続化
sudo sh -c 'echo /swapfile swap swap defaults 0 0 >>/etc/fstab'
以上でコンテナビルド時に出るメモリエラーを解決できました。