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

Rails Performance Tuning

Embed Size (px)

DESCRIPTION

Rails Performance Tuning. Given at in August 2011.

Citation preview

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