应用程序加速Ruby on Rails

时间:2012-02-03 09:40:03

标签: ruby-on-rails

我有一个控制器动作需要10秒才能运行。大部分时间都花在一个大文件的视图中(超过1500行)。我该如何调试速度问题?

4 个答案:

答案 0 :(得分:3)

Yuo可以试试NewRelic。我几年前使用过免费版本,你可以看到整体性能,尤其是慢速通话 据我所知,你只需要安装一个宝石,配置一些东西,这样做很好。

答案 1 :(得分:2)

Ruby和Rails拥有可以帮助您的基本分析工具。看看这个Rails指南:Performance Testing Rails Applications

该页面描述了如何编写用于基准测试的测试用例,以防止性能下降以及如何进行性能分析,这可能很简单:

rails profiler 'Ruby.code.to.run'

如果不适合您,请考虑使用New Relic。但是我也会看看Rack-Bug(顺便说一句,它有一个Rails 3 branch用于Rails 3)。 Rack-Bug是一个调试工具栏,它为您提供了许多关于请求中花费时间的精彩指标,它在浏览器中直接执行,与正常响应一起,因此它是最不痛苦的。

现在,你所做的是错的:

  • 你应该避免胖观点,因为胖观点难以测试,难以调试且难以分析
  • 您应该避免Web进程中代码缓慢,因为它会阻止其他客户端访问您的Web服务器,而是将所有逻辑移出到异步作业队列中

因此,请考虑将此处理移至作业队列中。 Delayed_job非常可靠,维护得当,可以与Rails 3一起使用。

所以你的观点将注册一份新工作并返回。当工作完成后,你会在某个地方设置一个标志。然后通过特殊的API调用,您可以每隔几秒从客户端Javascript检查其完整性。完成后,您可以再次从Javascript中显示结果,重定向或开始下载等等。

如果以上不是一个选项(也许这是一个显示应该是即时报告的页面),您应该考虑的第一个瓶颈是执行的SQL查询,所以熟悉MySQL's DESCRIBE命令(或PostgreSQL's EXPLAIN)。通过这种方式可以轻松查看索引所在的位置。

答案 2 :(得分:2)

NewRelic是分析应用程序的最佳方式。

通过以下几点,您可以修改代码以加速应用程序。

  
      
  • N + 1查询问题
  •   
  • 测试N + 1
  •   
  • 嵌套热切加载
  •   
  • 间接急切加载
  •   
  • Rails分组和汇总计算
  •   

答案 3 :(得分:0)

我建议将视图的一些小部分包装到benchmark块中,并在log / development.log中查看缓慢部分。

<% benchmark "Showing users" do %>
  <!-- ... -->
<% end %>

<% benchmark "Performing some calculations" do %>
  <!-- ... -->
<% end %>

最好的情况是你会找到一些花费90%时间的地方。然后,您可以使用它们来显着提高性能。