2011-12-19 22 views
7

Por algún motivo, el procesamiento de imágenes (carrierwave + minimagick) deja de funcionar aproximadamente una semana después de que se inicia el servicio. No hay un aumento inusual en el tráfico o los procesos de carga. Una vez que se produce el error ENOMEM, todo parece "bloquearse" y los siguientes procesos también fallan.No se puede asignar memoria

¿Cómo puedo 'rescatar' el sistema una vez que está en ese comportamiento o incluso evitar que esto suceda?

Algunos de los errores:

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' 

de memoria y espacio de intercambio información: Información

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

Versión:

  • Rails 3.0.6
  • rubí 1.9.2p290
  • Apache 2.2.14
  • pasajeros 3.0.9

Gracias!

+1

Un montón de pérdidas de memoria se han solucionado en ruby ​​1.9.3. Sugeriría actualizar y ver si eso ayuda. http://svn.ruby-lang.org/repos/ruby/tags/v1_9_3_0/ChangeLog – Thilo

+0

¡Gracias Thilo! Dado que la memoria de actualización se maneja mucho mejor. – Florian

Respuesta

1

No puedo encontrar la solución correcta, pero una vez que reinicié el uso de capistrano (cap deploy:restart) las cosas comienzan a ejecutarse nuevamente.

utilizo Rubí 1.9.3p194 (2012-04-20 revisión 35410)

El problema comienza cuando uso mini_magick en Carrierwave a manipular!

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

Mi registro:

{No se puede asignar memoria - identificar -ping /tmp/mini_magick20121019-3337-pg50p9.jpg compartida/paquete/Ruby/1.9.1/joyas/subexec-0.2.1/lib/subexec.rb: 71: en spawn' shared/bundle/ruby/1.9.1/gems/subexec-0.2.1/lib/subexec.rb:71:in freza' compartido/bundle/ruby ​​/ 1.9.1/gemas/subexec-0.2.1/lib/subexec.rb: 55: en run!' shared/bundle/ruby/1.9.1/gems/subexec-0.2.1/lib/subexec.rb:41:in plazo ' shared/bundle/ruby ​​/ 1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb : 405: en run' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:399:in run_command ' compartido/bundle/ruby ​​/ 1.9.1/gemas/mini_magick-3,4/lib/mini_magick.rb: 198: en valid?' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:163:in crear' compartido/bundle/ruby ​​/ 1.9.1/gemas /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 bloque en abierto ' compartido/bundle/ruby ​​/ 1.9.1/gemas/mini_magick-3,4/lib/mini_magick.rb: 133: en open' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:133:in abierto' shared/bundle/ruby ​​/ 1.9.1/gems/carrierwave-0.6.2/lib/carrierwave/processing/mini_magick.rb: 245: en `manipular! '

1

Creo que este es el mismo problema documentado aquí.Diferentes gemas, pero con el mismo efecto: http://adamniedzielski.github.io/blog/2014/02/05/fighting-paperclip-errno-enomem-error/

El resultado de este artículo es que "para crear el proceso secundario, la memoria libre debe ser mayor que la memoria tomada por el proceso principal". Esto recomienda el uso del posix-spawn para evitar el problema. Esto no parece estar provisto en Minimagick, por lo que se necesitaría algún tipo de parche o solución alternativa.

Cuestiones relacionadas