5

多数の周辺オブジェクトを使用して大きなactiverecordクエリを実行します。

「.includes」(プリロード)を追加すると、すべてのN + 1が潰れるため、劇的に高速化されます。

次に、ページは高速にレンダリングされ、これをログに吐き出します。

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

ただし、ページが実際にブラウザに送信されるまでは* 90秒*です(またはカール。両方でテスト済みです)。

その間、rubyプロセスのCPUは100%に固定されます。

「.includes」(プリロード)を削除すると、ページのレンダリングとブラウザの配信の間に何もないという1分半の隙間がなく、通常の安っぽいパフォーマンスに戻ります。

WTFは、プリロードによって後遺症が発生しますか?

ある同僚は、ガベージコレクションの問題を仮定しました。その理論をどのようにテストできますか?

Rails 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 に答える