元祖若手のプログラミング奮闘記

元祖若手の奮闘記。主にメモ

Rails5.2にしてからデプロイが徐々に遅くなっている

Ruby on Rails
Ruby on Rails

結果だけ気になる人のために
まずは結論から

原因

Rails5.2から導入されたgem Bootsnap
処理を早くするためにデプロイ毎にcacheし
古いのが消えずに残り続けていたから。

解決方法

cache を消した。

cd /var/www/myapp/shared
rm -rf tmp/cache/bootsnap*

原因わからず半ベソ編

最初はただのRails バージョンをあげただけだった。。

最近はどこの現場でもRailsのバージョンを最新にしたがる人なので
今回も段階的にRails6にしようと思ってた矢先でした

Rails5.2にしてからだんだんデプロイ時間が遅くなっていることに気付き、
5分もかからなかったデプロイが
三日ほどで10分以上かかるようになってしまいました。。。

グラフ1
グラフ1

グラフを見てもらうとわかるようにデプロイ失敗しているんですが
処理時間が長すぎるために10分応答がなかったので
CircleCIが失敗と判断しデプロイができないようになってしまいました。。

Unicornも勝手に落ちるように。。

挙げ句の果てにUnicornも一日のどこかで
一時的に504エラーを返すようになり
完全に半ベソ状態でした。。

考えつく限り対策したけどダメだった編

以下の三つだけ少し効果があったので紹介します

release以下のRailsを最低限削除

capistranoを使用しているのでreleaseディレクトリに5つのRailsが入っているので
最新から3つほど残し、他は一時的に削除した。

tmp/assets配下にある使われてないjsファイルを削除

こちらもプリコンパイルしたときのjsファイルが昔からずっと残っていたので
config/deploy.rb に以下の設定を加えて古いjsファイルを削除した。

set :keep_assets, 3

スワップ領域を作ってメモリを割り当てた

さすがAWSという感じでこちら の説明がわかりやすかった

あと他試したけど全く変わらなかった

  • ロードバランサーで一台切り離してから サーバー再起動 & Unicorn再起動
  • Unicorn ワーカプロセスを2つから5つに増やす。
  • メモリキャッシュ削除
  • CircleCI上でassets:compileして転送

やっとわかった編

当時はデプロイが遅いのとUnicornが勝手に止まったのが重なったせいで
いろんな説が飛び交いまして

Unicornの性能が悪い説
CircleCIが勝手に設定変えた説

とかもう結構何が悪いのかわからなくなっていたところ
bootsnap で処理が早くなるという記事を見つけて
「え!実は効いていないとか?有効にすれば元に戻るかも!」
と思い Githubを見ていたらこんなことを書いているのを見つけました。

Bootsnap readme
Bootsnap readme

大事なので一部抜粋すると

If you notice deploys getting progressively slower, this is almost certainly the cause.

もしデプロイが遅くなっているならこれが原因だ的なこと書いてるじゃん!!
ということですぐにcacheを削除しデプロイしてみた。。

嬉しい!!!

グラフ2
グラフ2

13分くらいかかってたのが5分程度に戻ってる!!
てかすみません僕が今回の戦犯でした。。。。
現場の皆様は叱ることなく今回の件を褒めていただきました。。

締め

今回の件でいろいろと学ばせてもらいました。
インフラも少し毛が生える程度に知識を得ることができました。。
雑にRailsのバージョンをあげてるわけではないんですが
もう少し差分があるところはもう少し調べないとなあと思います。。