内存在一个空的Rails应用程序中无限增长

时间:2012-09-12 22:57:13

标签: ruby-on-rails ruby-on-rails-3 heroku

我无法弄清楚为什么我的Rails应用程序(在Heroku(雪松)上托管)不断分配越来越多的内存。如果我不知道更好,我会说这是Ruby / Rails中的内存泄漏,但由于我是Ruby / Rails的新手,我觉得我错过了一些完全明显的东西。

我正在使用rails new生成的Rails默认值,以及完全最新的宝石:

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

我正在使用default newrelic config。我有零模型和一个控制器nothing_controller.rb,它是使用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,然后编写了一个快速脚本,每隔10秒就会加载我的Heroku页面。这就是我的New Relic报道的内容:

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

这就是它的全部。内存只是不断增加,直到它通过Heroku的512MB限制。此应用中的代码与我见过的代码in the tutorial I followed几乎相同。我不明白我做错了什么。

非常感谢任何指导。

编辑(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并查看它是否仍为R14s。

2 个答案:

答案 0 :(得分: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}

答案 1 :(得分:2)

一旦内存超过(512 MB)heroku的限制,它将不会立即通过重新启动应用程序或更改代码来降低内存。它将继续增长并进一步减速,heroku本身会在达到heroku的内存阈值(不确定它是多少)时杀死进程。

有许多事情可能导致内存泄漏,以下是少数几个 1.抛出连续异常 2.在单个请求中获取大量数据。

在本地计算机上测试它将无济于事,因为您的计算机上没有任何内存限制。

执行以下操作以查看heroku日志,并确定哪些项目需要时间的最新错误。

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

暂停应用程序一天左右,然后您可以更改代码并启动应用程序。