Rails resque потребляет рабочую память

Я использую resque gem для обработки моего фонового процесса.

Я установил три очереди с одним работником в каждой.

Может ли кто-нибудь объяснить, как расходуется память при увеличении и уменьшении числа рабочих в очереди.

Я слышал, что каждый рабочий процесс загружает отдельную среду Rails. Это правда?


person Gagan    schedule 29.08.2011    source источник


Ответы (2)


Насколько я знаю, да, каждый воркер запускает отдельную среду Rails, поэтому, если у вас три воркера, у вас будет загружено три среды Rails. Наличие большего количества рабочих не приведет к увеличению вашей очереди, это будет количество заданий в очереди, что заставит ее расти.

В любом случае, если у вас нет серьезной причины иметь 3 отдельных воркера, я предлагаю вам иметь только одного воркера для всех очередей и разделять их по мере масштабирования вашего приложения со временем.

person cicloon    schedule 29.08.2011
comment
Resque не загружает среду rails, по сути, не загружая rails и низкое потребление памяти, это как раз и есть основные цели проекта. см. здесь: github.com/blog/542-introduction-resque - person Henry Mazza; 27.03.2012
comment
@HenryMazza да, он загружает среду Rails. Запустите процесс Resque, затем измените код приложения (обновите воркер), запустите воркер и посмотрите, как Resque запускает старый код. Вот почему при развертывании изменений вам необходимо перезапустить процессы Resque. - person Damien Roche; 12.10.2013

Это неправда. Как я объяснил в своем комментарии здесь, точная цель Resque состоит не в том, чтобы загрузить среду rails для каждого работника (см. https://github.com/blog/542-introduction-resque).

Из-за ограничения, вызванного зеленым trheading-решением ruby, вы должны запустить по крайней мере одного рабочего на ядро ​​процессора, чтобы иметь возможность использовать весь ЦП. Вот почему Resque по умолчанию запускает каждый рабочий процесс в отдельном процессе. Это означает запуск N параллельных процессов одновременно, каждый из которых загружает полный набор драгоценных камней независимо. Это основная причина большого использования памяти для Resque и любого другого инструмента Ruby. Вы можете увидеть здесь, как можно улучшить ситуацию, используя родная многопоточность с JVM.

Поэтому, если вы хотите уменьшить использование памяти Resque, старайтесь, чтобы ваши рабочие зависимости были как можно меньше. И всегда очень важно использовать инструмент мониторинга, такой как God или Bluepill, чтобы следить за процессом.

person Henry Mazza    schedule 27.03.2012
comment
Я думаю, вы путаете рабочих с рабочими местами. Конечно, Resque загружает среду не для каждого задания, а для каждого работника. Когда новое задание ставится в очередь, resque разветвляет рабочий процесс, чтобы ему не приходилось снова загружать среду, и чтобы основной рабочий процесс не зависал в случае сбоя задания. - person cicloon; 28.03.2012
comment
Чтобы прояснить это, взгляните на файл readme Resque: по умолчанию Resque не знает о среде вашего приложения. То есть он не сможет найти и запустить ваши задания — ему нужно загрузить ваше приложение в память. Если мы установили Resque как плагин для Rails, мы можем запустить эту команду из нашего RAILS_ROOT: $ QUEUE=file_serve rake environment resque:work - person cicloon; 28.03.2012
comment
По умолчанию Resque не знает о среде вашего приложения. - Он не будет загружаться, пока вы не скажете. Если вас беспокоит потребление памяти, вам не следует использовать среду. Например, если вы запустите 4 рабочих с окружением, рельсы будут загружаться в память 4 раза. Так что, если вы делаете свой код зависимым, это ваша вина, а не их. Даже в этом случае вы можете оптимизировать, например загружать только активную запись, если вы хотите выполнять задания базы данных. При моем ежедневном использовании рабочий никогда не использует более 20 МБ бездействия со всеми загруженными моими библиотеками. Только Rails весит более 60 МБ. - person Henry Mazza; 28.03.2012