2012-11-17 11 views
5

Quindi ho questa app di rotaie con un orribile problema di perdita di memoria. Lo sto eseguendo su Heroku e negli ultimi due giorni, mentre cercavo di capire cosa stavo causando, ho dovuto continuamente riavviare l'app ogni 5 ore circa o la memoria supera 512 e la mia app si blocca.Perdita di memoria nell'app Rails ... string night

Sto usando Oink e non vedo nulla di strano con le mie lezioni istanziate. L'unica cosa è che con ogni caricamento della pagina, la memoria utilizzata si insinua. Non importa nemmeno quale pagina carico, è apparentemente casuale.

New Relic non è stato di grande aiuto, poiché non ha a che fare con una particolare azione del controller.

L'unica cosa che sono riuscito a trovare è stata l'utilizzo di ObjectSpace, che ha rivelato un numero ENORME di oggetti stringa in memoria e il numero cresce e cresce. Ho usato un piccolo strumento per registrare il valore delle stringhe e sono tutte vuote. Non nulla ... ma spazio bianco. La mia app di produzione ha regolarmente oltre 200.000 oggetti stringa in uso.

Qualcuno ha qualche idea di cosa potrebbe derivare? Questo è davvero stressante per me dover stare al mio computer ogni cinque ore per mantenere vivo il mio sito.

Grazie!

+1

Difficile dare un consiglio specifico diverso dalla semplice rimozione del codice finché non si ha il più piccolo esempio possibile che presenta il problema e postare quello –

+0

ed eseguirlo su un server alternativo, e colpirlo con richieste CURL costanti fino a quando non si può effettuare la riproduzione. – peterept

+0

consiglio: non eseguire 'stringa = stringa1 + stringa 2', né' stringa + = stringa1'. Do: 'stringa << stringa 1', nessuna stringa aggiuntiva viene creata in questo modo – apneadiving

risposta

8

Ok, questo è assolutamente ridicolo, ma dopo due settimane di ansia e di lotta, ho trovato la soluzione a questa perdita. E 'letteralmente tutto si riduce a questo una riga:

ActionMailer::Base.delivery_method = :smtp 

nel mio file di configurazione application.rb.

Avrebbe dovuto essere:

config.action_mailer.delivery_method = :smtp 

Non ho idea di come mi sono sbagliato, ma il ragazzo ha fatto devastare la mia app.

Qualcuno sa perché questo potrebbe causare un tale problema? Stavo perdendo circa un megabyte di memoria su ogni singola query. Pazzo.

+1

Grazie per questo, probabilmente mi hai appena risparmiato un serio mal di testa. – tyler

+1

Come hai capito? L'app My Rails sta facendo impazzire le stringhe e non ho idea di come tracciare ciò che le sta creando. –

+2

@MihaRekar è stato terribile. Ho dovuto letteralmente tornare indietro nel tempo attraverso mesi di commit, caricamento e avvio di ciascuno, e poi martellare il server con richieste usando lo strumento di benchmark Apache fino a quando ho trovato la revisione che non aveva problemi.Poi, pezzo per pezzo, ho rimosso ogni modifica finché non ho trovato quello che ha fatto fermare la perdita. Ci sono voluti giorni. –