2014-12-20 41 views
0

我們有一個運行在heroku 2x dyno上的Rails應用程序。在Paper-trail日誌中,即使沒有對服務器的請求,應用程序的內存消耗也會保持線性增長,這會導致內存泄漏。Heroku上可能的內存泄露

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

我們試圖降級紅寶石版本爲2.0,使用了增量下降,但少循序漸進。

有什麼方法可以找到問題是否與我們的代碼?找到根本原因的可能方法有哪些?

**編輯:* *(配置/ 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 
+0

你正在運行多少個麒麟工人?如果你減少工人數量,問題是否會發生?我問,因爲當我們試圖運行兩名以上的工人時,我們看到了與彪馬類似的事情。 – tagCincy

+0

@tagCincy我認爲,heroku設立了獨角獸工作者。在我們的配置文件中,它表示'worker_processes整數(ENV ['WEB_CONCURRENCY'] || 3)'。 – gmuraleekrishna

+0

實際上,該行表示,除非您設置了WEB_CONCURRENCY配置,否則它是3個工人的默認值。嘗試使用'heroku config:set WEB_CONCURRENCY = 2'設置配置。 – tagCincy

回答

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一直困擾着內存泄漏(跨所有patchlevel版本)。我不知道2.2是否更好。

我也懷疑attr_encrypted寶石可能與此有關。巧合的是,我的應用程序也使用它。我的理論是,無論是寶石本身,它的依賴關係還是(最有可能的)基礎Ruby核心庫都可能會使這種泄漏更加明顯。

+0

我們之前嘗試降級,但未顯示mem使用情況的重大改進。但記憶力增加的速度較慢。 – gmuraleekrishna