assets precompileがメモリ不足で失敗する
エラー内容
CapistranoでAWS EC2インスタンスにdeployする時に、 以下のようなログが出てassets:precompileのタスクでプロセスが強制終了する。
SSHKit::Runner::ExecuteError: Exception while executing as xxx: rake exit status: 137 bash: line 1: 20652 Killed /usr/local/rbenv/bin/rbenv exec bundle exec rake assets:precompile rake stderr: Nothing written
原因
結論としては、メモリ不足により強制終了されてました。(つまりメモリを多く積んだマシンを借りれない金の問題ということ) スワップ領域を拡張して処理落ちしないようにする、というのが解決方法です。
調査
エラーメッセージでググると以下のような参考記事が。
When this is combined with lots of sass/css, the process uses tons of memory, and the OS kills it
と書いてあって、メモリ不足で停止するのか?という仮説が立つ。
sudo tail -n 100 /var/log/messages
で、EC2上のログを出力すると、
Apr 5 15:16:31 ip-10-0-0-196 kernel: [2691172.158997] Out of memory: Kill process 24684 (ruby) score 314 or sacrifice child Apr 5 15:16:31 ip-10-0-0-196 kernel: [2691172.162226] Killed process 24684 (ruby) total-vm:1237852kB, anon-rss:318164kB, file-rss:888kB
完全にメモリ不足で落ちてる。 「メモリ不足 assets compile」等でググったりしていると、
参考記事として以下が出てくる
EC2インスタンスのスワップ領域を増やせばいけそうなので、下記をインスタンス内部で実行する
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 sudo mkswap /swapfile sudo swapon /swapfile
sudo vim /etc/fstab # 下記を追記 /swapfile swap swap defaults 0 0
その後、インスタンスを再起動したのち、デプロイすると、 スワップ領域が有効になったことで、OOMで強制終了されなくなりました。