ホーム > カテゴリ > Ruby・Ruby on Rails >

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