繁体   English   中英

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

[英]How do I figure out why my rails 3 app, using mod_rails, is so slow?

我使用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)
在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)
在布局/应用程序中渲染fleets / index.html.haml(7.8ms)
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)
在布局/应用程序中渲染舰队/ show.html.haml(60.2ms)
在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开始),看看是否有帮助。 从未做过真正的测试,看它是否真的。

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

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

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

http://www.newrelic.com/

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM