2013-03-08 18 views
5

多くの周辺オブジェクトを含む大きなアクティブなレコードクエリを実行しています。アクティブレコードの事前ロードによる影響のパフォーマンス低下の原因

".includes"(プリロード)を追加すると、N + 1個の すべてを押しつぶすことで、スピードアップします。

ページが高速でレンダリングし、ログにこれを吐く:ページが実際に にブラウザ(またはカールを下されるまで

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

はしかし、それは、* 90秒*です。私たちは両方でテストしました)。

ルビプロセスでは、CPUが100%に固定されています。

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

WTFは、あとで効果が出るプリロードの原因ですか?

1人の同僚がガベージコレクションの問題を仮定しています。私はその理論をどうやってテストするだろうか?

レール3.2.12

ルビー1.9.3(P286及びP327が試験)

答えて

1

問題を発見。弾丸の宝石(https://github.com/flyerhzm/bullet)でした。

この宝石は、N + 1個のクエリで過度に含まれていますが、非常に大きな結果セットの場合、アプリケーションのパフォーマンスが大幅に低下します。

関連する問題