Rails Performance Tuning

21
Rails Performance Tuning Steven Soroka and Burke Libbey Wednesday, 23 November, 11

description

Rails Performance Tuning. Given at in August 2011.

Transcript of Rails Performance Tuning

Page 1: Rails Performance Tuning

Rails Performance Tuning

Steven Soroka and Burke Libbey

Wednesday, 23 November, 11

Page 2: Rails Performance Tuning

Overview

• Database performance problems

• (basic) Caching

• Application performance

• Helpful tools

Wednesday, 23 November, 11

Page 3: Rails Performance Tuning

Database performance

Wednesday, 23 November, 11

Page 4: Rails Performance Tuning

The two big offenders

• n+1 queries

• missing indexes

Wednesday, 23 November, 11

Page 5: Rails Performance Tuning

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

Page 6: Rails Performance Tuning

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

Page 7: Rails Performance Tuning

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

Page 8: Rails Performance Tuning

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

Page 9: Rails Performance Tuning

Caching

• memoization

• fragment caching

• action caching

• page caching

• others...

Wednesday, 23 November, 11

Page 10: Rails Performance Tuning

Memoization

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

• ActiveSupport::Memoizable is deprecated. :(

Wednesday, 23 November, 11

Page 11: Rails Performance Tuning

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

Page 12: Rails Performance Tuning

Application Performance

• Object allocations

• Tuning the GC

• Background jobs

• Avoid disk access at all costs

• Don’t be stupid

Wednesday, 23 November, 11

Page 13: Rails Performance Tuning

Don’t be Stupid

Wednesday, 23 November, 11

Page 14: Rails Performance Tuning

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

Page 15: Rails Performance Tuning

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

Page 16: Rails Performance Tuning

Avoid Disk Access

L1 Cache 3

L2 14

RAM 250

Disk 41,000,000

Network 240,000,000

Wednesday, 23 November, 11

Page 17: Rails Performance Tuning

Background Jobs

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

• Resque (Redis-driven, fast)

Wednesday, 23 November, 11

Page 18: Rails Performance Tuning

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

Page 19: Rails Performance Tuning

Rack::Bug• Handy toolbar for devmode

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

Wednesday, 23 November, 11

Page 20: Rails Performance Tuning

Rack::Perftools

• Demo!

Wednesday, 23 November, 11

Page 21: Rails Performance Tuning

Questions?

Wednesday, 23 November, 11