19

Rails アプリ (Heroku (cedar) でホストされている) がますます多くのメモリを割り当て続ける理由がわかりません。もっとよく知らなければ、これは Ruby/Rails のメモリ リークだと言えますが、私は Ruby/Rails にまったく慣れていないので、完全に明らかな何かが欠けているように感じます。

によって生成された Rails のデフォルトrails newと、完全に最新の gem を使用しています。

source 'https://rubygems.org'

gem 'rails', '3.2.8'

group :development do
  gem 'sqlite3'
end

group :assets do
  gem "sass-rails", "~> 3.2.5"
  gem "coffee-rails", "~> 3.2.2"
  gem "uglifier", "~> 1.3.0"
end

gem "jquery-rails", "~> 2.1.2"

group :production do
  gem 'newrelic_rpm'
  gem "pg", "~> 0.14.1"
end

デフォルトの newrelic configを使用しています。nothing_controller.rbを使用して生成されたモデルが 0 個で、コントローラーが 1 個ありますrails generate controller nothing

class NothingController < ApplicationController
  def index
  end
end

public/index.html空のを削除して追加しましたviews/nothing/index.html.erb。生成されたアプリに対して他に行った唯一のことは、次へのルートを追加することでしたroutes.rb

Nothing::Application.routes.draw do
  root :to => "nothing#index"
end

コミットして Heroku にプッシュし、Heroku ページを 10 秒ごとにロードする簡単なスクリプトを作成しました。これは私のNew Relicレポートです:

http://i.imgur.com/djZZn.png

それだけです。メモリは、Heroku の制限である 512MB を超えるまで、このように増加し続けます。このアプリのコードは、従ったチュートリアルで見たコードとほとんど同じです。私が間違っていることを理解していません。

ガイダンスをいただければ幸いです。

編集 (9/12): 関連する場合に備えて、Ruby 1.9 を使用しています。

サーバーにアクセスするために使用しているコード(C#):

using (var wc = new WebClient())
  for (;; Thread.Sleep(10000))
    wc.DownloadString("http://vast-earth-9859.herokuapp.com/");

編集 (9/13): New Relic を無効にして、まだ R14 かどうかを確認します。

4

2 に答える 2

4

newrelic gem を削除しようとしています。私はherokuで同じ問題を抱えていましたが、犯人はnewrelic gemでした。メモリである現在のオブジェクトを確認できます。以下のコードは、オブジェクト数を示しています。

ObjectSpace.each_object.with_object(Hash.new(0)){|obj, h| h[obj.class] +=1 }.select{|k,v| puts "#{k} => #{v}" if k == String || k == Array || k == Hash}
于 2013-10-22T12:14:08.367 に答える
2

メモリがherokuの制限(512 MB)を超えると、アプリを再起動したり、コードを変更したりしても、すぐにメモリがダウンすることはありません。それは成長し続け、さらに遅くなります。heroku自体は、herokuのメモリしきい値に達するとプロセスを強制終了します(それがいくらかはわかりません)。

メモリリークの原因はさまざまですが、次のようなものがあります。1.継続的な例外がスローされます。2。1回のリクエストで大量のデータを取得します。

マシンにメモリ制限がないため、ローカルマシンでテストしても役に立ちません。

次の手順を実行して、herokuログを確認し、最新のエラーとは何か、アイテムには時間がかかることを確認します。

heroku logs -a <application name> -n<number of lines>

アプリケーションを1日ほど停止してから、コードを変更してアプリケーションを開始できます。

于 2012-10-03T11:59:03.637 に答える