16

Ruby 1.9.3 を使用して Heroku Cedar で Rails 3.2.8 アプリを実行しています。アプリは起動時に問題なく動作しますが、1 日ほど連続して使用すると、ログに R14 エラーが表示されるようになります。メモリ エラーが発生すると、アプリが数時間アイドル状態になっても、消えることはありません。

ガベージ コレクターは、しばらくしてから未使用のオブジェクトをクリーンアップし、メモリ負荷を軽減すべきではありませんか? これは Heroku では発生していないようです。一般に、数千行のデータを含む一部のレポートを実行すると、結果がページ分割されますが、メモリ使用量が増加し始めます。

どうすればメモリリークを見つけることができますか? bleak_house のようなプラグインは時代遅れであるか、Heroku 環境でうまく動作しません。GC 設定を調整してよりアグレッシブにすることはできますか?

4

2 に答える 2

6

GC はクリーンアップを行う必要があり、おそらくそうします。

GC.start;で GC を強制できます。多くのオブジェクトが収集されなかった場合、これは問題になりますが、それは問題ではないと思います。

キャッシュされたコピーなどを保持することで、どうにかして一連のオブジェクトを作成し、それらを解放しないことは可能ですか?

これを確認するための既存のツールには慣れていませんが、 を使用してどのオブジェクトが存在するかを確認することをお勧めしますObjectSpace。例えば:

ObjectSpace.each_object.with_object(Hash.new(0)){|obj, h| h[obj.class] +=1 }
# => a Hash with the number of objects by class

たとえば、クラスの 1 つに予期しない番号が表示された場合、どこを探すべきかについてより良いアイデアが得られます。

于 2012-11-09T18:28:33.920 に答える
-1

NewRelicアドオンをインストールします。リークの原因を見つけるために使用できる便利なメトリックがたくさんあります。一般的には、GCを完全に微調整するよりも、コードのどの部分の実行に最も時間がかかるかを確認し、それを最適化することをお勧めします。

New Relicに含まれる優れた機能のいくつかは、たとえば、最も長く実行されているSQLクエリのソースを特定できることです。ぜひお試しください。

于 2012-11-09T18:44:39.767 に答える