出于某种原因,处理图像(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
版本信息:
谢谢!
答案 0 :(得分: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 共享/束/红宝石/ 1.9.1 /宝石/ 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
产卵” 共享/束/红宝石/ 1.9.1 /宝石/ 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
运行” 共享/束/红宝石/ 1.9.1 /宝石/ 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
run_command” 共享/束/红宝石/ 1.9.1 /宝石/ 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
创建” 共享/束/红宝石/ 1.9.1 /宝石/ 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
阻止打开' 共享/束/红宝石/ 1.9.1 /宝石/ 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
开放” 共享/束/红宝石/ 1.9.1 /宝石/ carrierwave-0.6.2 / LIB / carrierwave /处理/ mini_magick.rb:245:在 `操纵!
答案 1 :(得分:1)
我认为这与此处记载的问题相同。不同的宝石,但效果相同:http://adamniedzielski.github.io/blog/2014/02/05/fighting-paperclip-errno-enomem-error/
本文的结论是“要创建子进程,可用内存必须大于父进程占用的内存。”这建议使用posix-spawn来避免这个问题。这似乎没有在Minimagick中提供,因此需要某种补丁或解决方法。