Rails 4 Error R14 en Heroku (Cuota de Memoria Superada)


He estado recibiendo el (aparentemente común) Error R14, no estoy seguro de cuándo se inició, pero me di cuenta después de instalar el complemento Papertrail. También agregué oink después de ver a otros mencionarlo. He intentado todo lo que otros han intentado en otras preguntas, pero parece que no puedo encontrar el problema / fuga de memoria.

Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=587M(114.7%)

Cuando veo esto, para arreglarlo temporalmente, corro heroku restart que funciona por un tiempo, pero quiero arreglar este problema permanentemente.

De lo que yo puede ver en Papertrail, la aplicación simplemente sigue cargando la misma página (página de inicio) una y otra vez (y no es tráfico de usuario):

app/web.1: Completed 200 OK in 436ms (Views: 45.5ms | ActiveRecord: 386.2ms) 
app/web.1: May 25 18:14:52 5d2105e1-d799-4496-a2af-3785e78998db rails[9]: Oink Action: static_pages#home
app/web.1: May 25 18:14:52 5d2105e1-d799-4496-a2af-3785e78998db rails[9]: Memory usage: 378860 | PID: 19
app/web.1: May 25 18:14:52 5d2105e1-d799-4496-a2af-3785e78998db rails[9]: Oink Log Entry Complete 
heroku/web.1: source=web.1 dyno=heroku.25566769.9d9a3da0-db4c-4b51-bc53-b69be9e43cb7 sample#memory_total=209.86MB sample#memory_rss=209.83MB sample#memory_cache=0.02MB sample#memory_swap=0.00MB sample#memory_pgpgin=59278pages sample#memory_pgpgout=5555pages 

Y después de 2 minutos:

heroku/web.1: source=web.1 dyno=heroku.25566769.9d9a3da0-db4c-4b51-bc53-b69be9e43cb7 sample#memory_total=293.73MB sample#memory_rss=291.94MB sample#memory_cache=0.02MB sample#memory_swap=1.77MB sample#memory_pgpgin=80890pages sample#memory_pgpgout=6147pages `

También he habilitado heroku labs:enable log-runtime-metrics a partir de las instrucciones de otra pregunta aquí y de Heroku aquí

También he agregado el complemento New Relic y esto es lo que veo en la pestaña Monitoreo > Instancias:

Durante los Últimos 7 Días: últimos 7 días

Durante las Últimas 24 Horas: últimas 24 horas

I estoy confundido como se puede ver después de 5/24 el uso de memoria bajó y desde entonces se ha mantenido abajo, pero en los registros muestra la memoria que se utiliza mem=587M(114.7%) y en las últimas 24 horas un promedio de 150M, así que no entiendo lo que está sucediendo. Espero que alguien pueda ayudar. Gracias.

Actualización 1: Agregado Gemfile

#Gemfile
source 'https://rubygems.org'
ruby '2.1.1'
gem 'rails', '4.1.1'

gem 'puma', '~> 2.8.2'
gem 'turbolinks', '~> 2.2.2'
gem 'pg', '~> 0.17.1'
gem 'rack-attack', '~> 4.0.1'
gem 'memcachier'
gem 'dalli', '~> 2.7.1'
gem 'oink'
gem 'fog', '~> 1.22.0'
gem 'activeadmin', github: 'gregbell/active_admin'
gem 'dynamic_sitemaps', '~> 2.0.0'
gem 'whenever', :require => false
gem 'cancancan', '~> 1.8.0'
gem 'mini_magick', '~> 3.7.0'
gem 'carrierwave', '~> 0.10.0'
gem 'devise', '~> 3.2.4'
gem 'rolify', '~> 3.4.0'
gem 'simple_form', '~> 3.0.2'
gem 'cocoon', '~> 1.2.6'
gem 'friendly_id', '~> 5.0.3'
gem 'nokogiri', '~> 1.6.2.1'
gem 'kaminari'
gem 'impressionist', '~> 1.5.1'
gem 'validate_url'
gem 'searchkick', '~> 0.7.5'
gem 'meta-tags', '~> 2.0.0'
gem 'newrelic_rpm'


group :assets do
  gem 'sass-rails', '~> 4.0.3'
  gem 'bootstrap-sass', '~> 3.1.1.1'
  gem 'uglifier', '~> 2.5.0'
  gem 'coffee-rails', '~> 4.0.1'
  gem 'asset_sync'
  #gem 'jquery-turbolinks'
  gem 'jquery-rails'
  gem 'jbuilder', '~> 2.0.7'
end

group :production do
  gem 'rails_12factor'
end

Actualización 2: Servidor cambiado de Puma a Unicorn

Fue bastante simple, siguiendo las instrucciones aquí. Y esto es lo que parece ahora, que parece buena, pero Sospecho que fue porque la aplicación se reinició: last30mins

# after heroku restart
heroku/web.1: source=web.1 dyno=heroku.25566769.3770e52a-ddf3-485a-a88a-ac4fd54ab640 sample#memory_total=123.62MB

# after 4 minutes
heroku/web.1: source=web.1 dyno=heroku.25566769.3770e52a-ddf3-485a-a88a-ac4fd54ab640 sample#memory_total=276.48MB

Actualización 3: Se redujo la cantidad de trabajadores Unicornio a 2

Después de hacer eso, este es el uso promedio de memoria por dinamómetro / instancia durante las últimas 6 horas de acuerdo con New Relic: lasy6 horas después

Y la salida en PaperTrain (y también intentó LogEntries) fue esta:

app/web.1: May 26 19:54:08 21ae35ee-5656-4254-9f12-5dc6bb59efa1 rails[6]: Memory usage: 426076 | PID: 6
app/web.1: May 26 19:54:08 21ae35ee-5656-4254-9f12-5dc6bb59efa1 rails[6]: Oink Log Entry Complete
heroku/web.1: source=web.1 dyno=heroku.25566769.21ae35ee-5656-4254-9f12-5dc6bb59efa1 sample#load_avg_1m=0.00 sample#load_avg_5m=0.00 sample#load_avg_15m=0.00
heroku/web.1: source=web.1 dyno=heroku.25566769.21ae35ee-5656-4254-9f12-5dc6bb59efa1 sample#memory_total=431.99MB sample#memory_rss=406.85MB sample#memory_cache=0.10MB sample#memory_swap=25.04MB sample#memory_pgpgin=198612pages sample#memory_pgpgout=94432pages 

Revisé los registros, y después de 1 hora estaba recibiendo el error R14 y ahora ha estado subiendo muy poco, casi sosteniendo estable en 432MB y no han conseguido el error más. ¡Así que esto parece haber solucionado el problema! Actualizaré con el tiempo si esto cambia.

Author: crentist, 2014-05-25

5 answers

Si Papertrail está causando un problema, pruebe con un complemento diferente. He estado usando LogEntries sin mucho problema. https://addons.heroku.com/#logging

También intente reducir sus procesos de Unicorn worker para que utilice una memoria total más baja. En lugar del valor predeterminado de 3 (por caja/dinamómetro), pruebe con 2.

Https://devcenter.heroku.com/articles/rails-unicorn#unicorn-worker-processes

También puede ejecutar un generador de perfiles de memoria en su aplicación:

Http://timetobleed.com/memprof-a-ruby-level-memory-profiler /

Https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=profile

 16
Author: Chloe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-25 23:44:49

Digital Ocean escribió un gran artículo sobre esto.

Matar Unicornios puede funcionar en ciertas situaciones... sin embargo, algunas personas pueden tener preocupaciones éticas con este enfoque.

 13
Author: Jon Lemmon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-13 00:28:53

Si estás usando Rails 4 con Ruby 2.1, apuesto a que el único cambio que necesitas hacer es bajar a Ruby 2.0.

Pasé 2 días para averiguarlo y se me ocurrió esta idea con las sugerencias de Heroku support. Creo que es un error o algo así con Ruby 2.1 o Rails 4.

Actualización para abril de 2015:

En ese momento, la degradación funcionó como una solución. Pero bueno, realmente no es una forma recomendada de resolver problemas... Algunas personas dicen actualizando a Ruby 2.2.0 con Rails 4.2 disminuye significativamente el consumo de memoria. ¡Lo intentaría!

 8
Author: scaryguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-07 18:42:38

Ruby 2.1.1 tenía un error en el Recolector de basura bien descrito por Sam Saffron:

Http://samsaffron.com/archive/2014/04/08/ruby-2-1-garbage-collection-ready-for-production

Estaba causando una especie de fuga de memoria. La solución es actualizar Ruby. Las versiones actuales soportadas por Heroku son 2.1.7 y 2.2.3.

 0
Author: Victor BV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-16 14:00:58

Tuve un problema similar. Estoy usando Ruby 2.3.1 y Rails 4.2.6, Heroku con Unicornio. Después de dos variables de configuración no se establecieron en mi aplicación antes. Configurarlos desde el terminal con el siguiente comando resolvió el problema para mí.

heroku config:set sensible_defaults=disabled
heroku config:set WEB_CONCURRENCY=1
 0
Author: techdreams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-22 06:27:52