4. The two big offenders
• n+1 queries
• missing indexes
Wednesday, 23 November, 11
5. 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
6. 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
7. 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
8. 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
10. Memoization
• For expensive method calls with a finite set
of return values
• ActiveSupport::Memoizable is deprecated. :(
Wednesday, 23 November, 11
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
12. Application Performance
• Object allocations
• Tuning the GC
• Background jobs
• Avoid disk access at all costs
• Don’t be stupid
Wednesday, 23 November, 11
14. 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
15. Tuning the GC
• Use REE.
• Use these settings:
• https://gist.github.com/841168
RUBY_HEAP_MIN_SLOTS=500000
RUBY_HEAP_SLOTS_INCREMENT=250000
RUBY_HEAP_SLOTS_GROWTH_FACTOR=1
RUBY_GC_MALLOC_LIMIT=50000000
Wednesday, 23 November, 11
16. Avoid Disk Access
L1 Cache 3
L2 14
RAM 250
Disk 41,000,000
Network 240,000,000
Wednesday, 23 November, 11