Workshop Performance Rails

1,266 views

Published on

Slides do Workshop apresentado na Ultramaratona de Software Livre. 07/11/2009

Published in: Technology, Business
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,266
On SlideShare
0
From Embeds
0
Number of Embeds
161
Actions
Shares
0
Downloads
23
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Workshop Performance Rails

  1. 1. Otimizando aplicações rails Client Side & Server Side Vitor Pellegrino Petrobrás Distribuidora @pellegrino http://vp.blog.br
  2. 2. quem? Vitor Pellegrino
  3. 3. quem? Engenheiro de Software Vitor Pellegrino
  4. 4. quem? Engenheiro de Software Petrobrás Distribuidora Vitor Pellegrino
  5. 5. quem? Engenheiro de Software Petrobrás Distribuidora Vitor Pellegrino video.globo.com
  6. 6. quem? Engenheiro de Software Petrobrás Distribuidora Vitor Pellegrino video.globo.com Metodologias Ágeis
  7. 7. quem? Engenheiro de Software Petrobrás Distribuidora Vitor Pellegrino video.globo.com Railer desde 2006 Metodologias Ágeis
  8. 8. quem? Engenheiro de Software Petrobrás Distribuidora #horaextra Vitor Pellegrino video.globo.com Railer desde 2006 Metodologias Ágeis
  9. 9. Agenda • Introdução • Plugins e Libraries • Cache Distribuído • Otimizações built-in do Rails • Links
  10. 10. Introdução
  11. 11. Responsiveness
  12. 12. Responsiveness Quantidade de tempo necessária para se carregar uma página
  13. 13. Como seus usuários enchergam a sua aplicação
  14. 14. Interface Como seus usuários enchergam a sua aplicação
  15. 15. Interface Como seus usuários enchergam a sua aplicação
  16. 16. Interface Mágica Como seus usuários enchergam a sua aplicação
  17. 17. Interface Mágica Como seus usuários enchergam a sua aplicação
  18. 18. Otimização prematura http://www.redbubble.com/people/suranyami/t-shirts/2547056-2-premature-optimization-is-the-root-of-all-evil-donald-knuth
  19. 19. NÃO FAÇA ISSO!
  20. 20. NÃO FAÇA ISSO!
  21. 21. Otimização prematura • Na maioria dos casos você não vai precisar • Otimize baseado em fatos • Analise primeiro • Custo x benefício
  22. 22. http://
  23. 23. Safari
  24. 24. Google chrome
  25. 25. http://www.bombe.tv/blog/wp-content/uploads/2009/07/homer_the_new_fail_whale_by_edwheeler.jpg Rails escala?
  26. 26. describe Rails do context ‘when done correctly’ do it { Rails.should scale } end end
  27. 27. https://www.ravelry.com/
  28. 28. • 10 million requests a day hit Rails (AJAX + RSS + API) • 3.6 million pageviews per day • 2.3 million knitting/ crochet projects, 50,000 new forum posts each day, 19 million forum posts, 13 million private http://highscalability.com/blog/2009/9/22/how-ravelry-scales-to-10-million-requests-using-rails.html
  29. 29. • 10 million requests a day hit Rails (AJAX + RSS + API) • 3.6 million pageviews per day • 2.3 million knitting/ 1 desenvolvedor rails crochet projects, 50,000 new forum posts each day, 19 million forum posts, 13 million private http://highscalability.com/blog/2009/9/22/how-ravelry-scales-to-10-million-requests-using-rails.html
  30. 30. rails tools that help you scale
  31. 31. Ingredients • Git • Rails • Ruby 1.8.x • Firefox • Firebug • YSlow
  32. 32. Ingredients • gem sources -a http:// gems.github.com • sudo gem install gemcutter • sudo gem tumble
  33. 33. Asset Packager • Comprime javascript e CSS em aplicações rails em produção.
  34. 34. Hands on • ./script/plugin install git:// github.com/sbecker/ asset_packager.git • rake asset:packager:create_yml
  35. 35. Sprockets • getsprockets.org • Concatenador e Gerenciador de dependencias javascript • provide • request
  36. 36. Hands on • sudo gem install --remote sprockets • script/plugin install git://github.com/ sstephenson/sprockets-rails.git • edite o config/routes.rb • SprocketsApplication.routes(map)
  37. 37. Tools •Bullet • http://github.com/flyerhzm/bullet/ • Queries N+1 • Queries
  38. 38. Hands on! • Código do blog • Instalar o plugin do bullet • http://github.com/flyerhzm/bullet/ • Simular query N+1 • <%= post.comments.collect(&:author) %> • Simular counter_cache • <%= post.comments.size %>
  39. 39. Bullet • Indica lugares possíveis de otimização • N+1 queries • Counter cache
  40. 40. Rails Indexes • Rails Indexes • http://github.com/eladmeidar/ rails_indexes • Auxilia na criação de índices
  41. 41. Hands on • script/plugin install git://github.com/ eladmeidar/rails_indexes.git • rake db:show_me_a_migration • rake db:show_me_ar_find_indexes
  42. 42. Rails indexes • Índices são muito importantes • ... e muito esquecidos • rake db:show_me_a_migration #ftw
  43. 43. Scrooge • Otimização do SQL gerado pelo rails • Busca apenas as colunas que vão ser usadas. • http://github.com/methodmissing/ scrooge
  44. 44. Hands on • sudo gem install slim_scrooge • # config/environment.rb • config.gem 'slim_scrooge'
  45. 45. Scrooge • Pode representar um ganho muito significativo dependendo das queries • Fire and forget.
  46. 46. Rack-bug • Debug toolbar • http://github.com/brynary/rack-bug • Inspeciona o que está acontecendo durante um request.
  47. 47. Hands on • # config/environments/development.rb • config.middleware.use "Rack::Bug" • script/plugin install git://github.com/brynary/rack-bug.git • http://localhost:3000/__rack_bug__/bookmarklet.html
  48. 48. Rack-bug • Visualização completa do que acontece na aplicação • Depurar memória gasta nos seus processos rails.
  49. 49. Asset Packager e Sprockets • Ganho significativo em performance client-side • Use it now :)
  50. 50. Cache distribuído
  51. 51. Cache distribuído Arquitetura
  52. 52. Cache distribuído • Redução do número de acessos ao banco de dados • Compartilhamento de informações entre instâncias de rails • Funciona como se fosse um hash em memória
  53. 53. Memcached • Cache distribuído open source • Utilizado na maioria dos sites de grande conteúdo • Facil integração com rails.
  54. 54. Hands on • sudo apt-get install memcached • config/environments • config.action_controller.perform_caching = true • config.cache_store = :mem_cache_store • memcached -vv
  55. 55. Hands on • Rails.cache.fetch(“helloworld”) { “Hello world”} • Rails.cache.delete(“helloworld”) • Rails.cache.fetch(@post) { @post }
  56. 56. Memcached • Muito utilizado em aplicações rails • É possível serializar objetos inteiros na memória • Fácil Integração • Escalável por ser distribuído
  57. 57. Otimizações rails built-in
  58. 58. Page Caching
  59. 59. Page Caching • Cache de todo o conteúdo da página • Arquivo estático HTML • Apache (+1000/segundo) • Evita o acesso desnecessário ao servidor
  60. 60. Hands on • caches_page :index • expire_page :action => :index • config/environment.rb • config.action_controller.perform_caching = true • config.action_controller.page_cache_directory = RAILS_ROOT + "/public/cache " # opcional
  61. 61. Page Caching • Conteúdo dinâmico?
  62. 62. Page Caching • Conteúdo dinâmico? Javascript!
  63. 63. Page Caching • def update_status render_inline “hello world” end • <%= link_to_remote “dinamico” , :url => { :action => “update_status”} , :update => {“status” } %>
  64. 64. Page Caching • Use SEMPRE que possível • Cuidado com a expiração do cache • Ainda é possível usar javascript :)
  65. 65. Action Caching
  66. 66. Action Caching • caches_action :edit • expires_action :edit
  67. 67. Action Caching • Quando se deseja utilizar filters • Controle de acesso • Quando não se pode utilizar page caching • Conditional Action Caching • Action Caching without layouts
  68. 68. Fragment Caching
  69. 69. Fragment Caching • Trechos de um layout • Tag Cloud • Recent posts
  70. 70. Fragment Caching • cache(key) do ... end • fragment_exists?(key) • expire_fragment(key)
  71. 71. Fragment Caching • Pedaços da tela • Cuidado para não executar a query ainda que a view esteja cacheada • fragment_exists?
  72. 72. Sweepers
  73. 73. Sweepers • Objeto compartilhado entre os controllers • Centraliza expiração de cache • ActiveRecord observer
  74. 74. Resumo
  75. 75. Built-in Rails • Rails traz muitas possibilidades de otimização por default • Page > Action > Fragment caching • Memcached
  76. 76. Resumo
  77. 77. Não otimize prematuramente
  78. 78. É preciso entender a arquitetura como um todo para se otimizar de maneira eficiente
  79. 79. São as arquiteturas e não as linguagens que são escaláveis.
  80. 80. Sim, Rails escala. :)
  81. 81. Links
  82. 82. http://railslab.newrelic.com/scaling-rails/
  83. 83. http://railscasts.com/tags/1
  84. 84. http://developer.yahoo.com/performance/
  85. 85. http://www.newrelic.com/
  86. 86. Obrigado! Vitor Pellegrino http://vp.blog.br http://www.twitter.com/pellegrino

×