View
1.818
Download
0
Category
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