我怎么弄清楚为什么我的rails 3应用程序,使用mod_rails,是如此之慢?

时间:2010-11-22 20:43:17

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

我使用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开始GET“/ tracker”     由FleetsController处理#index为HTML
  渲染布局/ _stylesheets.html.haml(0.8ms)
  渲染布局/ _header.html.haml(1.0ms)
  渲染布局/ _footer.html.haml(0.0ms)
  在布局/应用程序(4.5ms)内渲染页面/ about.html.haml
  在15ms完成200 OK(浏览次数:14.3ms | ActiveRecord:0.0ms)

     

在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)
  在布局/应用程序(7.8ms)内渲染了fleets / index.html.haml
   1901年完成200 OK(浏览次数:7.8ms | ActiveRecord:1.5ms)

     

在2010-11-21 21:50:06 -0500开始为XX.XX.XX.XX开始获取“/ tracker / fleets / XXXXXXXXX”     由FleetsController处理#显示为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.9ms)
  渲染布局/ _stylesheets.html.haml(0.5ms)
  渲染布局/ _header.html.haml(0.9ms)
  渲染布局/ _footer.html.haml(0.0ms)
  在布局/应用程序(60.2ms)内渲染舰队/ show.html.haml
  在495ms完成200 OK(浏览次数:59.1ms | ActiveRecord:2.9ms)

第一次点击没有任何数据库访问权限。第二个确实有一个数据库访问,但视图只需要7.8ms生成,而数据库只需1.5ms,但整个页面几乎不会完成2分钟!这是一个非常常见的例子,但我有一些页面响应的日志条目超过14秒。不,这不是在重新启动后的初始rails负载期间。

那段时间可能会占用什么?

1)我是否误解了ActiveRecord时间报告,而这只是代码时间,但实时数据库时间是时间的流逝?

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

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

4)VPS只有512 + 512MB的内存。我显示有150MB免费,但是我可能只是达到了内存限制,这是页面交换还是什么?

5)我还在日志中看到了一些BusyException。我将database.yml超时提升到15秒(从5开始),看看是否有帮助。从未做过真正的测试,看它是否确实如此。

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

2 个答案:

答案 0 :(得分:1)

所以有两件事......

  1. 使用New Relic来帮助诊断缓慢的代码
  2. 基于日志记录,我敢打赌你正在做一些数组操作或者在FleetsController #index中返回大量项目......看起来你的应用程序代码正在做那些事情。
  3. http://www.newrelic.com/

    如果看起来不对,请在FleetsController #index中发布代码。但是,NewRelic可以帮助您确定在慢速Web请求中确切花费您的周期的位置。

答案 1 :(得分:0)

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

你真的需要转移到像MySQL或PostgreSQL这样的实际服务器数据库。