Heroku可能存在内存泄漏

时间:2014-12-20 06:29:24

标签: ruby-on-rails ruby heroku memory-leaks

我们在heroku 2x dyno上运行了一个Rails应用程序。在Paper-trail日志中,即使没有向服务器发出请求,应用程序的内存消耗也会保持线性增长,这可能会导致内存泄漏。

enter image description here Gemfile。

source 'https://rubygems.org

ruby '2.1.2'

gem 'aasm', '~> 3.2.0'
gem 'american_date'
gem 'attr_encrypted'
gem 'sass-rails', '~> 4.0.3'
gem 'bootstrap-sass', '~> 3.2.0.1'
gem 'bugsnag'
gem 'carrierwave', '~> 0.10.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'devise', '~> 3.2.0'
gem 'fog', '~> 1.22.0'
gem 'foreigner', '~> 1.6.1'
gem 'hstore_accessor'
gem 'jbuilder', '~> 2.0'
gem 'jquery-rails'
gem 'jquery-validation-rails', '~> 1.12.0'
gem 'omniauth-google-oauth2', '~> 0.2.0'
gem 'pg', '~> 0.17.0'
gem 'pundit', '~> 0.3.0'
gem 'rails', '4.1.4'
gem 'sdoc', '~> 0.4.0',          group: :doc
gem 'simple_form', '~> 3.0.0'
gem 'spring',        group: :development
gem 'therubyracer',  platforms: :ruby
gem 'turbolinks'
gem 'uglifier', '>= 1.3.0'
gem 'unicorn'
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
gem 'stripe', :git => 'https://github.com/stripe/stripe-ruby'
gem 'feature'
gem 'finance'
gem 'cocoon'
gem 'accountingjs-rails'

group :development, :test do
  gem 'pry-byebug', '~> 1.3.0'
  gem 'pry-rails', '~> 0.3.0'
end

group :development do
  gem 'thin'
  gem 'rack-mini-profiler'
  gem 'rails_best_practices'
  gem 'rubocop'
  gem 'spring-commands-rspec'
end

group :test do
  gem 'capybara'
  gem 'codeclimate-test-reporter'
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'shoulda-matchers', require: false
end

group :production do
  gem 'skylight'
end

gem 'newrelic_rpm' #reccommended to load as late as possible

gem 'smarter_csv'

新的遗物图表显示了内存使用量的增加。

enter image description here

我们尝试将ruby版本降级到2.0,并且使用量逐渐减少但不那么渐进。

有没有办法找出问题是否与我们的代码有关?找到根本原因的可能方法是什么?

**编辑:* *(config / unicorn.rb)

worker_processes Integer(ENV['WEB_CONCURRENCY'] || 3)
timeout 15
preload_app true

before_fork do |_server, _worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) &&
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |_server, _worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) &&
    ActiveRecord::Base.establish_connection
end

1 个答案:

答案 0 :(得分:1)

本周我在我的应用程序中解决了同样的问题。罪魁祸首是Ruby 2.1(在我的例子中是2.1.5)。我通过切换到Ruby 2.0修复了这个问题。

查看图表中的差异(绿线表示切换时刻):

Increase in performance after switching from Ruby 2.1.5 back to Ruby 2.0

改变之后,我从10 * 2X dynos转移到3 * 1X dynos而没有明显的性能损失。

如果你做一些在线研究,你会发现Ruby 2.1一直困扰着内存泄漏(跨所有补丁级版本)。我不知道2.2是否更好。

我也怀疑attr_encrypted宝石可能与此有关。巧合的是,我的应用程序也使用它。我的理论是,无论是gem本身,它的依赖还是(最有可能)底层的Ruby核心库都可能会使这种泄漏更加明显。