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 配置。我有零个模型和一个控制器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 页面。这是我的新遗物报告:

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 并查看它是否仍然是 R14s。

4

2 回答 2

4

尝试移除新遗物宝石。我在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

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

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

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

执行以下操作以查看 heroku 日志并确定最新错误是什么项目需要时间。

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

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

于 2012-10-03T11:59:03.637 回答