2013-06-04 5 views
5

Я пытался использовать работник дино 2X, ожидая, чтобы не получить ошибки R14, но это результат:Heroku работник дино давая R14 ошибки - проблемы с управлением памятью - предельные варианты RMagick памяти

2013-06-04T13:03:30.723260+00:00 heroku[worker.1]: Process running mem=1047M(102.3%) 
2013-06-04T13:03:30.723260+00:00 heroku[worker.1]: Error R14 (Memory quota exceeded) 

Однако задача для работника завершена успешно.

Вопросы:

  • Как я могу уменьшить память, необходимую для своей работы? - Я использую rmagick gem, чтобы преобразовать список изображений в один многостраничный pdf.
  • Насколько опасно поддерживать этот процесс (с ошибками R14), поскольку окончательная работа заканчивается успешно?

Заранее спасибо

+0

Вы выполняете только одну из этих заданий за раз в sidekiq? То есть, 1 занятие занимает 1 гигабайт памяти? –

+0

Кажется, что у gem rmagick, который я также использую, есть утечки памяти: http://stackoverflow.com/questions/958681/how-to-deal-with-memory-leaks-in-rmagick-in-ruby – josal

ответ

5

я, наконец, нашел решение. Проблема была в rmagick. Он получает всю память, которую видит. Неважно, если вы используете 2X рабочий dyno вместо 1X. Он растет до максимально доступных ресурсов. Итак, we have to set a limit. Но в моем случае не все ограничения работали.

Вы можете сделать системный вызов, непосредственно следующим образом:

convert -limit memory 0 -limit map 0 list_of_input_files output_file

Таким образом, можно избежать использования кэш-памяти, происходит непосредственно в кэш диска. Это единственный способ избежать ошибок R14 в heroku. С другими комбинациями, такими как -limit memory 32 -limit map 64 или аналогичными, это всегда давало мне ошибки. Я принял идею from here.

Конечно, вы всегда можете использовать rmagick library с этой линией, однако он не работает для меня, и я действительно использовал подход системного вызова объяснял ранее:

Magick.limit_resource(:memory, 0) 
Magick.limit_resource(:map, 0) 

UPDATE: Я использовал nice чтобы обеспечить более высокий приоритет. Кажется, он улучшается, но в конечном итоге я получаю ошибки R14, но это правда, что они не так часто (даже с одним и тем же файлом!).

+0

Возможно вы должны попробовать [minimagick] (https://github.com/minimagick/minimagick) – shinnyx

+0

Я попробовал, но теперь я не могу вспомнить, почему я его не выбрал. Спасибо, в любом случае. – josal

+0

Great find @josai – Trip

0

Немного поздно для вечеринки, но в моем случае сборщик мусора был моим спасителем. Просто запустите GC.start после каждой работы.

+0

Спасибо за ваш ответ. – josal

Смежные вопросы