2014-11-24 13 views
16

Recentemente ho implementato un aggiornamento di Ruby da 2.0 a 2.1.5 alla mia applicazione Web Heroku e sto costantemente colpendo gli errori di quota di memoria ora, mentre con 2.0 e 1.9 questo mai è accaduto. C'è un limite di 512 MB per un normale Heroku Dyno e sto eseguendo 2 processi con Unicorn, insieme a un thread con Sidekiq su due dynos.L'utilizzo della memoria aumenta con Ruby 2.1 rispetto a Ruby 2.0 o 1.9

Dopo aver letto Phusion Passenger memory consumption increase from 1.9.3 (system) to 2.1.2 (RVM) on Ubuntu, ho provato a impostare la variabile di ambiente RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR a 0,9 per disabilitare il garbage collector generazionale e ha migliorato un po 'il consumo di memoria, ma non mi ha lasciato nulla vicino a quanto 2.0 o 1.9 consumato. Dato che la memoria in questo momento è la mia preoccupazione principale, mi piacerebbe vedere se posso risolvere questo problema con Ruby 2.1.x invece di tornare a 2.0.

Ecco alcuni grafici che dimostrano il problema:

A poco prima 2:00, ho declassato a Ruby 2.0.0-p598 Ruby 2.1.5 ei problemi di memoria sono stati risolti e rimase sotto il limite.

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

Poi dopo cercai aggiornamento a rubino 2.1.5 ma modificando la variabile di ambiente RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR a 0.9. Come puoi vedere, l'utilizzo della memoria è leggermente migliore rispetto al grafico 2.1.5 originale, ma viola ancora la quota di memoria.

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

molto interessante. Avrei pensato [questo] (https://www.omniref.com/blog/blog/2014/11/18/ko1-at-rubyconf-2014-massive-garbage-collection-speedup-in-ruby-2- dot-2 /) era correlato ma curioso di vedere quale sia la risposta qui. – Anthony

+0

Anche in seguito al rilascio della versione 2.2, ma sono preoccupato che il loro focus sia in gran parte sui miglioramenti delle prestazioni rispetto ai miglioramenti del consumo di memoria, quindi sospetto che non sarà di grande aiuto. –

+0

Alcuni primi tester hanno riportato un minore ingombro di memoria a causa dell'aggiornamento del GC in 2.0.0-preview1. Potresti voler controllare. – Lenart

risposta

4

Questo è un problema noto con Ruby (versioni 2.1.x) e la sua raccolta dei rifiuti. Dopo aver letto paio di forum/blog post non sembra esserci nessuna vera soluzione, ma per fare una delle seguenti opzioni:

  • downgrade al rubino 2.0 e aspettare che ruby ​​2.2 per essere rilasciato
  • uso unicorn worker killer riavviare lavoratori unicorno una volta raggiunta certa quantità di memoria, impedendo Heroku R14 errori
  • alcuni suggeriscono tweaking le variabili GC (vedi here e here)

Ecco un link al relativo discussion on ruby-lang.

Alcune persone hanno anche notato che una fonte dei problemi potrebbe essere la gemma di NewRelic, quindi potresti voler aggiornare/rimuovere e vedere se è utile.

Crediti per alcuni dei collegamenti e informazioni ai ragazzi di upcase.com forum

+0

Per quanto riguarda i problemi di NewRelic gemma puoi aggiungere 'aggressive_keepalive: true' alla tua configurazione. Questo dovrebbe aiutare a risolvere i problemi di memoria causati dalla gemma newrelic. – Lenart

+0

Grazie a @Lenart, quelli sono buoni suggerimenti. Ho eseguito il downgrade alla 2.0 quando ho riscontrato questo problema, speriamo che la versione 2.2 risolva il problema, anche se sulla base di ciò che ho letto, non sono del tutto convinto che lo farà. Aggiornerò questo post non appena verrà rilasciato 2.2. –

+0

@ MatthewO'Riordan, eventuali aggiornamenti su 2.2? – Ari

12

Quindi la risposta è chiaramente l'aggiornamento alla versione 2.2 di Ruby.

Sono contento di vedere che l'utilizzo della memoria è effettivamente diminuito dopo l'aggiornamento a 2.2, mentre l'aggiornamento a 2.1 è stato un enorme aumento del consumo di memoria. Vedi il grafico qui sotto.

Memory usage with 2.2

Sul consumo di memoria più a sinistra sul 2.0 si siede a circa 386mb, quando sotto carico, mentre con 2.2 si trova ora a circa 365mb.

+0

Sto vedendo anche miglioramenti nel consumo di memoria in Ruby 2.2. Probabilmente dovresti contrassegnare la risposta come corretta. – kartikluke

+1

Ruby 2.2 è stabile con Rails 3.2? – Kelseydh