【问题标题】:How do I figure out why my rails 3 app, using mod_rails, is so slow?我如何弄清楚为什么我的 rails 3 应用程序使用 mod_rails 这么慢?
【发布时间】:2011-05-14 02:23:05
【问题描述】:

我使用 Rails 3.0.0 和 Ruby 1.9.2 开发了一个小型 Rails 应用程序。在测试过程中,在我的个人电脑上,它的性能很好。我把它放在我的 VPS 上进行生产,使用 Apache 和 mod_rails,有时性能很糟糕。

这是来自 production.log 的示例:

于 2010 年 11 月 21 日 21:49:56 -0500 开始为 XX.XX.XX.XX 获取“/tracker”
FleetsController#index 处理为 HTML
渲染布局/_stylesheets.html.haml (0.8ms)
渲染布局/_header.html.haml (1.0ms)
渲染布局/_footer.html.haml (0.0ms)
在布局/应用程序中渲染页面/about.html.haml (4.5ms)
在 15 毫秒内完成 200 次 OK(查看次数:14.3 毫秒 | ActiveRecord:0.0 毫秒)

于 2010 年 11 月 21 日 21:50:02 -0500 开始为 XX.XX.XX.XX 获取“/tracker/”
FleetsController#index 处理为 HTML
渲染布局/_stylesheets.html.haml (0.7ms)
渲染布局/_header.html.haml (1.1ms)
渲染布局/_footer.html.haml (0.0ms)
在布局/应用程序中渲染fleets/index.html.haml(7.8 毫秒)
在 1901 毫秒内完成 200 次 OK(查看次数:7.8 毫秒 | ActiveRecord:1.5 毫秒)

于 2010 年 11 月 21 日 21:50:06 -0500 开始为 XX.XX.XX.XX 获取“/tracker/fleets/XXXXXXXXX”
FleetsController 处理#show as HTML
参数:{"id"=>"XXXXXXXXX"}
渲染的舰队/_details_inner.html.haml (1.2ms)
渲染的舰队/_details.html.haml (2.1ms)
渲染的舰队/_summary.html.haml (3.5ms)
渲染的舰队/_scouts_inner.html.haml (1.3ms)
渲染的舰队/_scouts.html.haml (3.5ms)
渲染报告/_report.html.haml (0.5ms)
渲染的舰队/_reports.html.haml (3.0ms)
渲染的舰队/_recon_form.html.haml (39.9ms)
渲染的舰队/_recon.html.haml (40.8ms)
渲染 users/_user.html.haml (1.2ms)
渲染的舰队/_pilots.html.haml (1.9ms)
渲染布局/_stylesheets.html.haml (0.5ms)
渲染布局/_header.html.haml (0.9ms)
渲染布局/_footer.html.haml (0.0ms)
在布局/应用程序中渲染fleets/show.html.haml (60.2ms)
在 495 毫秒内完成 200 次 OK(查看次数:59.1 毫秒 | ActiveRecord:2.9 毫秒)

第一个命中没有任何数据库访问权限。第二个确实有数据库访问,但是生成视图只用了7.8ms,数据库只用了1.5ms,但整个页面几乎2分钟都没有完成!这是一个很常见的例子,但我有一些日志条目有 14 秒以上的页面响应。不,这不是在重新启动后的初始 rails 加载期间。

什么可能占用那段时间?

1) 我是否误解了 ActiveRecord 时间报告,这实际上只是代码时间,但实时数据库时间是时间的去向?

2) 我正在使用 sqlite。我知道最终我可能不得不切换到 MySQL,因为我会遇到并发问题,因为(大多数)每个页面命中都会导致数据库写入。但是现在,我几乎没有流量;最多可能有 15 人同时在网站上。在上面的日志示例中,一次只有 1 次命中,每次命中之间有 4-6 秒。我认为 sqlite 可以处理...

3) 我在共享 VPS 上。这意味着 VPS 上的其他用户可能正在同时做某事导致服务器变慢。大多数时候,我的 VPS 的 CPU 负载非常低,但 可能 我运气不好,并且在那一刻发生了一些事情。但我经常看到这种情况发生,所以我不认为这是一个答案。

4) VPS只有512+512MB内存。我显示有 150MB 可用空间,但有没有可能我只是达到了内存限制,这是页面交换或其他什么?

5) 我还在日志中看到了一些 BusyException。我将 database.yml 超时时间从 5 秒增加到 15 秒,看看是否有帮助。从那以后就没有做过真正的测试,看看是否有。

我知道我可能没有提供足够的信息让你真正告诉我发生了什么,所以真正的问题是,我什至如何开始尝试追踪这个?

【问题讨论】:

  • 都是同一个IP地址吗?
  • 是的,在这个例子中,这 3 个点击来自同一个用户。在点击之间也没有其他用户干预。

标签: ruby-on-rails apache2 vps passenger mod-rails


【解决方案1】:

所以两件事..

  1. 使用 New Relic 帮助诊断运行缓慢的代码
  2. 根据日志记录,我敢打赌您正在执行一些数组操作或在 FleetsController#index 中返回大量项目...看起来您的应用程序代码正在那里执行操作。

http://www.newrelic.com/

如果看起来有问题,请将代码发布到 FleetsController#index 中。但是 NewRelic 可以帮助您确定您在缓慢的网络请求中的具体周期。

【讨论】:

  • 我去看看New Relic。
  • FleetsController#index 不应该做太多事情。调用以使用有关当前用户的信息更新数据库(所有视图都会发生这种情况),然后查找以查看他们可以访问哪些 Fleet。 .visible 范围有一个稍微复杂的 where 子句,但数据集根本不是很大。到目前为止,通常一次只存在 1-2 个队列,整个数据库中可能只有 40 个用户。 FleetsController#show 有更多工作要做,这说明视图的处理时间比 #index 长近 10 倍。
  • 所以我会尝试删除您的 before_filters 并查看是否可以加快速度。此外,您的 Fleet.visible 也可能会减慢速度。
  • 要解决这个问题,你可能应该离线进行任何花哨的操作和计算——预先计算他们可以看到的内容,然后是一个简单的查询。
【解决方案2】:

SQLite 根本不做并发。我认为数据库上的连接可能被阻止。实际查询很好,但我怀疑 SQLite db 文件在另一个查询运行时被锁定。

您确实需要迁移到实际的服务器数据库,例如 MySQL 或 PostgreSQL。

【讨论】:

  • 我准备在需要时迁移到 MySQL,但是在上面的示例中,还没有发生任何并发。在那段时间里,只有一个用户访问了该网站。在其他地方,我注意到了一个并发问题。但是,我的直觉告诉我还有其他问题,如果我能解决这个问题,数据库时间应该会非常少,以至于在网站变得更加繁忙之前,我不会遇到并发问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多