2014-11-24 7 views
16

Ich habe kürzlich ein Upgrade von Ruby von 2.0 auf 2.1.5 auf meine Heroku-Webapplikation angewendet, und ich treffe ständig Speicherquotenfehler, während dies bei 2.0 und 1.9 niemals der Fall ist passiert. Es gibt ein Limit von 512MB für ein normales Heroku-Dyno, und ich führe 2 Prozesse mit Unicorn aus, zusammen mit einem Thread mit Sidekiq über zwei Dynos.Speicherauslastung mit Ruby 2.1 gegenüber Ruby 2.0 oder 1.9

Nachdem ich Phusion Passenger memory consumption increase from 1.9.3 (system) to 2.1.2 (RVM) on Ubuntu gelesen habe, habe ich versucht, die Umgebungsvariable RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR auf 0,9 zu setzen, um Generationsmüllsammler zu deaktivieren, und es hat den Speicherverbrauch etwas verbessert, aber ließ mich nirgendwo in der Nähe was 2.0 oder 1.9 konsumiert. Da Speicher im Moment mein Hauptanliegen ist, würde ich gerne sehen, ob ich dieses Problem mit Ruby 2.1.x beheben kann anstatt zu 2.0 zurückzukehren.

Hier sind einige Diagramme das Problem demonstriert:

um kurz vor 14.00 Uhr, stufte ich Ruby 2.0.0-p598 Ruby 2.1.5 und die Speicherprobleme wurden gelöst und blieb unter der Grenze.

moving from 2.1.5 to 2.0.0 Heroku moving from 2.1.5 to 2.0.0 New Relic

Dann später habe ich versucht, Ruby 2.1.5 upgraden, aber die Umgebungsvariable RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR-0,9 Einstellung. Wie Sie sehen können, ist die Speichernutzung etwas besser als die ursprüngliche 2.1.5-Grafik, durchbricht aber immer noch die Speicherquote.

moving from 2.0.0 to 2.1.5 with <code>RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR</code> to 0.9 Heroku moving from 2.0.0 to 2.1.5 with <code>RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR</code> to 0.9 New Relic

+0

sehr interessant. Ich hätte gedacht [that] (https://www.omniref.com/blog/blog/2014/11/18/ko1-at-rubyconf-2014-massive-garbage-collection-speedup-in-ruby-2- dot-2 /) war verwandt, aber neugierig, was die Antwort hier ist. – Anthony

+0

Ich habe auch die Version 2.2 verfolgt, aber ich bin besorgt, dass ihr Fokus hauptsächlich auf Leistungsverbesserungen im Gegensatz zu Speicherverbrauchsverbesserungen liegt, also vermute ich, dass es nicht viel helfen wird. –

+0

Einige frühe Tester haben aufgrund des aktualisierten GC in 2.0.0-preview1 einen geringeren Speicherbedarf gemeldet. Vielleicht möchten Sie es überprüfen. – Lenart

Antwort

4

Dies ist ein bekanntes Problem mit Rubin (Versionen 2.1.x) und seine Garbage Collection. Nach dem Lesen paar Foren/Blog-Posts scheint es keine wirkliche Lösung zu sein, aber eine der folgenden Funktionen ausführen:

  • Herabstufung 2,0 bis Ruby und Ruby 2.2 warten, bis
  • Verwendung unicorn worker killer freigegeben Einhorn Arbeiter neu zu starten sobald sie
  • bestimmte Menge an Speicher, verhindert Heroku R14 Fehler erreichen vorschlagen einige GC Variablen Tweaking (siehe here und here)

Hier ist ein Link zu relevanten discussion on ruby-lang.

Einige Leute haben auch bemerkt, dass eine Quelle der Probleme das Juwel von NewRelic sein könnte, also möchten Sie es vielleicht aktualisieren/entfernen und sehen, ob es hilft.

Credits für einige Links und Informationen zu Jungs aus upcase.com Forum

+0

In Bezug auf NewRelic Gem Probleme können Sie 'aggressive_keepalive: true' zu ​​Ihrer Konfiguration hinzufügen. Dies sollte helfen, Speicherprobleme zu lösen, die durch newrelic gem verursacht werden. – Lenart

+0

Danke @Lenart, das sind gute Vorschläge. Ich habe auf 2.0 heruntergestuft, als ich dieses Problem hatte, hoffentlich löst die Version 2.2 das Problem, obwohl ich basierend auf dem, was ich gelesen habe, nicht ganz davon überzeugt bin. Ich werde diesen Beitrag aktualisieren, sobald 2.2 veröffentlicht wird. –

+0

@ MatthewO'Riordan, irgendwelche Updates auf 2.2? – Ari

12

So ist die Antwort ein Upgrade ist eindeutig auf Ruby-Version 2.2.

Ich bin beeindruckt zu sehen, dass die Speicherauslastung nach dem Upgrade auf 2.2 tatsächlich gesunken ist, während die Aktualisierung auf 2.1 einen enormen Anstieg des Speicherverbrauchs ergab. Siehe die Grafik unten.

Memory usage with 2.2

Auf dem Speicherverbrauch ganz links auf 2,0 sitzt auf rund 386mb unter Last, während mit 2,2 sie bei rund 365mb sitzt jetzt.

+0

Ich sehe Verbesserungen bei der Speicherbelegung in Ruby 2.2. Sie sollten die Antwort wahrscheinlich als richtig markieren. – kartikluke

+1

Ist Ruby 2.2 mit Rails 3.2 stabil? – Kelseydh