提高rails 3 app的性能:最佳工作流程?

时间:2011-10-21 04:44:31

标签: ruby-on-rails performance ruby-on-rails-3

我想提高应用的性能,并开始阅读http://guides.rubyonrails.org/performance_testing.html。我的问题在这个“我如何开始”的演讲结束时。

所以我用

开始了
class BrowsingTest < ActionDispatch::PerformanceTest
  self.profile_options = { :runs => 5, :metrics => [:wall_time, :process_time],
                       :output => 'tmp/performance', :formats => [:flat] }
  def test_homepage
    get '/'
  end
end

的输出
bundle exec rake test:profile
终端中的

BrowsingTest#test_homepage (909 ms warmup)
           wall_time: 341 ms
        process_time: 517 ms

并在process_time平面文件中,它就像那样开始

Thread ID: 70299857145540
Total: 2.589931

 %self     total     self     wait    child    calls  name
 12.45      0.32     0.32     0.00     0.00      110  BasicObject#method_missing
 10.59      0.28     0.27     0.00     0.01      415  Kernel#raise
  7.79      0.20     0.20     0.00     0.00     1350  <Class::Dir>#[]

不知道该怎么做,我开始寻找使用method_missing的东西。我发现我用来转换指标(Alchemist)的lib就是这样做的,它包含在Numeric类中。

由于主页并不真的需要,我只是删除了lib并重新运行了性能分析测试。 这次我得到以下

BrowsingTest#test_homepage (856 ms warmup)
           wall_time: 321 ms
        process_time: 482 ms

平面文件不再有method_missing

Thread ID: 70185893711560
Total: 2.420023

 %self     total     self     wait    child    calls  name
 12.05      0.29     0.29     0.00     0.00        5  ActionView::Base#helpers
  8.32      0.20     0.20     0.00     0.00     1350  <Class::Dir>#[]
  5.12      0.12     0.12     0.00     0.00     5925  String#gsub

我第二次跑了,得到了

BrowsingTest#test_homepage (856 ms warmup)
           wall_time: 321 ms
        process_time: 482 ms

Thread ID: 70231460630220
Total: 2.411142

 %self     total     self     wait    child    calls  name
 14.18      1.49     0.34     0.00     1.16     3265  Array#each
  8.26      0.20     0.20     0.00     0.00     1350  <Class::Dir>#[]
  4.94      0.12     0.12     0.00     0.00      205  Kernel#caller

因此,似乎不使用该库可节省约35毫秒的处理时间,这似乎与平面文件所说的非常一致。我想我应该尝试对此做些什么,特别是因为它似乎经常因为包含Numeric而被调用。

现在我的问题是:

  • 这是正确的方法吗?有没有更好的方式开始?
  • 确定降低性能的类/方法的最佳方法是什么(对我而言,下一步是使用Dir查找某些内容,但有多个地方使用它)
  • 什么是可接受的处理时间?
  • 我连续几次运行测试:配置文件,“String#gsub”的自我时间从0.04变为0.12。可能会发生什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

我真的不觉得这些页面性能基准测试是必要的。我发现尽早部署并包含某种形式的应用程序监控(如新版本的RPM)非常重要。您可以通过它识别应用程序的所有瓶颈,并在应用程序增长时随着时间的推移进行修复。

答案 1 :(得分:1)

我喜欢你熟悉这些工具以及如何阅读结果。 New Relic是监控这些东西的好工具,但是如果你不想长期支付新的遗物,那么request_log_analyzer也是如此。

  1. 使用Yslow或Page speed来分析整页,而不仅仅是html下载
  2. 优化页面,加载/缓存资源的方式
  3. 找出最慢的动作,弄清楚他们在做什么(慢代码或慢查询?)
  4. 优化查询,在需要时添加索引,缓存数据
  5. 删除或更新旧库
  6. 离线昂贵的流程(后台,cron作业等)
  7. 调整你的架构(你不需要任何Rails,跳上jruby并利用强大的java库,线程和运行时)。
  8. 监控非常重要,因此您可以了解问题何时出现

    -John McCaffrey