7

Per qualche motivo l'elaborazione delle immagini (carrierwave + minimagick) smette di funzionare circa una settimana dopo l'avvio del servizio. Non c'è un aumento insolito del traffico o dei processi di caricamento. Una volta che l'errore ENOMEM si verifica, tutto sembra "bloccato" e anche i successivi processi non riescono.Impossibile allocare memoria

Come posso "salvare" il sistema una volta che si trova in quel comportamento o addirittura impedire che ciò accada?

Alcuni degli errori:

Errno::ENOMEM (Cannot allocate memory - export LANG=C && identify -ping /tmp/mini_magick20111219-18047-1dhmawm.jpg 2>&1): 
    app/uploaders/photo_uploader.rb:70:in `custom_thumbnail' 
    app/controllers/upload_controller.rb:186:in `process_upload' 
    app/middleware/flash_session_cookie_middleware.rb:17:in `call' 
    app/middleware/flash_session_cookie_middleware.rb:17:in `call' 


Errno::ENOMEM (Cannot allocate memory - export LANG=C && mogrify -format jpg /tmp/mini_magick20111219-18047-1c43qpf.jpg 2>&1): 
    app/controllers/upload_controller.rb:186:in `process_upload' 
    app/middleware/flash_session_cookie_middleware.rb:17:in `call' 
    app/middleware/flash_session_cookie_middleware.rb:17:in `call' 

... 
... 

Errno::ENOMEM (Cannot allocate memory - export LANG=C && mogrify -resize "120x180" -gravity "Center" -extent "120x120" /tmp/mini_magick20111219-18047-155ofje.jpg 2>&1): 
    app/controllers/upload_controller.rb:186:in `process_upload' 
    app/middleware/flash_session_cookie_middleware.rb:17:in `call' 
    app/middleware/flash_session_cookie_middleware.rb:17:in `call' 

di memoria e spazio di swap informazioni: informazioni

Mem: 8193476k total, 7907152k used, 286324k free,  5968k buffers 
Swap: 12396808k total, 9494924k used, 2901884k free, 180308k cached 

Versione:

  • Rails 3.0.6
  • rubino 1.9.2p290
  • Apache 2.2.14
  • passeggero 3.0.9

Grazie!

+1

Un mucchio di perdite di memoria sono state corrette in Ruby 1.9.3. Suggerirei l'aggiornamento e vedere se questo aiuta. http://svn.ruby-lang.org/repos/ruby/tags/v1_9_3_0/ChangeLog – Thilo

+0

Grazie Thilo! Poiché la memoria di aggiornamento viene gestita molto meglio. – Florian

risposta

1

Non riesco a trovare la correzione corretta, ma una volta riavviato utilizzando capistrano (cap deploy:restart) le cose ricominciano a funzionare.

uso di Ruby 1.9.3p194 (2012-04-20 revisione 35410)

il problema inizia quando uso mini_magick in Carrierwave per manipolare!

def strip 
    manipulate! do |img| #where problem occurs 
     img.strip 
     img = yield(img) if block_given? 
     img 
    end 
    end 

mio registro:

{Impossibile allocare memoria - identificare -ping /tmp/mini_magick20121019-3337-pg50p9.jpg condiviso/bundle/ruby ​​/ 1.9.1/gemme/subexec-0.2.1/lib/subexec.rb: 71: in spawn' shared/bundle/ruby/1.9.1/gems/subexec-0.2.1/lib/subexec.rb:71:in spawn ' condiviso/bundle/ruby ​​/ 1.9.1/gems/subexec-0.2.1/lib/subexec.rb: 55: in run!' shared/bundle/ruby/1.9.1/gems/subexec-0.2.1/lib/subexec.rb:41:in run ' condiviso/bundle/ruby ​​/ 1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb : 405: in run' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:399:in run_command ' condivisa/pacco/rubino/1.9.1/gemme/mini_magick-3.4/lib/mini_magick.rb: 198: in valid?' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:163:in creare' condivisa/pacco/rubino/1.9.1/gemme /mini_magick-3.4/lib/mini_magick.rb:73:in read' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:134:in blocco aperto ' condivisa/pacco/rubino/1.9.1/gemme/mini_magick-3.4/lib/mini_magick.rb: 133: in open' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:133:in aperta' condiviso/bundle/ruby ​​/ 1.9.1/gems/carrierwave-0.6.2/lib/carrierwave/processing/mini_magick.rb: 245: in `manipola! '

1

Credo che questo sia lo stesso problema di quanto documentato qui.Gemme diverse, ma stesso effetto: http://adamniedzielski.github.io/blog/2014/02/05/fighting-paperclip-errno-enomem-error/

Il risultato di questo articolo è che "Per creare il processo figlio, la memoria libera deve essere maggiore della memoria acquisita dal processo padre.". Questo raccomanda l'uso della posix-spawn per evitare il problema. Questo non sembra essere fornito in Minimagick, quindi sarebbe necessario un qualche tipo di patch o soluzione alternativa.