Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Improve Rails loading time

This is a bit of a follow-up from a previous question on improving rails console loading time.

The first great suggestion was to figure out which gems take too long.

Next answer, suggested using :require => nil and loading those gems later.

With some gems however, it's not entirely clear how to accomplish this without breaking things. Here's a list of our 'biggest offenders', I wonder if someone can suggest the best approach to loading them only when necessary?

require gon: 2.730000 (2.870059)
require omniauth-openid: 1.410000 (1.503858)
require cancan: 2.640000 (2.707467)
require fog: 2.730000 (2.846530)
require activeadmin: 3.650000 (3.923877)

and of course there are many more that take around 1 second or less, which also adds up... but at least removing the big ones will already improve things.

how can I selectively load gems later to make rails load faster?

like image 242
gingerlime Avatar asked Oct 15 '12 09:10

gingerlime


People also ask

How do you avoid N 1 queries Activerecord?

You can avoid most n+1 queries in rails by simply eager loading associations. Eager loading allows you to load all of your associations (parent and children) once instead of n+1 times (which often happens with lazy loading, rails' default). As seen above, . includes allows nested association eager loading!

Is Ruby on Rails slow?

Despite its numerous advantages, Ruby on Rails is still considered to be a relatively slow web framework.

What is N 1 query problem rails?

The n+1 query problem is one of the most common scalability bottlenecks. It involves fetching a list of resources from a database that includes other associated resources within them. This means that we might have to query for the associated resources separately.


1 Answers

While not a direct answer to your question, there are two things you might try:

First, have you tried the Falcon patches for 1.9.3? The patches include some pretty significant load time improvements.

If you're using RVM, you can do a quick-and-dirty install with

rvm install 1.9.3 --patch falcon -n falcon

Second, make sure you're setting GC tuning environment variables. Ruby, by default, allocates GC parameters that are appropriate for small scripts, but not for full Rails apps. Here are my settings, though you'd want to derive your own based on your application's needs:

% env | grep RUBY_
RUBY_HEAP_MIN_SLOTS=800000
RUBY_HEAP_FREE_MIN=100000
RUBY_HEAP_SLOTS_INCREMENT=300000
RUBY_HEAP_SLOTS_GROWTH_FACTOR=1
RUBY_GC_MALLOC_LIMIT=79000000

And my results using ruby 1.9.3-p286:

                    Stock     Stock+GC  Falcon   Falcon+GC
                    27.13     8.43      8.63     6.69
Stock       27.13   100.00%   31.07%    31.81%   24.66%
Stock+GC    8.43    321.83%   100.00%   102.37%  79.36%
Falcon      8.63    314.37%   97.68%    100.00%  77.52%
Falcon+GC   6.69    405.53%   126.01%   129.00%  100.00%

Setting the GC tuning parameters has the biggest improvement, but we can get yet another ~26% improvement performance by using the falcon patches. The combination of the falcon patches plus the GC parameters results in over a 75% reduction in boot time.

like image 173
Chris Heald Avatar answered Oct 31 '22 08:10

Chris Heald