Pumaがメモリを大食いするのを防ぐ [puma_worker_killer]
Ruby on Railsでアプリケーションサーバーに「Puma」を使用していると、時間経過とともにメモリを大量に使用します。今回はpuma_worker_killerというgemを使用してそれを回避するようにします。
起動時のメモリ
Puma起動時の使用済みメモリは528MB。
6時間経過後
1313MBになっていました。
このメモリの大食い対策をするには「puma_worker_killer」を使用します。
Gemfile
次のgemを追加します。その後はbundleして下さい。
gem 'puma_worker_killer'
config/puma.rbの編集
次のコードを追加します。
before_fork do PumaWorkerKiller.config do |config| # 1. サーバのRAMを記述する(MB単位) config.ram = 1837 # 2. メモリ使用率の確認頻度(秒単位) ※(例)24時間に1回 config.frequency = 24 * 60 * 60 # 3. メモリ使用率(%) ※(例)90% # ※2の確認時にこの値を超えるとWorkerが再起動される config.percent_usage = 0.90 # 4. 2/3とは別にWorkerを再起動する周期(秒単位) ※(例)3分毎 config.rolling_restart_frequency = 3 * 60 # 5. 監視ログの出力 config.reaper_status_logs = false end PumaWorkerKiller.start end
ワーカーの再起動は「メモリ使用率」「周期」の2種類の方法があります。
上記の例では3分毎に一番メモリ使用量の多いWorkerを自動で再起動します。それに加えて、24時間毎に1回メモリ使用率を確認して90%を超えれば再起動するというのも含まれています。
Nginx + Pumaで複数のRailsプロジェクトを実行するの記事を参考した方は「プロジェクト名/my_puma.rb」のファイルに追加して下さい。
対策後
私の環境ではおおよそ、550-800MBくらいで安定しています。
参考URL
https://github.com/schneems/puma_worker_killer (公式)
スポンサーリンク
関連記事
公開日:2019年10月02日 最終更新日:2019年10月03日
記事NO:02782