Возможная утечка памяти на Heroku

У нас есть приложение Rails, работающее на heroku 2x dyno. В журналах Paper-trail потребление памяти приложением продолжает линейно увеличиваться даже без запроса к серверу, что указывает на возможную утечку памяти.

введите здесь описание изображения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'

Графики новой реликвии показывают увеличение использования памяти.

введите здесь описание изображения

Мы попытались понизить версию 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

person gmuraleekrishna    schedule 20.12.2014    source источник
comment
Сколько у вас рабочих Unicorn? Возникает ли проблема, если вы уменьшаете количество рабочих? Я спрашиваю, потому что мы видели нечто подобное с Puma, когда пытались запустить более двух рабочих.   -  person tagCincy    schedule 20.12.2014
comment
@tagCincy Я думаю, что героку настраивает рабочих-единорогов. В нашем конфигурационном файле указано worker_processes Integer(ENV['WEB_CONCURRENCY'] || 3).   -  person gmuraleekrishna    schedule 20.12.2014
comment
На самом деле в этой строке говорится, что по умолчанию установлено 3 рабочих, если вы не установите конфигурацию WEB_CONCURRENCY. Попробуйте настроить эту конфигурацию с помощью heroku config:set WEB_CONCURRENCY=2   -  person tagCincy    schedule 20.12.2014


Ответы (1)


На этой неделе я решил эту же проблему в своем приложении. Виновником был Ruby 2.1 (в моем случае это был 2.1.5). Я исправил это, переключившись на Ruby 2.0.

Посмотрите разницу на графиках (зеленая линия отмечает момент переключения):

Увеличение производительности после перехода с Ruby 2.1.5 обратно на Ruby 2.0

После изменения я перешел с 10*2X dynos на 3*1X dynos без заметного снижения производительности.

Если вы проведете некоторое онлайн-исследование, вы обнаружите, что Ruby 2.1 страдает от утечек памяти (во всех версиях с патчами). Не знаю, лучше ли 2.2.

Я также подозреваю, что драгоценный камень attr_encrypted может иметь к этому какое-то отношение. По совпадению, мое приложение также использует его. Моя теория состоит в том, что либо сам гем, его зависимость, либо (скорее всего) базовые библиотеки ядра Ruby могут сделать что-то, что сделает эту утечку более очевидной.

person pablobm    schedule 29.01.2015
comment
Мы уже пробовали понизить версию, но не показали значительного улучшения в использовании памяти. Но скорость увеличения памяти была меньше. - person gmuraleekrishna; 02.02.2015