我开发了一个小型Rails应用程序,使用Rails 3.0.0和Ruby1.9.2。在测试期间,在我的个人电脑上,它的性能很好。我使用Apache和mod_rails把它放在VPS上用于生产,有时性能很糟糕。
下面是来自production.log的一个示例:
在2010-11- 21 :49:56 -0500为XX.XX启动了GET "/tracker“
用FleetsController#index作为HTML进行处理
呈现的布局/_样式表.html.haml (0.8ms)
呈现的布局/_1.0ms er.html.haml (1.0ms)
呈现的布局/_footer.html.haml (0.0ms)
在布局/应用程序中呈现页/约.html.haml (4.5ms)
在15 21内完成200 OK (查看: 14.3ms / ActiveRecord: 0.0ms)启动XX.XX的GET "/tracker/“,时间为2010-11-21 :50:02-0500
用FleetsController#index作为HTML进行处理
呈现的布局/_样式表.html.haml (0.7ms)
呈现的布局/_1.1ms er.html.haml (1.1ms)
呈现的布局/_footer.html.haml (0.0ms)
在布局/应用程序中呈现的舰队/index.html.haml (7.8ms)
在1901ms中完成了200 OK (视图: 7.8ms / ActiveRecord: 1.5ms)
从2010-11-21 21:50:06 -0500开始为XX.XX启动GET“/tracker/机队/XXXXXXXXX”
用FleetsController#show作为HTML进行处理
参数:{"id"=>"XXXXXXXXX"}
渲染舰队/_details_inner.html.haml (1.2ms)
呈现的舰队/_ Rendered .html.haml (2.1ms)
呈现的机队/_Sumy.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)
呈现的布局/_样式表.html.haml (0.5ms)
呈现的布局/_0.9ms er.html.haml (0.9ms)
呈现的布局/_footer.html.haml (0.0ms)
在布局/应用程序中呈现的舰队/show.html.haml (60.2ms)
在495 OK中完成200 OK(视图: 59.1ms \ ActiveRecord: 2.9ms)
第一次攻击没有任何数据库访问权限。第二个页面具有数据库访问权限,但是视图只需要7.8 to生成,而数据库只需要1.5ms,但是整个页面在2分钟内都没有完成!这是一个非常常见的例子,但是对于页面响应,我有一些带有14+秒的日志条目。不,这不是在重新启动后的初始rails加载期间。
怎么可能会占用这段时间呢?
1)我是否误解了ActiveRecord时间报告,这实际上只是代码时间,但实时数据库时间是时间的方向吗?
2)我使用的是sqlite。我知道最终我可能不得不切换到MySQL,因为我会遇到并发问题,因为(大多数)每一次页面点击都会导致数据库写入。但现在,我几乎没有任何流量,最多可能有15人同时在网站上。在上面的日志示例中,每次只有一个命中,每次命中只有4-6秒。我想sqlite能处理好.
3)我正在使用一个共享的VPS。这意味着VPS上的其他用户可能同时在做一些事情,从而导致服务器速度减慢。大多数情况下,我的VPS的CPU负载非常低,但可能是我运气不好,就在那个时候发生了一些事情。但我已经看到这种情况经常发生,所以我不相信这是一个答案。
4) VPS只具有内存的512+512MB。我展示的是150 it的免费内存,但是否可能只是达到内存限制,而这是页面交换之类的呢?
5)我还在日志中看到了一些BusyException。我将database.yml超时时间提高到15秒(从5秒提高到15秒),看看这是否有帮助。从那以后就没有做过真正的测试了。
我知道我可能没有提供足够的信息让你告诉我到底发生了什么,所以真正的问题是,我如何开始追踪这个问题呢?
发布于 2010-11-22 21:00:56
所以有两件事。
http://www.newrelic.com/
如果这看起来不对,请在FleetsController#index中发布代码。但是NewRelic可以帮助你找出在缓慢的web请求中你到底在哪里花费你的周期。
发布于 2010-11-22 21:43:40
SQLite根本不做并发操作。我认为数据库上的连接可能被阻塞了。实际查询是可以的,但我怀疑在运行另一个查询时,SQLite db文件被锁定了。
您确实需要移动到实际的服务器数据库,如MySQL或PostgreSQL。
https://stackoverflow.com/questions/4250074
复制相似问题