使用大量外围对象进行大型的activerecord查询。
添加“.includes”(预加载)可以通过压缩所有内容来大大加快速度 N + 1点的
然后页面快速渲染并将其吐出到日志中:
Completed 200 OK in 504ms (Views: 104.2ms | ActiveRecord: 86.0ms)
然而,在页面实际发送到之前,它是 * 90 SECONDS * 浏览器(或卷曲;我们已经测试过两者)。
在此期间,ruby进程将CPU固定为100%。
如果我们删除“.includes”(预加载),它会恢复正常蹩脚 表现没有页面之间的虚无的一分半裂缝 渲染和浏览器传递。
WTF执行预加载后会产生效果!?
一位同事假设垃圾收集问题;我该如何测试这个理论?
Rails 3.2.12
Ruby 1.9.3(已测试p286和p327)
答案 0 :(得分:1)
发现问题;这是Bullet的宝石(https://github.com/flyerhzm/bullet)。
这个宝石巧妙地发现并报告了N + 1个查询和过分夸大的包含,但是对于非常大的结果集,它会大大降低应用程序的性能。