我们在heroku 2x dyno上运行了一个Rails应用程序。在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
答案 0 :(得分:1)
本周我在我的应用程序中解决了同样的问题。罪魁祸首是Ruby 2.1(在我的例子中是2.1.5)。我通过切换到Ruby 2.0修复了这个问题。
查看图表中的差异(绿线表示切换时刻):
改变之后,我从10 * 2X dynos转移到3 * 1X dynos而没有明显的性能损失。
如果你做一些在线研究,你会发现Ruby 2.1一直困扰着内存泄漏(跨所有补丁级版本)。我不知道2.2是否更好。
我也怀疑attr_encrypted
宝石可能与此有关。巧合的是,我的应用程序也使用它。我的理论是,无论是gem本身,它的依赖还是(最有可能)底层的Ruby核心库都可能会使这种泄漏更加明显。