Rails 4 Erreur R14 sur Heroku (de Mémoire le Quota est Dépassé)
J'ai été faire les (apparemment commune) Erreur R14, vous ne savez pas quand cela a commencé, mais il a remarqué après l'installation de la Papertrail add-on. J'ai également ajouté oink après avoir vu d'autres en ont fait mention. J'ai essayé tout ce que d'autres ont essayé chez d'autres questions, mais je n'arrive pas à trouver le problème /de la fuite de mémoire.
Error R14 (Memory quota exceeded)
heroku/web.1: Process running mem=587M(114.7%)
Quand je vois cela, temporairement résoudre ce problème, j'ai exécuter heroku restart
qui fonctionne pour un certain temps, mais je tiens à corriger ce problème de façon permanente.
De ce que je peux voir dans Papertrail, l'application continue à charger la même page (page d'accueil) maintes et maintes fois (et ce n'est pas de trafic de l'utilisateur):
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
et au bout de 2 minutes:
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 `
J'ai aussi activé heroku labs:enable log-runtime-metrics
à partir des instructions à partir d'une autre question ici et de Heroku ici
J'ai également ajouté une Nouvelle Relique ajouter-et c'est ce que je vois dans le Suivi > onglet Instances:
Pour les 7 Derniers Jours:
Pour les Dernières 24 Heures:
Je suis confus comme vous pouvez le voir après 5/24 l'utilisation de la mémoire est descendu et a, depuis, resté en bas, mais dans les journaux, il affiche la mémoire utilisée mem=587M(114.7%)
et dans les dernières 24 heures, une moyenne de 150 M, donc je ne comprends pas ce qui se passe. J'espère que quelqu'un peut vous aider. Merci.
Mise À Jour 1: Ajout D'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
Mise à jour 2: modification du serveur de Puma à la Licorne
C'était assez simple, en suivant les instructions ici. Et c'est à quoi il ressemble maintenant, ce qui semble bon, mais je soupçonne que c'était parce que la demande a été redémarré:
# 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
Mise à jour 3: réduction de la quantité de la Licorne travailleurs à 2
Après avoir fait cela, c'est la moyenne de l'utilisation de la mémoire par dyno/instance pour les 6 dernières heures, selon une Nouvelle Relique:
Et la sortie dans PaperTrain (et j'ai aussi essayé LogEntries) est-ce que:
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
J'ai vérifié les logs, et après 1 heure je recevais la R14 erreur et maintenant il a été fait très peu, presque stable à 432MB et n'ont pas obtenu l'erreur plus. Donc, cela semble avoir résolu le problème! Je mettrai à jour au fil du temps si cela change.
- Ce que ruby version utilisez-vous? Postez votre Gemfile ainsi.
- Je suis à l'aide de ruby 2.1.1 et a ajouté gemfile
- Autant que je sache, Puma n'est pas vraiment conçu pour l'IRM, ne dis pas que c'est la raison, mais pouvez-vous essayer de Licorne? (À l'aide de Puma ne vous donne pas quelque chose de toute façon). Citation tirée du site internet: "Puma est conçu pour être utilisé sur un Rubis de mise en œuvre qui offre un véritable parallélisme, comme Rubinius et JRuby."
- J'ai changé le serveur comme vous l'avez suggéré, et comme vous pouvez le voir dans "Update 2", il a aidé d'une certaine manière.
Vous devez vous connecter pour publier un commentaire.
Si Papertrail est à l'origine du problème, essayez un autre add-on. J'ai été en utilisant LogEntries sans trop de problème. https://addons.heroku.com/#logging
Également essayer de réduire votre Licorne processus de travail de sorte qu'il utilise le plus faible total de la mémoire. Au lieu de la valeur par défaut de 3 (par boîte/puissance), essayez 2.
https://devcenter.heroku.com/articles/rails-unicorn#unicorn-worker-processes
Vous pouvez également exécuter un profileur de mémoire sur votre application:
http://timetobleed.com/memprof-a-ruby-level-memory-profiler/
https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=profil
WEB_CONCURRENCY
variable d'environnement?config/unicorn.rb
, mine, en défaut avecworker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
ce sens qu'il semble pour leWEB_CONCURRENCY
env variable, alors la valeur par défaut est 3 si il ne le trouve pas.Digital Ocean a écrit un excellent article à ce sujet.
Tuer Des Licornes peut fonctionner dans certaines situations... cependant, certaines personnes peuvent avoir des préoccupations d'ordre éthique avec cette approche.
Si vous êtes à l'aide de Rails 4 avec Ruby 2.1, je parie que le seul changement que vous devez faire est de déclassement de Ruby 2.0 dos.
J'ai passé 2 jours à la figure et je suis venu avec cette idée avec Heroku du soutien de suggestions. Je pense que c'est un bug ou quelque chose comme ça avec Ruby 2.1 ou des Rails 4.
Mise à jour en avril 2015:
À l'époque, la rétrogradation n'a fonctionné comme une solution. Mais bon, c'est vraiment pas une méthode recommandée pour la résolution de problèmes... Certaines personnes disent la mise à niveau de à Ruby 2.2.0 avec des Rails 4.2 diminue de manière significative la consommation de mémoire. Je voudrais lui donner un essai!
Ruby 2.1.1 avait un bug dans le Garbage Collector bien décrite par Sam Safran:
http://samsaffron.com/archive/2014/04/08/ruby-2-1-garbage-collection-ready-for-production
Il était à l'origine une sorte de fuite de mémoire. La solution est de mettre à jour Ruby. Actuel Heroku versions prises en charge sont 2.1.7 et 2.2.3.
J'ai eu un problème similaire. Je suis à l'aide de Ruby 2.3.1 et les Rails 4.2.6 , Heroku à la Licorne. À la suite de deux variables de configuration n'ont pas été mis dans mon application avant. Réglage depuis le terminal avec la commande suivante résolu le problème pour moi.