Rails Performance Tuning

Preview:

DESCRIPTION

Rails Performance Tuning. Given at in August 2011.

Citation preview

Rails Performance Tuning

Steven Soroka and Burke Libbey

Wednesday, 23 November, 11

Overview

• Database performance problems

• (basic) Caching

• Application performance

• Helpful tools

Wednesday, 23 November, 11

Database performance

Wednesday, 23 November, 11

The two big offenders

• n+1 queries

• missing indexes

Wednesday, 23 November, 11

n+1 queries

• Rails makes it easy to fall into this trap.

• @users = User.where(...)

• @users.each { |u| u.posts.... }

• Use #includes to fix

Wednesday, 23 November, 11

Missing indexes

• Databases are not magic

• Rule of thumb: If you’re searching/sorting by a column, index it.

• This includes (especially!) foreign keys

• Cardinality

Wednesday, 23 November, 11

Other database tweaks• composite indexes

• primary key range instead of limit/offset

• explain & force index

• avoiding subselects

• carefully sizing columns

• using NOT NULL / :null => false

• INSERT faster than UPDATE

Wednesday, 23 November, 11

Also Handy:

• IdentityMap (Rails 3.1)

• config.active_record.identity_map = true

• IdentityMap is disabled by default and still in development

• use with care

Wednesday, 23 November, 11

Caching

• memoization

• fragment caching

• action caching

• page caching

• others...

Wednesday, 23 November, 11

Memoization

• For expensive method calls with a finite set of return values

• ActiveSupport::Memoizable is deprecated. :(

Wednesday, 23 November, 11

Fragment Caching

• http://guides.rubyonrails.org/caching_with_rails.html

• config.action_controller.perform_caching = true

• <% cache ‘slow_view’ do %> ... <% end %>

• expire_fragment('slow_view')

Wednesday, 23 November, 11

Application Performance

• Object allocations

• Tuning the GC

• Background jobs

• Avoid disk access at all costs

• Don’t be stupid

Wednesday, 23 November, 11

Don’t be Stupid

Wednesday, 23 November, 11

Object Allocations

• Ruby’s Garbage Collector is BAD.

• Don’t create objects you don’t need

• Reuse objects to save mem alloc?

Wednesday, 23 November, 11

Tuning the GC

• Use REE.

• Use these settings:

• https://gist.github.com/841168

RUBY_HEAP_MIN_SLOTS=500000RUBY_HEAP_SLOTS_INCREMENT=250000RUBY_HEAP_SLOTS_GROWTH_FACTOR=1RUBY_GC_MALLOC_LIMIT=50000000

Wednesday, 23 November, 11

Avoid Disk Access

L1 Cache 3

L2 14

RAM 250

Disk 41,000,000

Network 240,000,000

Wednesday, 23 November, 11

Background Jobs

• Delayed::Job (db-driven, slowish)

• Resque (Redis-driven, fast)

Wednesday, 23 November, 11

Tools

• rack-bug

• rack-perftools

• NewRelic RPM

• ...and many more: lsof, tcpdump, strace, ltrace, rbtrace, perftools, perftools.rb, gdb, gdb.rb, memprof, memprof.com, hotspots..

Wednesday, 23 November, 11

Rack::Bug• Handy toolbar for devmode

• https://github.com/brynary/rack-bug

Wednesday, 23 November, 11

Rack::Perftools

• Demo!

Wednesday, 23 November, 11

Questions?

Wednesday, 23 November, 11

Recommended