2012-11-09 11 views
15

Ho un'applicazione Rails 3.2.8 in esecuzione su Heroku Cedar con Ruby 1.9.3. L'app funziona correttamente quando viene avviata, ma dopo un giorno o più di uso continuo, comincio a vedere errori R14 sui miei registri. Una volta che gli errori di memoria iniziano, non vanno mai via, anche se l'app è inattiva per diverse ore.Come posso trovare una perdita di memoria su Heroku?

Il raccoglitore di rifiuti non deve pulire dopo un po 'gli oggetti inutilizzati e ridurre il carico di memoria? Sembra che questo non stia accadendo su Heroku. Generalmente, l'utilizzo della memoria inizia a insinuarsi dopo l'esecuzione di alcuni report con diverse migliaia di righe di dati, sebbene i risultati siano impaginati.

Come posso trovare la perdita di memoria? I plugin come bleak_house sono obsoleti o non funzionano bene nell'ambiente Heroku. Posso regolare le impostazioni del GC per renderlo più aggressivo?

risposta

5

Il GC dovrebbe eseguire la pulizia e probabilmente lo fa.

È possibile forzare il GC con GC.start; se molti oggetti non sono stati raccolti, lo farò, ma sospetto che non sia questo il problema.

È possibile in qualche modo creare un gruppo di oggetti e non rilasciarli mai, mantenendo copie della cache o qualcosa del genere?

Non ho familiarità con gli strumenti esistenti per verificarlo, ma potresti voler controllare quali oggetti esistono usando ObjectSpace. Per esempio:

ObjectSpace.each_object.with_object(Hash.new(0)){|obj, h| h[obj.class] +=1 } 
# => a Hash with the number of objects by class 

Se si ottiene un numero inaspettato per una delle classi, per esempio, si avrebbe una migliore idea di dove cercare.

-1

Installare il nuovo componente aggiuntivo Relic. Ha un sacco di metriche utili che è possibile utilizzare per scoprire la fonte della perdita. Penso che sia generalmente un'idea migliore per cercare di capire quale parte del codice impiega più tempo per essere eseguita e magari cercare di ottimizzarla, piuttosto che modificare il GC a titolo definitivo.

Alcune delle funzioni offerte da New Relic includono la possibilità di individuare l'origine della query SQL più lunga, ad esempio. Ti incoraggio a fare un tentativo.

+2

Ho una nuova reliquia installata ma non mi fornisce il livello di dettaglio di cui ho bisogno –

+1

newrelic è abbastanza inutile per risolvere i problemi di memoria. Ti dà alcune informazioni su GC, ma niente da segnalare. – 2mia

+0

concordato. NewRelic è utile per molte cose, ma il debug delle perdite di memoria non è tra queste. – bloudermilk