【发布时间】:2013-09-21 14:11:00
【问题描述】:
我正在尝试提高我在 Heroku 上托管的预测试版 Rails 3.2 应用的性能。
积极的缓存已经显着改善了一些事情,但是当我在 New Relic 上查看我的应用服务器响应时间时,我仍然注意到“在 Ruby 中花费的时间”做出了很大贡献(图表上的浅蓝色)。
Rails 应用程序的哪些部分通常会促成这个“Ruby 时间”?
我最初认为这是由于我的一个主控制器中的复杂条件造成的,但已经简化了这一点。我的视图现在使用俄罗斯娃娃片段缓存和内存缓存非常积极地缓存(哇!)。
提供静态资产会是一个原因吗? (迁移到 S3 / CloudFont 已在待办事项列表中......)
谢谢!
(我已经设置了delayed_job,并将所有我能做的都移到了后台。我还使用Unicorn 作为我的网络服务器。)
更新的性能调整
在积极缓存之后,我开始寻找其他方法来提高应用性能。
首先我建议添加垃圾收集监控,发现 GC 对 Ruby 时间没有显着贡献。
接下来,我决定通过添加 CDN(Cloudfront 通过 CDNsumo 插件)来提供资产服务。有趣的是,这确实减少了我在 NR 监控上的 Ruby 时间。 (CDN 是由下图最右侧的最后一个请求测试提供的,然后被加热。)我的大多数页面都有几百 kb 的 css 和 javascript - 所以不是很小但不是很大。
最后,我从“Basic”入门数据库升级到最小的生产数据库“Crane”。这对性能产生了戏剧性的影响。经过 PG 的一点缓存后,应用程序飞起来了。 (下图中的最后 3 个请求峰值)。
为尝试调整 Heroku 应用程序的其他人带回家消息:
- 在多个领域(即缓存、CDN、数据库、Ruby 代码)进行简单的性能调整可以在整个堆栈中产生协同效应。
- 相反,任何单一的性能消耗都将成为您无法克服的瓶颈,即使您调整其他区域(即 Heroku 上的慢速启动 Basic 或 Dev 数据库与“昂贵”的生产数据库 - 慢速 Basic db 正在扼杀我的应用性能)。
- NewRelic 是确定在哪里可以获得最大收益的关键。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 performance heroku newrelic