我使用Rails 3.0.0和
Ruby 1.9.2开发了一个小型Rails应用程序.在测试期间,在我的个人计算机上,它的性能很好.我把它放在我的VPS上进行制作,使用Apache和mod_rails,有时表现很糟糕.
这是production.log中的一个例子:
Started GET “/tracker” for XX.XX.XX.XX at 2010-11-21 21:49:56 -0500
Processing by FleetsController#index as HTML
Rendered layouts/_stylesheets.html.haml (0.8ms)
Rendered layouts/_header.html.haml (1.0ms)
Rendered layouts/_footer.html.haml (0.0ms)
Rendered pages/about.html.haml within layouts/application (4.5ms)
Completed 200 OK in 15ms (Views: 14.3ms | ActiveRecord: 0.0ms)
Started GET “/tracker/” for XX.XX.XX.XX at 2010-11-21 21:50:02 -0500
Processing by FleetsController#index as HTML
Rendered layouts/_stylesheets.html.haml (0.7ms)
Rendered layouts/_header.html.haml (1.1ms)
Rendered layouts/_footer.html.haml (0.0ms)
Rendered fleets/index.html.haml within layouts/application (7.8ms)
Completed 200 OK in 1901ms (Views: 7.8ms | ActiveRecord: 1.5ms)
Started GET “/tracker/fleets/XXXXXXXXX” for XX.XX.XX.XX at 2010-11-21 21:50:06 -0500
Processing by FleetsController#show as HTML
Parameters: {“id”=>”XXXXXXXXX”}
Rendered fleets/_details_inner.html.haml (1.2ms)
Rendered fleets/_details.html.haml (2.1ms)
Rendered fleets/_summary.html.haml (3.5ms)
Rendered fleets/_scouts_inner.html.haml (1.3ms)
Rendered fleets/_scouts.html.haml (3.5ms)
Rendered reports/_report.html.haml (0.5ms)
Rendered fleets/_reports.html.haml (3.0ms)
Rendered fleets/_recon_form.html.haml (39.9ms)
Rendered fleets/_recon.html.haml (40.8ms)
Rendered users/_user.html.haml (1.2ms)
Rendered fleets/_pilots.html.haml (1.9ms)
Rendered layouts/_stylesheets.html.haml (0.5ms)
Rendered layouts/_header.html.haml (0.9ms)
Rendered layouts/_footer.html.haml (0.0ms)
Rendered fleets/show.html.haml within layouts/application (60.2ms)
Completed 200 OK in 495ms (Views: 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开始),看看是否有帮助.从未做过真正的测试,看它是否真的.
我知道我可能没有提供足够的信息让你真正告诉我发生了什么,所以真正的问题是,我怎么开始尝试追踪这个?
所以有两件事……
>使用New Relic来帮助诊断缓慢的代码
>根据日志记录,我敢打赌你正在做一些数组操作或在FleetsController #index中返回大量项目……看起来你的应用程序代码在那里做的事情.
http://www.newrelic.com/
如果看起来不对,请在FleetsController #index中发布代码.但是NewRelic可以帮助您找出您在慢速Web请求中花费周期的确切位置.