5

使用大量外围对象进行大型活动记录查询。

添加“.includes”(预加载)通过压缩所有 N+1 来显着加快速度。

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

Completed 200 OK in 504ms (Views: 104.2ms | ActiveRecord: 86.0ms)

然而,直到页面实际发送到浏览器(或 curl;我们已经对两者都进行了测试)之前* 90 秒 * 。

在此期间,ruby 进程将 CPU 固定在 100%。

如果我们删除“.includes”(预加载),它会恢复正常的糟糕性能,而不会在页面渲染和浏览器交付之间出现一分钟半的虚无鸿沟。

WTF 预加载会导致后效!?

一位同事假设存在垃圾收集问题;我该如何检验这个理论?

导轨 3.2.12

Ruby 1.9.3(p286 和 p327 测试)

4

1 回答 1

1

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

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

于 2013-03-11T20:59:59.740 回答