heroku Rails(Heroku) パフォーマンス メモリの最適化

本稿について

本稿はサイト運営者が学んだことなどを記したメモの内容です。
全てが正確な情報とは限りません。ご注意ください。また修正するべき点は適時修正していきます

環境変数 “MALLOC_ARENA_MAX” を2に設定する

詳しくは[参考]を参照。
スレッドあたりのメモリアリーナの数を制限する。
Herokuでは一番効果があった。2019年9月以降のherokuのRailsアプリケーションを立ち上げるとデフォルトで設定されているらしい。

[確認方法]
bashでログインして環境変数に “MALLOC_ARENA_MAX”が設定されているかどうかを確認する。下記の例だと設定済み
$ heroku run bash --app xxxxxxxxx                                                  
Running bash on ⬢ xxxxxxx... up, run.6837 (Hobby)
~ $ env | grep MALLOC_ARENA_MAX
MALLOC_ARENA_MAX=2


[設定方法]
heroku config:set MALLOC_ARENA_MAX=2

もしくはHerokuダッシュボードの「settings」から
"Reveal Config Vars” ボタンを押して環境変数を設定する


[参考]



WEB_CONCURRENCYの設定

pumaの設定で WEB_CONCURRENCYの設定を変更する。
pumaはマルチスレッドで動くので、そのスレッド数を制限することでメモリ使用料を抑制する。herokuはdynoで並列処理できるので、個人的には1で良いかと思う。

config/puma.rb
workers Integer(ENV['WEB_CONCURRENCY'] || 2)

環境変数の設定
heroku config:set WEB_CONCURRENCY=1

[参考]



puma_worker_killerの導入

Gemfile
gem 'puma_worker_killer'

config/puma.rb
before_fork do
  require 'puma_worker_killer'
  PumaWorkerKiller.config do |config|
    config.rolling_restart_frequency = 6 * 3600 # 12 hours in seconds
  end
  PumaWorkerKiller.enable_rolling_restart
end


[参考]
Back