我即将部署一个基于Rails 3.1的应用程序.并开始运行一些性能测试.在摆弄了一点ab之后,我看到一些非常令人沮丧的结果,在Heroku上每秒产生大约15个请求.

当在本地进行测试时,我看到了类似的结果,这真正证明了这是一个应用程序问题.

我在跑独角兽,它比青瓷雪松上的单薄要快40%.此外,我正在使用PGSQL共享数据库.

我希望有人能分享一份详细 list ,或者基本上是一份发布 list ,我在准备一个应用程序进行生产时,应该仔细阅读这些 list ,并考虑速度调整的需要.到目前为止,我已经找到了一个真正简明的 list ,列出了可以采取行动的项目,考虑到我的情况,这些项目似乎是有意义的.

或者,如果您有处理此类问题的扎实实践经验,欢迎提供任何意见!

推荐答案

我花了一些时间在heroku上调整我的应用程序,并花了一些时间在各种设置下调整Rails应用程序的性能.

当我运行ab-N300-C75...我的apply.com…#这是我的主站点的备份,在unicorn的免费cedar计划中

Requests per second:    132.11 [#/sec] (mean)
Time per request:       567.707 [ms] (mean)
Time per request:       7.569 [ms] (mean, across all concurrent requests)

(这是针对一个不做任何激烈事情的主页,所以我只提供了一个"heroku能以多快的速度进入一个非常简单的页面的免费计划?"例如,不是"你的应用程序应该这么快")

以下是我的Rails性能调优101 list :

  1. 首先测量浏览器/页面加载时间(浏览器发出很多请求,ab只告诉你其中一个,通常你的主页请求不是问题),从面向公众的页面的www.webpagetest.orgwww.gtmetrix.com等工具获取页面加载基线数,或从面向私有页面的浏览器工具Yslow、google page speed或dynatrace获取页面加载基线数.如果你查看页面加载瀑布图(chrome/firefox中的"Net"面板),它通常会显示你的html加载速度很快(不到一秒),但其他所有内容都需要1-3秒才能加载.按照Yslow/page speed的建议进行改进(确保充分使用Rails 3.1assets资源 管道)

  2. 阅读你的日志(log)文件/new relic,找到"最慢/最频繁点击"请求的最佳点,并分析该请求会发生什么(是ruby速度慢/大量使用mem,还是大量查询?)你需要有一种可靠的方法来检测和监控性能问题,而不是随意改变.一旦确定了一些目标区域,创建测试脚本来帮助测试之前/之后,并证明您的更改有帮助,并检测是否出现了回归.

  3. db列上缺少索引是最常见的问题之一,也是最容易解决的问题.对目标查询运行explain,或查看慢速查询日志(log),查看查询计划器正在做什么.根据需要为外键、搜索列或主数据(覆盖索引)添加索引.用实际生产数据进行重新测试,以证明这是有区别的.(您可以在heroku中运行explain,也可以运行缺少或未使用索引的查询)

  4. 大多数性能不佳的Rails应用程序都会遇到N+1查询,因为它很容易编写顺序.物主住址城市,而不是思考当这是一个循环时会发生什么.N+1查询不一定是慢查询,所以它们不会出现在慢查询日志(log)中,只是有很多查询,而且一次完成所有查询更有效.用法:包括或.includes()用于快速加载该数据,或者以另一种方式执行查询.

  5. 分析应用程序的流程,寻找缓存机会.如果用户在索引页面和详细信息页面之间来回跳转,然后再跳转,那么在不离开索引页面的情况下,可能会出现详细信息的ajax视图,这样可以更快地为用户提供所需的数据.我写了大约more thoughts about that on my blog封信

我在芝加哥今年的WindyCityRails会议上介绍了这些技术和其他 idea .你可以see the video here on my www.RailsPerformance.com blog

祝你好运

Postgresql相关问答推荐

转换失败:(—122.763091,49.04676)转换为地理(位置)""

我无法让pg_cron扩展在最新的Postgres 16图像中工作

Postgresql我必须创建一个索引还是已经有一个索引了?

PostgreSQL\d命令:有办法只 Select 一列吗?

即使不对订阅服务器进行任何修改,Postgres逻辑复制也可能发生冲突吗?

PostgreSQL 不删除旧的 WAL 档案

在特定距离内创建点的唯一索引

无法使用golang在postgresql中使用自定义类型插入/更新数据

我应该使用哪个 postgresql 包?

在postgres的同一列中存储不同数据类型的合理方法?

在 PostgreSQL 中Explain与explain analyze

django.db.utils.IntegrityError:duplicate key value violates unique constraint "django_content_type_pkey"

PostgreSQL:将结果数据从 SQL 查询导出到 Excel/CSV

可以为空的列在 PostgreSQL 中是否会占用额外的空间?

Postgres 中有多少表分区太多了?

pg_restore 会覆盖现有的表吗?

防止 PostgreSQL 中的递归触发器

PostgreSQL regexp_replace() 只保留一个空格

pg_restore 目录错误

在 Postgres 9.0+ 中使用 PL/pgSQL 在表上循环