unicorn-worker-killerを導入
Railsのプロダクトでサーバーのメモリが足りなくなる問題が頻発しました。
構成はnginx + unicorn
unicornのワーカープロセスは、起動後ユーザーからのリクエストを処理し、再起動されることがありません。 長期間の運用を続けるとメモリが徐々に食いつぶされ次第に枯渇していきます。 結果、リクエストが集中していない時間帯でもdatadogのアラートな鳴りまくる事態に陥っていました。
この状況を「unicorn-worker-killer」を導入し、解決しました。
下記ブログを参考にさせていただきました。
unicorn-worker-killerを使うことで、ワーカプロセスが以下の条件の場合に、自動的に再起動してくれます。 - ワーカプロセスが指定回数のリクエストを処理した場合 - ワーカプロセスが指定量のメモリを使用している場合
Gemの導入
gem 'unicorn-worker-killer'
config.ruに設定を記述 [参考]
unless ENV['RAILS_ENV'] == 'development' require 'unicorn/worker_killer' CHECK_CYCLE = 16 use Unicorn::WorkerKiller::Oom, (400*(1024**2)), (500*(1024**2)), CHECK_CYCLE end
- graceful restartとは?
graceful restart (緩やかな再起動)