Adding jemalloc to Rails apps on Heroku
How to enable jemalloc on Heroku for Rails apps
jemalloc
is a malloc implementation developed by Jason Evans which is known to improve memory consumption of Rails apps, especially on Heroku. By default Ruby uses malloc
from C to manage memory but it can run into memory fragmentation issues.
Whereas jemalloc
describes itself as a malloc implementation which tries to avoid memory fragmentation. A lot of people have successfully tested jemalloc in production apps deployed on Heroku to verify that it reduces memory usage compared to the default memory management that comes with Ruby.
Enabling it in a Rails app on Heroku consists of following steps.
Add jemalloc buildpack
heroku buildpacks:add --index 1 https://github.com/gaffneyc/heroku-buildpack-jemalloc.git
Enable jemalloc
This can be done in two ways. Either we can set the environment variable, JEMALLOC_ENABLED
to true
.
heroku config:set JEMALLOC_ENABLED=true
Alternatively, we can add jemalloc.sh
prefix to the processes listed in the Procfile.
# Procfile
web: jemalloc.sh bin/puma -C config/puma.rb
worker: jemalloc.sh bundle exec sidekiq -q default -q mailers -c ${SIDEKIQ_CONCURRENCY:-5}
Note that setting the JEMALLOC_ENABLED environment variable will enable jemalloc for all processes of your app, where as adding jemalloc.sh
prefix in Procfile can give you control over for which processes you want to enable it.
After this is done, deploying the app on Heroku will enable jemalloc
and we can monitor the memory consumption.
jemalloc version
We can choose the jemalloc
version by setting JEMALLOC_VERSION
to a version number from this list. By default, the buildpack chooses the most recent version.
Conclusion
With just enabling jemalloc, we can see significant drop in memory usage on Heroku without doing any code change. So I highly recommend enabling it in production apps deployed on Heroku.