为生产调整 Rails 性能?

2023-12-24

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

在本地测试时,我看到类似的结果,这确实表明这是一个应用程序问题。

我正在运行 Unicorn,它比 Celadon Cedar 上的 Thin 快大约 40%。此外,我正在使用 PGSQL 共享数据库。

我希望有人可以分享一个详细清单或本质上是一个启动清单,当我准备应用程序进行生产并进入速度调整的需要时,我应该完成这些清单。到目前为止我已经not找到了一个真正简洁的可操作项目列表,考虑到我的情况,这似乎是有意义的。

或者,如果您有解决此类问题的丰富实践经验,我们将不胜感激!


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

当我运行 ab -n 300 -c 75 ...myapp.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 清单:

  1. 首先测量浏览器/页面加载时间(浏览器发出大量请求,ab仅告诉您其中一个,通常您的主页请求不是问题),从诸如此类的工具获取页面加载基线数字www.webpagetest.org http://www.webpagetest.org or www.gtmetrix.com http://www.gtmetrix.com对于面向公众的页面,或者浏览器工具 Yslow、google page speed 或 dynatrace 对于私人页面。如果您查看页面加载瀑布图(chrome/firefox 中的“Net”面板),它通常会显示您的 html 加载速度很快(不到一秒),但其他所有内容都需要 1-3 秒才能加载。遵循 Yslow/page speed 关于如何改进的建议(确保您充分使用 Rails 3.1 资产管道内容)

  2. 通读您的日志文件/新遗物,找到“最慢/最频繁命中”请求的最佳点,并分析该请求发生的情况(是缓慢的 ruby​​/大量内存使用,还是大量查询?)您需要有一种可靠的方法来检测和监控性能问题,而不是随意改变。确定一些目标区域后,创建测试脚本以帮助进行测试前/测试后并证明您的更改有帮助,并检测是否出现回归。

  3. 数据库列缺乏索引是最常见的问题之一,也是最容易解决的问题。对目标查询运行解释,或者查看慢速查询日志,以了解查询规划器正在做什么。根据需要添加外键、搜索列或主数据(覆盖索引)的索引。用实际生产数据重新测试,以证明它有所作为。 (您可以在heroku中运行解释,以及对丢失或未使用的索引运行查询)

  4. 大多数性能不佳的 Rails 应用程序都会遭受 N+1 查询的困扰,因为编写 order.owner.address.city 非常容易,而不会考虑在循环中会发生什么。 N+1 查询不一定是慢查询,因此它们不会出现在慢查询日志中,只是数量较多,一次性完成效率更高。使用 :include 或 .includes() 来立即加载该数据,或者考虑以其他方式进行查询。

  5. 分析应用程序的流程并寻找缓存机会。如果用户在索引页面和详细信息页面之间来回跳动,然后再次返回,也许在不离开索引页面的情况下使用 ajax 详细信息视图会以更快的方式为他们提供所需的数据。我写了一些关于我的博客的更多想法 http://www.railsperformance.com/2011/10/improving-application-performance-by.html

我在今年芝加哥的 WindyCityRails 会议上介绍了这些技术和其他想法。你可以请观看我的 www.RailsPerformance.com 博客上的视频 http://www.railsperformance.com/2011/11/performance-tuning-tutorial-video-2011.html我喜欢 Heroku 的一点是,你必须从一开始就具有可扩展性。当您查看邮件列表上的讨论时,您会发现大多数人都了解性能最佳实践以及如何充分利用服务器。我也喜欢你,如果你想保持便宜,你可以学习性能调整技巧,让你获得最大的收益。

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为生产调整 Rails 性能? 的相关文章

  • 使用复选框过滤列表

    我有一个电影列表及其评级 在我的页面顶部 我有一个表单 其中提供了一个复选框列表 其中显示了每个可用的评级 G PG 13 等 一旦用户单击复选框并点击提交 我只想显示所选的电影 在我的索引方法中 我有一个名为的实例变量 filtered
  • Rails 3 Mechanize - SocketError:getaddrinfo:主机或名称未知

    我正在使用 mechanize 但出现此错误 有人可以帮帮我吗 我已将元刷新设置为 true 错误日志 SocketError getaddrinfo Host or name not known form C Ruby192 lib ru
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • 用户登录时的 Postgresql 触发器

    我正在尝试找出一种方法来了解用户何时登录 Postgres 数据库 有没有办法定义用户登录数据库时触发的触发器 或者是否有一个表或系统视图在任何人登录数据库时都会更新 登录钩子 https github com splendiddata l
  • 如何在服务调用后检查 rspec 中的数组更改?

    目标很简单 例如我们有一个数组 name ghost state rejected name donkey state rejected 运行服务调用后UpdateAllUsers 这会将所有用户更改为 accepted name ghos
  • Rails 3.1+ 的 Jasmine 与 Mocha JavaScript 测试 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对茉莉花有经验并且非常喜欢它 有谁有 Jasmine 和 Mocha 的经验 特别是 Rails 的经验吗 我想知道是否值得转用 我已经在 J
  • 在 PostgreSQL 中使用月份名称排序

    我有一个表 其中有一个字段 Month Name 它包含月份的名称 我想按月份名称排序 不是按字母顺序 而是按实际顺序 例如一月 二月等 如何使用 PostgreSQL 实现此操作 有什么方法可以将月份名称转换为其数值吗 id billed
  • 未能将一些参考推送至 [email protected]

    当我尝试推送到 Heroku 存储库时收到此错误 我已经设置了autocrlf false在gitconfig中 但这个问题仍然存在 我也尝试过这个解决方案here https stackoverflow com questions 566
  • 主页的 RefineryCMS 路线不起作用

    刚刚开始使用RefineryCMS 抱歉新手问题 它在本地运行良好 并幸运地部署在 Heroku Cedar 堆栈上 创建了一个名为 主页 的页面 pages home 响应良好 路线 rb root to gt pages home 并在
  • Capybara-webkit 无法处理与 bootstrap glyphicon 的链接

    我有一个链接 link to q span class glyphicon glyphicon trash span html safe feed item data confirm Are you sure toggle tooltip
  • Rails - 安装 Spree 时出现问题

    我在 Rails 应用程序中安装 Spree 时遇到问题 当我运行 gem spree 时 按照说明http spreecommerce com documentation getting started html http spreeco
  • PESSIMISTIC_WRITE 是否锁定整个表?

    只是为了确保我正确理解事情是如何运作的 If I do em lock employee LockModeType PESSIMISTIC WRITE 它会仅阻止该实体吗 employee 或整个表Employees 如果重要的话 我正在谈
  • 无法使用 Rails 6 Actiontext 渲染 youtube 嵌入 iframe

    我已经设置了一个自定义嵌入模型 这样我就可以将 Instagram 或 YouTube 嵌入等内容添加到我网站上的 ActionText 内容中 它适用于 Instagram 嵌入 但不适用于 YouTube 作为参考 我要显示的 yout
  • puma systemd 脚本无法启动 puma

    我已经从多个来源复制并粘贴了以下美洲狮系统启动脚本的片段 但它不起作用 系统是Debian 9 6 用户rails红宝石通过安装rvm 用户rails可以启动命令RAILS ENV production bundle exec puma C
  • 执行带有 EXCEPTION 的 PostgreSQL 查询会导致两条不同的错误消息

    我有一个 PostgreSQL 查询 其中包含事务和列重复时的异常 BEGIN ALTER TABLE public cars ADD COLUMN top speed text EXCEPTION WHEN duplicate colum
  • 使用间隔阈值对不同的连续时间戳记录进行分组

    我有一系列间歇性间隔的带有时间戳的 GPS 坐标 我正在使用 PostGIS 将它们渲染到地图画布上 为了渲染它们 需要使用 PostGIS 中的 ST MakeLine 聚合函数将点聚合成线 从而在地图上留下 GPS 数据丢失的间隙 数据
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • Rails 3.1 中何时将图像放入 app/assets 以及何时放入 /public/images?

    我仍然不太明白 在这种情况下 在 Rails 3 1 中将图像放在哪里 图像被处理 例如通过回形针或蜻蜓 并存储在文件夹中 不使用像 s3 这样的外部服务 f e 在开发中 当我只有图像时 我将在样式表中使用它 例如背景 图标 AppSto
  • rspec 中的模拟方法链

    有一系列方法可以获得user目的 我试图模拟以下内容以返回user in my Factory Girl current user AuthorizeApiRequest call request headers result 我可以模拟该
  • 升级到 Rails 6 时是否有一种编程方法可以检测 Zeitwerk::NameError?

    我目前正在将旧的 Rails 应用程序迁移到 Rails 6 好像项目中有些文件和里面定义的类不一致 运行应用程序测试时我没有看到此错误 但部署后我收到如下错误 Zeitwerk NameError expected file app my

随机推荐