私は最近、開発モードでうまく機能する新しい Ruby on Rails アプリケーションを立ち上げました。起動後、使用されているメモリが常に増加していることを経験しています。
UPDATED : New Relic からのこのスクリーン ダンプ (下の 1 つ) が取得されたとき。Web dyno の再起動を 1 時間ごとにスケジュールしました (2 つの Web dyno のうちの 1 つ)。したがって、500Mb のクラッシュ レベルには達せず、実際には少しシグソー パターンが発生します。ただし、これによって問題がまったく解決されるわけではなく、一部の症状のみが解決されます。ご覧のとおり、午前中はそれほど忙しくありませんが、午後はより忙しくなります。私は 11.30 に小さな詳細をアップロードしました。統計にそのように表示されていても、問題に影響を与えることはできませんでした。
グラフが AVG メモリを示していても、増加し続けるのは MIN メモリであることにも注意してください。グラフで一時的にグラフが下がったように見える場合でも、最小メモリは変わらないか、増加します。MINメモリーが減ることはありません!
アプリは (dyno 再起動なしで) Heroku で最大レベルに達するまでメモリを増やし、アプリは実行期限切れタイプのエラーでクラッシュします。
私は優れたプログラマーではありませんが、この種の問題が発生することなく、以前にいくつかのアプリを作成しました。
実行されたトラブルシューティング
A. 問題は application_controller の before_filter 内にあると思っていましたが (アプリケーション コントローラーの変数が Rails でメモリ リークを引き起こしますか? )、それは問題ではありませんでした。
B. oink をインストールしましたが、(まったく) 結果が得られません。oink.log を作成しますが、「heroku run oink -m log/oink.log」を実行しても、しきい値に関係なく結果が得られません。
C. bleak_house を試しましたが、非推奨でインストールできませんでした
D. このトピックのほとんどの記事をグーグル検索して読んだことがありますが、賢明ではありません。
E. memprof をテストしたいのですが、インストールできません (Ruby 1.9x を持っていて、1.8x にダウングレードする方法がよくわかりません)。
私の質問:
Q1. 私が本当に知りたいのは、リクエストごとに増加している変数の名前、または少なくともどのコントローラーが最も多くのメモリを使用しているかです。
Q2. 以下のコードのコントローラーはメモリを増やしますか?
related_feed_categories = []
@gift.tags.each do |tag|
tag.category_connections.each do |cc|
related_feed_categories << cc.category_from_feed
end
end
(申し訳ありませんが、SO は何らかの理由でコードを読みやすいように再フォーマットしません)。
後で「related_feed_categories = nil」でrelated_feed_categoriesを「殺す」必要がありますか、それともガベージコレクターがそれを処理しますか?
Q3. 私が探すべき主なものは何ですか?今のところ、私はそれをまったく絞り込むことはできません。コードのどの部分を詳しく調べる必要があるのか わかりません。また、何を探すべきか本当にわかりません。
Q4. 本当に問題を解決できない場合。コードを送って問題を見つけてもらうことができるオンライン コンサルティング サービスはありますか?
ありがとう!
更新。コメントを受け取った後、それはセッションに関係している可能性があります。これは、悪いと思われるコードの一部です。
# Create sessions for last generation
friend_data_arr = [@generator.age, @generator.price_low, @generator.price_high]
friend_positive_tags_arr = []
friend_negative_tags_arr = []
friend_positive_tags_arr << @positive_tags
friend_negative_tags_arr << @negative_tags
session["last_generator"] = [friend_data_arr, friend_positive_tags_arr, friend_negative_tags_arr]
# Clean variables
friend_data_arr = nil
friend_positive_tags_arr = nil
friend_negative_tags_arr = nil
generator#show コントローラで使用されます。私のギフト生成エンジンによっていくつかのギフトが生成されたら、入力をセッションに保存します (後でその情報を使用したい場合に備えて)。これらのセッションを強制終了したり期限切れにしたりすることは決してないので、メモリが増加する可能性があります。
再更新: このコードを削除しましたが、メモリはまだ増加しているので、この部分ではないと思いますが、同様のコードでエラーが発生する可能性がありますか?