Rails Performance Monitoring Tools Compared

You should monitor your Rails application regularly, to find performance bottlenecks. Here are some tools that help you achieve this.

1. Using rack_mini_profiler gem

Install it by adding the gem 'rack_mini_profiler' to your Gemfile. If you append your url with the pp parameter, you will get to see some options for Rack Mini Profiler.

For example, running locally http://localhost:3000/?pp=help — shows the help screen.

Memory Profiling

To find which gems and files are using the memory, accessing the url http://localhost:3000/?pp=profile-memory — will show the memory profile.

This requires gem 'memory_profiler' to be added to the Gemfile.

Sample profiler output

As you can see above, gems like newrelic_rpm, meta_requests etc are adding to the memory consumed by the Rails app; so its important to add them to the right group in the Gemfile.

Flamegraph of the Stack

Add the following gems to show the flamegraph of the call stack with rack_mini_profiler.

gem 'flamegraph' gem 'stackprof'

It can show the flamegraph of the call stack. For more about how to interpret the famegraph read Rails App’s Performance blog post by Justin Weiss.

Flamegraph of a sample Rails route

2. Rails Panel

If you are using Google Chrome, there is a handy Chrome extension called Rails Panel. Download it from the chrome web store.

This extension will show you the breakdown of time taken in Rendering, ActiveRecord etc.

The gem 'meta_request' needs to be added to the development group in the Gemfile, for the data to appear in Rails panel.

Output in Rails Panel

3. Scout DevTrace

Using the scout agent (add gem 'scout_apm' in the Gemfile) in development mode will show a beautiful panel with the breakdown of time consumed in various sections - Views, Middleware, ActiveRecord, controllers etc. It also shows N+1 queries and backtraces.

DevTrace from Scout APM

You need to start the server with the environment variable SCOUT_DEV_TRACE=true for this.

$ SCOUT_DEV_TRACE=true be rails server

4. Derailed Benchmarks

Derailed Benchmarks gem can be used for a variety of tasks. Well, the gem has packaged common performance into rake tasks. Read the code here — derailed_benchmarks#tasks.rb.

Gem-wise memory consumption

Running the following command will give the list of gems used in the app, along with the memory they consume.

bundle exec derailed bundle:mem

Identify memory leaks

For running memory and stack profilers you need to prepare your app to run in RAILS_ENV=production. The following needs to be taken care of:

  • Disable ssl configuration for the test config.force_ssl = false in environments/production.rb. Troubleshooting - Read this Gist.
  • Check database for production and the secrets file.
  • Use the same server as you use in production. Derailed by default uses Rack::Mock by default.
  • Configure authentication as per the documentation.

Running perf:mem_over_time will boot up the app and show the memory consumed by the app, as its hit by a larger amount of requests.

USE_SERVER=puma bundle exec derailed exec perf:mem_over_time

If the memory remains constant after a point, then the app does not have any memory leaks. But if the memory keeps increasing, it is an indication of a memory leak.

You can debug further by looking at the objects in the memory

bundle exec derailed exec perf:objects 
# OR get a Heap Dump 
bundle exec derailed exec perf:heap

5. Using fasterer gem

fasterer gem is not exactly a monitoring tool, but it will give suggestions on Ruby speed improvements. This is not Rails specific, but generic Ruby.

Sample output of the fasterer gem.

There is also a fast-ruby repo, which has benchmarks of fast and slow Ruby code.

6. Using bullet gem

Eliminating N+1 queries can improve the application speed drastically.
 Use the bullet gem to identify and remove N+1 queries.

7. Newrelic Agent

The developer panel of Newrelic has been removed in the newer editons of the gem. 
 For viewing this an old gem version '~> 4.0.0' has to be used.

gem 'newrelic_rpm', '4.0.0.332'

If you found this article useful, please click on the 👏 button a few times to make others find the article and show your support!

Originally published at blog.hash32.com on March 6, 2019. Credits: Header photo by Markus Spiske on Unsplash.