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

use*_*177 19 ruby-on-rails heroku ruby-on-rails-3

我无法弄清楚为什么我的Rails应用程序(托管在Heroku(雪松)上)不断分配越来越多的内存.如果我不知道更好,我会说这是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
Run Code Online (Sandbox Code Playgroud)

我正在使用默认的newrelic配置.我有零模型和一个控制器nothing_controller.rb,它是使用rails generate controller nothing以下生成的:

class NothingController < ApplicationController
  def index
  end
end
Run Code Online (Sandbox Code Playgroud)

我删除public/index.html并添加了一个空views/nothing/index.html.erb.我对生成的应用程序做的唯一其他事情是添加一个路由routes.rb:

Nothing::Application.routes.draw do
  root :to => "nothing#index"
end
Run Code Online (Sandbox Code Playgroud)

我承诺,把它推到Heroku,然后写了一个快速的脚本,每隔10秒加载我的Heroku页面.这就是我的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/");
Run Code Online (Sandbox Code Playgroud)

编辑(9/13):尝试禁用New Relic并查看它是否仍然是R14s.

MKu*_*mar 5

尝试移除新遗物宝石。我在 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}
Run Code Online (Sandbox Code Playgroud)

  • `ObjectSpace.count_objects` 将产生类似的输出。 (2认同)

小智 2

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

导致内存泄漏的原因有多种,以下是其中的几种: 1. 连续抛出异常 2. 在单个请求中获取大量数据。

在本地计算机上测试它不会有帮助,因为您的计算机上没有任何内存限制。

执行以下操作以查看 Heroku 日志并了解最新错误是什么、哪些项目需要时间。

heroku logs -a <application name> -n<number of lines>
Run Code Online (Sandbox Code Playgroud)

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