経緯
- Railsを動かしているElasticBeanstalkでメモリの消費量が増大している
- 定期的/一定量のメモリを消費したらアプリをリスタートしたい
注意事項
まずはRailsやpumaなどを最新にして、自アプリ以外が原因のメモリリークをなくしましょう
- っていうか自アプリのメモリリークも無くせるならなくしましょう!
puma_worker_killerって?
schneems/puma_worker_killer: Automatically restart Puma cluster workers based on max RAM available
- pumaのworkerを定期的/一定量のメモリを消費したらkillしてくれるgem
- メモリリーク対策によく使われる
方法
1.Gemfilesに追加
group :production do gem 'puma_worker_killer' end
2.設定ファイル(.ebextensions)にて、puma_worker_killerの設定をElasticBeanstalkに入れる
ElasticBeanstalkでは、設定ファイル(.ebextensions)により環境のカスタマイズができる
.ebextensions ディレクトリに、configファイルを置くと、それを読み込んでファイルの追加やコマンドの実行などをしてくれる
なので、ElasticBeanstalkのpumaの設定ファイルに、puma_worker_killer 用の設定を追加するコマンドを書く
- ./ebextensions/00_add_puma_extend_conf.config
files: '/opt/elasticbeanstalk/support/conf/puma_extend_conf.rb': mode: "000644" owner: root group: root content: | before_fork do require 'puma_worker_killer' PumaWorkerKiller.config do |config| config.ram = 2048 # メモリ量(MB) config.frequency = 5 # forkされたpumaのリスタートの時間差(多分 config.percent_usage = 0.98 # メモリを何%使ったら再起動する config.rolling_restart_frequency = 24 * 60 * 60 # 何秒に1回再起動するか(← 24Hに1回) config.reaper_status_logs = true #ログ出力(デバッグ用 end PumaWorkerKiller.enable_rolling_restart PumaWorkerKiller.start end container_commands: 00_add_puma_extend_conf: command: | cat /opt/elasticbeanstalk/support/conf/puma_extend_conf.rb >> /opt/elasticbeanstalk/support/conf/pumaconf.rb test: "test ! -e /home/ec2-user/add_puma_extend_conf_done" 01_add_puma_extend_conf_done: command: "touch /home/ec2-user/add_puma_extend_conf_done" test: "test ! -e /home/ec2-user/add_puma_extend_conf_done"
解説
files:
- ファイルを生成する設定
- puma_worker_killerの設定を書いたファイルをサーバに置く
- puma_worker_killerの設定値は、本家のreadmeを参照 → https://github.com/schneems/puma_worker_killer#attention
container_commands:
- デプロイ後に実行されるコマンド群を設定
- ソート順に実行される
/opt/elasticbeanstalk/support/conf/puma_extend_conf.rb
は、ElasticBeanstalk で参照されるpumaの設定ファイル- そこに、
files:
で追加した、puma_worker_killerの設定を書いたファイルの内容を追加する - その後に、空ファイル
/home/ec2-user/add_puma_extend_conf_done
を作成
- そこに、
test:
オプションは、戻り値が0以外の場合実行しなくするオプション- 空ファイル
/home/ec2-user/add_puma_extend_conf_done
があったら実行しない - 1回puma_worker_killerの設定が追加されたら、もう実行しないようにするため
- 空ファイル
デプロイ後、ログを見てみる
[30959] PumaWorkerKiller: Rolling Restart. 1 workers consuming total: 99.34765625 mb out of max: mb. Sending TERM to pid 13411. [30959] PumaWorkerKiller: Consuming 99.34765625 mb with master and 1 workers.
適当なタイミングで再起動したり、メモリの残量をチェックしてくれている!