Не могу выделить память - PullRequest
       18

Не могу выделить память

7 голосов
/ 19 декабря 2011

По какой-то причине обработка изображений (carrierwave + minimagick) перестает работать примерно через неделю после запуска сервиса.Там нет необычного увеличения трафика или загрузки процессов.Как только возникает ошибка ENOMEM, кажется, что все «блокируется», и любые последующие процессы также дают сбой.

Как я могу «спасти» систему, когда она находится в таком поведении, или даже предотвратить это?

Некоторые ошибки:

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'

Информация о памяти и пространстве подкачки:

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

Информация о версии:

  • Рельсы 3.0.6
  • ruby ​​1.9.2p290
  • Apache 2.2.14
  • пассажирский 3.0.9

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 декабря 2014

Я считаю, что это та же проблема, что и здесь.Различные драгоценные камни, но тот же эффект: http://adamniedzielski.github.io/blog/2014/02/05/fighting-paperclip-errno-enomem-error/

Результатом этой статьи является то, что «Чтобы создать дочерний процесс, свободная память должна быть больше, чем память, занятая родительским процессом.».Рекомендуется использовать posix-spawn, чтобы избежать проблемы.Это не предусмотрено в Minimagick, поэтому потребуется какое-то исправление или обходной путь.

1 голос
/ 19 октября 2012

Я не могу найти нужное исправление, но после перезапуска с использованием capistrano (cap deploy:restart) все снова начинает работать.

Я использую Ruby 1.9.3p194 (2012-04-20 revision 35410)

Проблема начинается, когда я использую mini_magick в Carrierwave, чтобы манипулировать!

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

Мой журнал:

{Невозможно выделить память - определить -ping /tmp/mini_magick20121019-3337-pg50p9.jpg shared / bundle / ruby ​​/ 1.9.1 / gems / subexec-0.2.1 / lib / subexec.rb: 71: в spawn' shared/bundle/ruby/1.9.1/gems/subexec-0.2.1/lib/subexec.rb:71:in spawn'shared / bundle / ruby ​​/ 1.9.1 / gems / subexec-0.2.1 / lib / subexec.rb: 55: в run!' shared/bundle/ruby/1.9.1/gems/subexec-0.2.1/lib/subexec.rb:41:in запустите' shared / 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 'shared / bundle / ruby ​​/ 1.9.1 / gems / mini_magick-3.4 / lib / mini_magick.rb: 198: в valid?' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:163:in создать' общий / bundle / ruby ​​/ 1.9.1 / gems / mini_magick-3.4 / lib / mini_magick.rb: 73: в read' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:134:in блоке в открытом 'shared / bundle / ruby ​​/ 1.9.1 / gems / mini_magick-3.4 / lib / mini_magick.rb: 133: вopen' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:133:in open 'shared / bundle / ruby ​​/ 1.9.1 / gems / carrierwave-0.6.2 / lib / carrierwave / processing / mini_magick.rb: 245: в "манипулировать!"

...