Как правильно использовать (управлять) память в Delayed job?

Кажется, что вопрос фундаментальный. Delayed job - не смотря на свои недостатки и преимущества sidekiq и resque кажется самым популярным и часто используемым, но как быть с тривиальной проблемой, разобраться не получается.

Одна из особенностей delayed job в сравнении с аналогами в том, что он работает в постоянном процессе и не пользуется форками. Одновременно с этим, особенностью руби является то, что его сборщик мусора работает стихийно и память системе не возвращает, а просто помечает свободной. Поэтому в советах обычно пишут, что процессы лучше перезапускать.

В итоге такая проблема с DJ: неважно, исполняя простые или сложные задачи, память потихоньку занимает все, что можно. Ошибки не в коде, т.к., что реальные задачи, что просто создание хэшей, например, и последующее присваивание nil и GC.start приводят к одному результату - память, занимаемая процессом delayed_job растет.

Если перезагрузить процесс во время выполнения задания, то задание оборвется и никогда не будет выполнено (следующие будут работать без проблем)

Конечно, можно попробовать сделать перезагрузку процесса после каждой операции, а так же перезапуск провалившихся... Но как-то это сильно костыльно, плюс сейчас кажется, что этот сценарий (постепенное увеличение памяти) постигнет любую задачу, как же тогда правильно пользоваться DJ ?
  • Вопрос задан
  • 2504 просмотра
Пригласить эксперта
Ответы на вопрос 1
@bmalets
Как на счет утилиты god?
Там можно задавать допустимый размер используемой памяти.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы