4

我使用 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
" .html.haml (1.0ms)
渲染布局/_footer.html.haml (0.0ms)
在布局/应用程序中渲染页面/about.html.haml (4.5ms)
在 15ms 内完成 200 OK (Views: 14.3ms | 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.8ms)
1901ms 内完成 200 OK (Views: 7.8ms | ActiveRecord: 1.5毫秒)

在 2010-11-21 21:50:06 -0500 开始 GET "/tracker/fleets/XXXXXXXXX" for XX.XX.XX.XX
由 FleetsController#show 作为 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)
渲染用户/_user.html.haml (1.2ms)
渲染车队/_pilots.html.haml (1.9毫秒)
渲染布局/_stylesheets.html.haml (0.5ms)
渲染布局/_header.html.haml (0.9ms)
渲染布局/_footer.html.haml (0.0ms)
在布局/应用程序中渲染车队/show.html.haml (60.2毫秒)
在 495 毫秒内完成 200 次 OK(查看次数:59.1 毫秒 | ActiveRecord:2.9 毫秒)

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

什么可能占用那段时间?

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 秒,看看是否有帮助。从那以后就没有做过真正的测试,看看是否有。

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

4

2 回答 2

2

所以两件事..

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

http://www.newrelic.com/

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

于 2010-11-22T21:00:56.560 回答
0

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

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

于 2010-11-22T21:43:40.783 回答