Rails5.2にしてからデプロイが徐々に遅くなっている
結果だけ気になる人のために
まずは結論から
原因
Rails5.2から導入されたgem Bootsnap が
処理を早くするためにデプロイ毎にcacheし
古いのが消えずに残り続けていたから。
解決方法
cache を消した。
cd /var/www/myapp/shared rm -rf tmp/cache/bootsnap*
原因わからず半ベソ編
最初はただのRails バージョンをあげただけだった。。
最近はどこの現場でもRailsのバージョンを最新にしたがる人なので
今回も段階的にRails6にしようと思ってた矢先でした
Rails5.2にしてからだんだんデプロイ時間が遅くなっていることに気付き、
5分もかからなかったデプロイが
三日ほどで10分以上かかるようになってしまいました。。。
グラフを見てもらうとわかるようにデプロイ失敗しているんですが
処理時間が長すぎるために10分応答がなかったので
CircleCIが失敗と判断しデプロイができないようになってしまいました。。
Unicornも勝手に落ちるように。。
挙げ句の果てにUnicornも一日のどこかで
一時的に504エラーを返すようになり
完全に半ベソ状態でした。。
考えつく限り対策したけどダメだった編
以下の三つだけ少し効果があったので紹介します
release以下のRailsを最低限削除
capistranoを使用しているのでreleaseディレクトリに5つのRailsが入っているので
最新から3つほど残し、他は一時的に削除した。
tmp/assets配下にある使われてないjsファイルを削除
こちらもプリコンパイルしたときのjsファイルが昔からずっと残っていたので
config/deploy.rb に以下の設定を加えて古いjsファイルを削除した。
set :keep_assets, 3
スワップ領域を作ってメモリを割り当てた
あと他試したけど全く変わらなかった
- ロードバランサーで一台切り離してから サーバー再起動 & Unicorn再起動
- Unicorn ワーカプロセスを2つから5つに増やす。
- メモリキャッシュ削除
- CircleCI上でassets:compileして転送
やっとわかった編
当時はデプロイが遅いのとUnicornが勝手に止まったのが重なったせいで
いろんな説が飛び交いまして
Unicornの性能が悪い説
CircleCIが勝手に設定変えた説
とかもう結構何が悪いのかわからなくなっていたところ
bootsnap で処理が早くなるという記事を見つけて
「え!実は効いていないとか?有効にすれば元に戻るかも!」
と思い Githubを見ていたらこんなことを書いているのを見つけました。
大事なので一部抜粋すると
If you notice deploys getting progressively slower, this is almost certainly the cause.
もしデプロイが遅くなっているならこれが原因だ的なこと書いてるじゃん!!
ということですぐにcacheを削除しデプロイしてみた。。
嬉しい!!!
13分くらいかかってたのが5分程度に戻ってる!!
てかすみません僕が今回の戦犯でした。。。。
現場の皆様は叱ることなく今回の件を褒めていただきました。。
締め
今回の件でいろいろと学ばせてもらいました。
インフラも少し毛が生える程度に知識を得ることができました。。
雑にRailsのバージョンをあげてるわけではないんですが
もう少し差分があるところはもう少し調べないとなあと思います。。