我使用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开始),看看是否有帮助。从未做过真正的测试,看它是否确实如此。
我知道我可能没有提供足够的信息让你真正告诉我发生了什么,所以真正的问题是,我怎么开始尝试追踪这个?
答案 0 :(得分:1)
所以有两件事......
如果看起来不对,请在FleetsController #index中发布代码。但是,NewRelic可以帮助您确定在慢速Web请求中确切花费您的周期的位置。
答案 1 :(得分:0)
SQLite根本不做并发操作。我想也许数据库上的连接被阻止了。实际的查询很好,但我怀疑SQLite db文件在另一个查询运行时被锁定。
你真的需要转移到像MySQL或PostgreSQL这样的实际服务器数据库。