Debugging and Profiling Rails AppDavid Paluy January 2013
Ruby is eating RAM
Agenda
Winter is coming! Garbage Collector Debug Tools Profiling Tools
The Task: Send ~30,000 e-mails
Result Before
How Ruby Works?Physical RAM
Process Heap
Ruby HeapRuby Object Ruby Object Ruby Object Ruby Object Ruby Object Ruby Object
Ruby Heap
New Object allocationFree ListA L L O C A T E D
F R E E
New Object allocationFree ListA L L O C A T E D
New Object allocationFree List is emptyA L L O C A T E D
New Object allocationFree List is empty Call GCA L L O C A T E D
GC Process
GC finds non-reachable objects and adds them to Free List If Free List is still empty, another Heap allocated
MRI GC
Conservative: any bit pattern could be a pointer (may produce false positive) Stop the world: no other Ruby code can execute during GC Mark & Sweep: mark all objects in use, than sweep away unmarked objects
More Objects => Longer GC => Slow
In our case Out of Memory!
How to Debug?
gem "pry-debugger" https://github.com/nixme/pry-debugger gem "debugger-pry" https://github.com/pry/debugger-pry
Tools
ObjectSpace.count_objects GC debug - Enable heap dump support gdb.rb (only Linux) Note: memprof works only with Ruby 1.8
ObjectSpace.count_objects
Enable heap dump support to RubyInstall custom patched version of ruby
Usage:
https://github.com/tmm1/gdb.rbAttached to existing process and examine the HEAP
Result After
Profiling Tools
Ruby Benchmark ruby-prof perftools.rb (Google perftools for Ruby)
Benchmark
gem 'benchmark_suite'https://github.com/evanphx/benchmark_suite
ruby-profgem 'ruby-prof' https://github.com/rdp/ruby-prof
ruby-prof Measurements
process time (RubyProf::PROCESS_TIME) wall time (RubyProf::WALL_TIME) cpu time (RubyProf::CPU_TIME) object allocations (RubyProf::ALLOCATIONS) memory usage (RubyProf::MEMORY) garbage collections runs (RubyProf::GC_RUNS) garbage collection time (RubyProf::GC_TIME)
perftools.rb https://github.com/tmm1/perftools.rbgem 'rack-perftools_profiler', :require => 'rack/perftools_profiler'
rack-perftools_profiler usage
KCacheGrind
Summary
More Objects => Longer GC => Slow Examine your HEAP Use Tools
Q&Ahttp://dpaluy.github.com @dpaluy [email protected] http://www.linkedin.com/in/davidpaluy
Top Related