7

由于某种原因,处理图像(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
  • 红宝石 1.9.2p290
  • 阿帕奇 2.2.14
  • 乘客 3.0.9

谢谢!

4

2 回答 2

1

我找不到正确的修复程序,但是一旦我使用 capistrano ( cap deploy:restart) 重新启动,事情就会再次开始运行。

我使用 Ruby 1.9.3p194(2012-04-20 修订版 35410)

当我在 Carrierwave 中使用 mini_magick 进行操作时,问题就开始了!

  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:in 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在运行中共享/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:405:在 run' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:399:in 运行命令'shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:198:in create'shared 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:in read' shared/bundle/ruby/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:134:in block in 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/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:in `manipulate!'

于 2012-10-19T02:43:03.050 回答
1

我相信这与此处记录的问题相同。不同的宝石,但效果相同: http: //adamniedzielski.github.io/blog/2014/02/05/fighting-paperclip-errno-enomem-error/

这篇文章的结论是“要创建子进程,空闲内存必须大于父进程占用的内存”。这建议使用 posix-spawn 来避免这个问题。Minimagick 中似乎没有提供此功能,因此需要某种补丁或解决方法。

于 2014-12-05T01:09:15.680 回答