rails performance tuning
DESCRIPTION
Rails Performance Tuning. Given at in August 2011.TRANSCRIPT
![Page 1: Rails Performance Tuning](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/1.jpg)
Rails Performance Tuning
Steven Soroka and Burke Libbey
Wednesday, 23 November, 11
![Page 2: Rails Performance Tuning](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/2.jpg)
Overview
• Database performance problems
• (basic) Caching
• Application performance
• Helpful tools
Wednesday, 23 November, 11
![Page 3: Rails Performance Tuning](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/3.jpg)
Database performance
Wednesday, 23 November, 11
![Page 4: Rails Performance Tuning](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/4.jpg)
The two big offenders
• n+1 queries
• missing indexes
Wednesday, 23 November, 11
![Page 5: Rails Performance Tuning](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/7.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/9.jpg)
Caching
• memoization
• fragment caching
• action caching
• page caching
• others...
Wednesday, 23 November, 11
![Page 10: Rails Performance Tuning](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/13.jpg)
Don’t be Stupid
Wednesday, 23 November, 11
![Page 14: Rails Performance Tuning](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/17.jpg)
Background Jobs
• Delayed::Job (db-driven, slowish)
• Resque (Redis-driven, fast)
Wednesday, 23 November, 11
![Page 18: Rails Performance Tuning](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/19.jpg)
Rack::Bug• Handy toolbar for devmode
• https://github.com/brynary/rack-bug
Wednesday, 23 November, 11
![Page 20: Rails Performance Tuning](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/20.jpg)
Rack::Perftools
• Demo!
Wednesday, 23 November, 11
![Page 21: Rails Performance Tuning](https://reader033.vdocuments.mx/reader033/viewer/2022042813/5403a7868d7f72444d8b48b5/html5/thumbnails/21.jpg)
Questions?
Wednesday, 23 November, 11