2017-03-08 55 views
0

私はPumaサーバーとDelayedJobを使用しています。 それぞれの仕事で取られた記憶は解放されず、ゆっくりと私のdyno(Heroku)を再起動させる膨らみが出ます。DelayedJobはメモリを解放しません

ジョブが実行される前にdynoが同じメモリ使用量に戻らない理由は何ですか?

強制的に解除する方法はありますか?私はGCを呼び出すことを試みたが、それは助けにはならない。

答えて

1

次のいずれかの問題が発生する可能性があります。または、実際にはすべて:

番号1です。これは実際の問題ではありませんが、Rubyがメモリをオペレーティングシステムにリリースする方法についての誤解です。短い答え:それはしません。長い答え:Rubyは空きオブジェクトの内部リストを管理します。あなたのプログラムが新しいオブジェクトを割り当てる必要があるときはいつでも、このフリーリストからそれらのオブジェクトを取得します。そこにもうオブジェクトがなければ、Rubyはオペレーティングシステムから新しいメモリを割り当てます。オブジェクトがガベージコレクションされると、それらはフリーリストに戻ります。 Rubyにはまだ割り当てられたメモリがあります。それをよりよく説明するために、あなたのプログラムが通常100 MBを使用していると想像してください。ある時点でプログラムが1 GBを割り当てると、プログラムを再起動するまでこのメモリが保持されます。

詳細については、herehereをご覧ください。

あなたがするべきことは、あなたのダイノーサイズを増やして、時間の経過とともにメモリ使用量を監視することです。それはあるレベルで安定するはずです。これはあなたの通常のメモリ使用量を表示します。

番号2。あなたは実際のメモリリークを持つことができます。それはあなたのコードやいくつかの宝石の中にあることができます。 this repositoryをチェックしてください。人気のある宝石によく知られているメモリリークやその他のメモリに関する情報が含まれています。実際にはdelayed_jobがそこにリストされています。

番号3。必要以上のメモリを使用している最適化されていないコードがある可能性があります。メモリ使用量を調べて、それを減らそうとする必要があります。大きなファイルを処理している場合は、小規模のバッチなどで行うべきかもしれません。

+0

返信ありがとうございます。私はシンボルとしてハッシュをたくさんキーとして使用しています。これらのハッシュはもはや参照されていませんが、文字列キーに切り替えると便利でしょうか?シンボルはガベージコレクションの方が弾力性が高いので、 –

関連する問題