2013-06-04 9 views
5

ho provato ad utilizzare un banco operaio 2X, in attesa di non ottenere R14 errori, ma questo è il risultato:Heroku banco operaio che dà R14 errori - problemi con la gestione della memoria - opzioni di limite di memoria RMagick

2013-06-04T13:03:30.723260+00:00 heroku[worker.1]: Process running mem=1047M(102.3%) 
2013-06-04T13:03:30.723260+00:00 heroku[worker.1]: Error R14 (Memory quota exceeded) 

Tuttavia, l'attività per il lavoratore è stata completata correttamente.

Domande:

  • Come posso ridurre la memoria necessaria per il mio lavoro? - Sto usando rmagick gem per convertire una lista di immagini in un unico pdf multipagina.
  • Quanto è pericoloso mantenere il processo in questo modo (con errori R14) mentre il lavoro finale sta terminando con successo?

Grazie in anticipo

+0

Stai eseguendo solo 1 di questi lavori alla volta in sidekiq? Cioè, 1 lavoro richiede 1 gig di memoria? –

+0

Sembra che la gemma rmagick che sto usando abbia anche perdite di memoria: http://stackoverflow.com/questions/958681/how-to-deal-with-memory-leaks-in-rmagick-in-ruby – josal

risposta

5

ho finalmente trovato una soluzione. Il problema era con rmagick. Ottiene tutta la memoria che vede disponibile. Non importa se usi un dyno 2X worker invece di 1X. Cresce al massimo delle risorse disponibili. Quindi, we have to set a limit. Ma nel mio caso non tutti i limiti hanno funzionato.

È possibile effettuare una chiamata di sistema direttamente in questo modo:

convert -limit memory 0 -limit map 0 list_of_input_files output_file

In questo modo, si evita di utilizzare la memoria cache, andando direttamente alla cache del disco. Questo è l'unico modo per evitare errori R14 in heroku. Con altre combinazioni come -limit memory 32 -limit map 64 o simili, mi ha sempre dato errori. Ho preso l'idea from here.

Naturalmente, si può sempre utilizzare il rmagick library con queste righe, ma non ha funzionato per me e mi ha fatto usare l'approccio syscall spiegato prima:

Magick.limit_resource(:memory, 0) 
Magick.limit_resource(:map, 0) 

UPDATE: Ho usato il nice comando per garantire più priorità. Sembra che migliori, ma alla fine ricevo errori R14, ma è vero che non sono così frequenti (anche con lo stesso file!).

+0

Forse dovresti provare [minimagick] (https://github.com/minimagick/minimagick) – shinnyx

+0

L'ho provato ma non riesco a ricordare ora perché non l'ho scelto. Grazie comunque. – josal

+0

Great find @josai – Trip

0

Un po 'tardi per la festa, ma nel mio caso il netturbino era il mio salvatore. Basta eseguire GC.start dopo ogni lavoro.

+0

Grazie per la risposta. – josal