2010-06-28 19 views
5

Sto usando collectiveidea's delayed_job con la mia app Ruby on Rails (v2.3.8) e ho eseguito circa 40 processi in background con esso su una macchina Slicehost RAM da 8GB (Ubuntu 10.04 LTS, Apache 2).Lavori ritardati che perdono memoria?

Diciamo che ssh nel mio server senza operatori in esecuzione. Quando faccio il numero free -m, vedo che generalmente utilizzo circa 1 GB di RAM su 8. Quindi, dopo aver avviato i lavoratori e aver atteso circa un minuto per il loro utilizzo da parte del codice, sono fino a circa 4 GB. Se torno tra un'ora o due, sarò a 8 GB e nella memoria di scambio e il mio sito Web genererà 502 errori.

Finora ho appena ucciso e riavviato i lavoratori, ma preferirei risolvere la radice del problema. qualche idea? Si tratta di una perdita di memoria? Oppure, come suggerito da un amico, devo trovare un modo per eseguire la garbage collection?

+0

Suona come una perdita di memoria, ma può essere nel tuo codice eseguito da deleayed_job, non deve essere in delayed_job. qualche codice da recensire potrebbe aiutare. – jigfox

+0

ricorda anche che 1.9 e 1.8 non restituiranno mai memoria al sistema operativo. – tliff

risposta

-3

Quasi ogni volta che qualcuno chiede questo, il problema è nel loro codice. Prova a utilizzare uno degli strumenti di profilatura disponibili per scoprire dove perde il tuo lavoro. (https://github.com/wycats/ruby-prof o simile.)

L'attivazione di GC alla fine di ogni lavoro riduce il consumo massimo di memoria al costo di ridurre il throughput. Tuttavia, non impedirà a Ruby di gonfiarsi fino alla dimensione massima richiesta da un singolo lavoro, dal momento che Ruby non può liberare memoria nel sistema operativo. Non consiglio di adottare questo approccio.