timakin.log

╭( ・ㅂ・)و ̑̑

assets precompileがメモリ不足で失敗する

エラー内容

CapistranoAWS 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

原因

結論としては、メモリ不足により強制終了されてました。(つまりメモリを多く積んだマシンを借りれない金の問題ということ) スワップ領域を拡張して処理落ちしないようにする、というのが解決方法です。

調査

エラーメッセージでググると以下のような参考記事が。

stackoverflow.com

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」等でググったりしていると、

参考記事として以下が出てくる

qiita.com

upsnap.jp

qiita.com

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で強制終了されなくなりました。