Blog Ruby + jemalloc: Results for updown.io

Note: This article was initially published on Medium in 2017 and later moved to this official updown.io blog.

I recently read this great article about compiling ruby with jemalloc for slightly better performance and smaller memory usage and it got me intrigued. I mean I already knew jemalloc, but I though this kind of optimization (swapping allocation library) was reserved for some very specific use-cases and that the gain would be minimal for a standard Rails app like mine.

But Clément is talking about ~30% memory usage decrease which seems HUGE to me for such an easy change so I tried to look for other benchmarks and comparisons online but couldn't find many (if you know some please let me know).

I already noticed some high memory usage on updown.io's background processes (monitoring daemon and sidekiq workers) which I attributed to the nokogiri library after I measured that it was the one increasing memory so much (and leaking a little bit). I studied alternatives like oga for HTML parsing but couldn't make the switch yet due to string encoding issues.

So after seeing this I though: "why not try jemalloc, see if it can improve the situation, and share my numbers?". Well here there are:

Chart showing the results detailed below

Daemon: -30%

Sidekiq: -45%

The numbers here are the average memory usages measured on 3 servers with jemalloc and 3 servers without (all 6 identically specced), 24h after process start.

Setup

The setup was pretty easy in my case as I was using rbenv, all I had to do was install jemalloc:

sudo apt-get install libjemalloc-dev

And reinstall ruby with jemalloc:

RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.3.0

Check out the original post for more ways to compile ruby with jemalloc.


Adrien Rey-Jarthon
Created on April 01, 2017 · Last update on November 06, 2023