Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Profiling and monitoring        ruby/rails        JÁN SUCHAL         @JSUCHAL
Optimalization “If you can’t measure it, you can’t improve it.” – Lord Kelvin Environment   development vs. production ...
Profiler - Example# profiler/dates.rbrequire datedef create_days_after(date_str, n)  after = Date.strptime(date_str) + n  ...
Ruby Profiler $ gem install ruby-prof $ ruby-prof dates.rb   How long does each method take? $ ruby-prof dates.rb –m 3...
Ruby ProfilerThread ID: 7749480Total: 0.653076%self     total      self    wait   child    calls   name12.97      0.19    ...
Ruby Profiler $ ruby-prof dates.rb -m 3 -p graph   Which method calls what and how many times?Thread ID: 15523700Total T...
Ruby ProfilerThread ID: 15523700Total Time: 0.675587048%total    %self    total   self    wait   child           calls   N...
Ruby Profiler $ ruby-prof dates.rb -p graph_html -m 3 > graph.html $ ruby-prof dates.rb -p graph_html -m 3 –s self > gra...
Profiler - KCacheGrind $ ruby-prof dates.rb -p call_tree -m 3 > dates1.grind $ kcachegrind dates1.grind
benchmark-ips require   benchmark/ips require   ostruct require   hashr require   hashugar SMALL_HASH = {:a => 1, :b => 2}...
Memory profiling Patched ruby $ rvm install 1.9.3 --patch railsexpress --name gc $ ruby-prof --mode=allocations dates.r...
Rails / NewRelic Developer mode gem newrelic_rpm‘ http://localhost:3000/newrelic gem newrelic_rpm, git: git://github.co...
NewRelic Developer mode
Rails / NewRelic Developer mode
NewRelic Developer mode
NewRelic Developer mode Profiler
Custom Method Tracers# initializers/elastic_search_traces.rbrequire new_relic/agent/method_tracer‘ElasticSearch.class_eval...
NewRelic Production Monitoring Web Transactions – controller actions drilldown Transaction Traces – detailed slow reques...
Error tracking ExceptionNotifier www.airbrake.io
Most common performance problems “1 + N query problem”   joins FTW! Lack of proper indexing Unnecessary ActiveRecord l...
Profiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applications
Prochain SlideShare
Chargement dans…5
×

Profiling and monitoring ruby & rails applications

5 067 vues

Publié le

Publié dans : Technologie
  • Soyez le premier à commenter

Profiling and monitoring ruby & rails applications

  1. 1. Profiling and monitoring ruby/rails JÁN SUCHAL @JSUCHAL
  2. 2. Optimalization “If you can’t measure it, you can’t improve it.” – Lord Kelvin Environment  development vs. production (hw, sw, load)  data (synthetic vs. real) Bottlenecks  10sec * 1 run vs. 0.5s * 100 runs  run time * runs vs. development time Microbenchmarks  waste of time vs. 20 * 1% = 20% “There are three kinds of lies: lies, damned lies, and statistics.” – Benjamin Disraeli  single run vs. multiple runs  average vs. standard deviance, percentiles  cold vs. hot cache
  3. 3. Profiler - Example# profiler/dates.rbrequire datedef create_days_after(date_str, n) after = Date.strptime(date_str) + n after.strftime("%Y-%m-%d")end1000.times do create_days_after("1982-10-27", 5)end
  4. 4. Ruby Profiler $ gem install ruby-prof $ ruby-prof dates.rb  How long does each method take? $ ruby-prof dates.rb –m 3  Just methods above 3% time Thread ID: 7749480 Total: 0.653076 %self total self wait child calls name 12.97 0.19 0.08 0.00 0.18 2000 String#scan 11.57 0.08 0.08 0.00 0.00 205000 String#=== 6.87 0.18 0.04 0.00 0.14 1000 String#gsub 6.28 0.05 0.04 0.00 0.01 14000 Hash#values_at 4.08 0.03 0.03 0.00 0.00 80470 Hash#default 3.21 0.03 0.02 0.00 0.01 3000 Date#emit
  5. 5. Ruby ProfilerThread ID: 7749480Total: 0.653076%self total self wait child calls name12.97 0.19 0.08 0.00 0.18 2000 String#scan11.57 0.08 0.08 0.00 0.00 205000 String#=== 6.87 0.18 0.04 0.00 0.14 1000 String#gsub 6.28 0.05 0.04 0.00 0.01 14000 Hash#values_at 4.08 0.03 0.03 0.00 0.00 80470 Hash#default 3.21 0.03 0.02 0.00 0.01 3000 Date#emit total – time in method and children calls self – time in method call wait – wait time child – time in child calls call – number of times method invoked
  6. 6. Ruby Profiler $ ruby-prof dates.rb -m 3 -p graph  Which method calls what and how many times?Thread ID: 15523700Total Time: 0.675587048%total %self total self wait child calls Name 0.20 0.10 0.00 0.20 2000/2000 <Class::Date>#_strptime_i30.28% 14.70% 0.20 0.10 0.00 0.20 2000 String#scan 0.04 0.04 0.00 0.00 110000/205000 String#=== 0.02 0.01 0.00 0.01 3000/5000 Date::Format::Bag#method_... 0.02 0.00 0.00 0.01 2000/3005 Class#new 0.01 0.01 0.00 0.00 5000/5000 String#sub! 0.01 0.00 0.00 0.01 2000/2000 Range#=== 0.00 0.00 0.00 0.00 3000/3000 String#to_i 0.00 0.00 0.00 0.00 2000/2000 <Class::Regexp>#quote 0.00 0.00 0.00 0.00 2000/2000 Regexp#=== 0.00 0.00 0.00 0.00 1000/1000 <Class::Date>#num_pattern? 0.00 0.00 0.00 0.00 1000/2000 <Class::Date>#_strptime_i
  7. 7. Ruby ProfilerThread ID: 15523700Total Time: 0.675587048%total %self total self wait child calls Name 0.20 0.10 0.00 0.20 2000/2000 <Class::Date>#_strptime_i30.28% 14.70% 0.20 0.10 0.00 0.20 2000 String#scan 0.04 0.04 0.00 0.00 110000/205000 String#=== 0.02 0.01 0.00 0.01 3000/5000 Date::Format::Bag#method_.. three parts  parent calls  method  children calls calls – number of calls from method/total number of calls
  8. 8. Ruby Profiler $ ruby-prof dates.rb -p graph_html -m 3 > graph.html $ ruby-prof dates.rb -p graph_html -m 3 –s self > graph.html
  9. 9. Profiler - KCacheGrind $ ruby-prof dates.rb -p call_tree -m 3 > dates1.grind $ kcachegrind dates1.grind
  10. 10. benchmark-ips require benchmark/ips require ostruct require hashr require hashugar SMALL_HASH = {:a => 1, :b => 2} Benchmark.ips do |x| x.report OpenStruct create small hash and access once, OpenStruct.new(SMALL_HASH).item5 x.report Hashr create small hash and access once, Hashr.new(SMALL_HASH).item5 x.report Hashugar create small hash and access once, Hashugar.new(SMALL_HASH).item5‘ endOpenStruct create small hash and access once 43858.0 (±5.5%) i/s - 221820 in 5.074250s (cycle=3697)Hashr create small hash and access once 67408.9 (±5.0%) i/s - 339780 in 5.053728s (cycle=5663)Hashugar create small hash and access once 230217.9 (±4.2%) i/s - 1152670 in 5.015705s (cycle=15790)
  11. 11. Memory profiling Patched ruby $ rvm install 1.9.3 --patch railsexpress --name gc $ ruby-prof --mode=allocations dates.rb –m 3%self total self wait child calls name59.23 6004.00 6004.00 0.00 0.00 1000 <Class::Date>#strptime 9.87 1000.00 1000.00 0.00 0.00 1000 Date#strftime 9.87 9004.00 1000.00 0.00 8004.00 1000 Object#create_days_after 9.87 1000.00 1000.00 0.00 0.00 1000 Date#+ 9.87 10004.00 1000.00 0.00 9004.00 1 Integer#times
  12. 12. Rails / NewRelic Developer mode gem newrelic_rpm‘ http://localhost:3000/newrelic gem newrelic_rpm, git: git://github.com/jsuchal/rpm.git, branch: feature-profile-sorting
  13. 13. NewRelic Developer mode
  14. 14. Rails / NewRelic Developer mode
  15. 15. NewRelic Developer mode
  16. 16. NewRelic Developer mode Profiler
  17. 17. Custom Method Tracers# initializers/elastic_search_traces.rbrequire new_relic/agent/method_tracer‘ElasticSearch.class_eval do include NewRelic::Agent::MethodTracer add_method_tracer :search, Custom/elasticsearch/search add_method_tracer :index, Custom/elasticsearch/indexend
  18. 18. NewRelic Production Monitoring Web Transactions – controller actions drilldown Transaction Traces – detailed slow requests Slow SQL – slow queries Background job monitoring Availabality monitoring Deployment tracking Scalability analysis ... Server monitoring (load, disks, …)
  19. 19. Error tracking ExceptionNotifier www.airbrake.io
  20. 20. Most common performance problems “1 + N query problem”  joins FTW! Lack of proper indexing Unnecessary ActiveRecord loading  e.g. count vs. size vs. length Default GC parameters  37signals params  RUBY_HEAP_MIN_SLOTS=600000 # This is 60(!) times larger than default  RUBY_GC_MALLOC_LIMIT=59000000 # This is 7 times larger than default  RUBY_HEAP_FREE_MIN=100000 # This is 24 times larger than default Unknown abstraction internals  e.g. OpenStruct

×