activerecord预加载导致后效性能降低

Tef*_*Ted 5 performance activerecord preloader

使用大量外围对象执行大型activerecord查询.

添加".includes"(预加载)可以通过挤压所有N + 1来大大加快速度.

然后页面快速呈现并将其吐出到日志中:

Completed 200 OK in 504ms (Views: 104.2ms | ActiveRecord: 86.0ms)
Run Code Online (Sandbox Code Playgroud)

然而,它是*90 SECONDS*直到页面实际发送到浏览器(或curl;我们已经测试了两者).

在此期间,ruby进程的CPU固定为100%.

如果我们删除".includes"(预加载),它会恢复正常的糟糕表现,而不会在页面渲染和浏览器传递之间出现一点半的虚无.

WTF做预加载导致效果!?

一位同事假设垃圾收集问题; 我该如何测试这个理论呢?

Rails 3.2.12

Ruby 1.9.3(p286和p327测试)

Tef*_*Ted 1

发现问题;这是 Bullet gem(https://github.com/flyerhzm/bullet)。

这个 gem 巧妙地查找并报告 N+1 查询和过度包含,但在结果集非常大的情况下,它会大大降低应用程序性能。