複数のScalaのプロジェクトを、Ubuntu上で同時に起動するような開発していると、メモリが512MB程度では到底足りず、ScalaのビルドツールであるsbtのプロセスがOOM Killerに殺されてしまいがちです。
VagrantでVMのメモリを4GBくらい追加してもいいですが、そうなるとフルカスタムのMacBook Proがないと開発に参加できない…といった状況になってしまい、開発のハードルが上がってしまいます。
そこで、VMにメモリを追加するのではなく、swap領域を増やしてScalaのプロセスが終了されないように、VagrantでUbuntuをプロビジョンするようにします。
まず、swapを増やすためのプロビジョンスクリプトを作成します。このスクリプトは「Vagrant Quickstart – jeqo's blog」の記事のものをほぼそのまま使います。
#!/bin/sh
# size of swapfile
swapsize=4G
# does the swap file already exist?
grep -q "swapfile" /etc/fstab
# if not then create it
if [ $? -ne 0 ]; then
echo 'swapfile not found. Adding swapfile.'
fallocate -l ${swapsize} /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap defaults 0 0' >> /etc/fstab
else
echo 'swapfile found. No changes made.'
fi
# output results to terminal
df -h
cat /proc/swaps
cat /proc/meminfo | grep Swap
Ubuntuにswapを追加する方法は「Linux - Swap領域が足りないときに、ささっと追加する - Qiita」で紹介されているとおり、dd
コマンドでスワップファイルを作成し、mkswap
とswapon
でスワップ領域を増やすことができます。しかし、Ubuntuが再起動してしまうと、スワップ領域が無くなってしまいます。起動するたびに、この手順を踏むのは面倒です。再起動してもスワップ領域が無くならないようにするには、/etc/fstab
に/swapfile none swap defaults 0 0
などを書いておきます。上のスクリプトincrease_swap.sh
は、スワップ領域を作成するだけでなく、/etc/fstab
にスワップ領域の設定を追記することまでやってくれます。
次に、Vagrantfileに下記の行を加えます。これにより、初回のvagrant up
時などプロビジョニングは実行されるときにswap領域が追加されるようになります。
config.vm.provision "shell", path: "increase_swap.sh"
すでにvagrant up済みのVMに対して、swapを追加するときは、Vagrantfileを修正後vagrant provision
することで適用されるようになります。