2016-05-06 3 views
1

У меня есть приложение Rails 4 на Heroku с Resque и Resque Scheduler, каждый из которых работает на отдельных динамиках 1x. В настоящее время у меня 3 работника Resque.Оптимизация использования памяти для Resque

Вот мой Procfile для справки:

web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development} 
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 bundle exec rake resque:workers QUEUE='*' COUNT='3' 
scheduler: bundle exec rake resque:scheduler 

Когда я ProFile использования памяти, я могу видеть, что на холостом ходу, мой resque дино потребляет 390MB 512 МБ доступной памяти, в то время как мой web дино потребляет только 262 МБ памяти. На первый взгляд это выглядит нормально, так как у меня много места для отдыха.

Когда я поставил в очередь 40 писем, которые будут разосланы на resque дино, хотя использование памяти увеличится до 480 МБ. Если я стану больше в очереди, он будет расти до тех пор, пока он не превысит емкость dyno, и я получаю ошибку R14. Обратите внимание, что я не отправляю электронные письма с использованием API SendGrid, а не через SMTP, но у меня все еще есть render_to_string каждый шаблон электронной почты (для этого нужен более эффективный маршрут), который, как я подозреваю, потребляет много памяти.

Что я хотел бы знать, так это лучший подход для оптимизации потребления ресурсов на Heroku? Я использую Resque главным образом для обработки изображений и отправки пакетных писем. В настоящее время у меня есть три сотрудника, которые работают на одном динамометре, но я не уверен, что у меня должно быть больше или меньше рабочих на одном динамо или разбросано по нескольким динамикам. В настоящее время использование приложения довольно мало в большинстве случаев, однако я ожидаю, что его использование значительно возрастет в ближайшем будущем, и поэтому я обеспокоен масштабированием. Например, прямо сейчас у меня может быть один пользователь в день, загружать сразу 100 фотографий или отправлять 50 электронных писем сразу. Однако я ожидаю 10-кратного увеличения использования.

Я не ищу конкретный ответ как таковой, просто совет о том, как оптимизировать использование ресурсов и плавно масштабироваться. Благодаря!

ответ

1

Heroku did a nice write-up об использовании рескей-пула, чтобы уменьшить объем памяти работников resque.

Драгоценный камень рескей-пула масштабирует ваших работников на основе рескей, запустив несколько рабочих на динамометр и хорошо подходит. Драгоценный камень resque-pool ведет себя аналогично веб-серверу Unicorn в том виде, в котором он разработан. Он загружает один мастер-процесс, а затем использует команду forex unix для создания нескольких рабочих, которые могут обрабатывать ваши данные независимо друг от друга. Эти многочисленные работники resque создают ваш «пул» работников. Использование процессов для параллелизма более безопасно в Ruby, но может иметь более высокие издержки памяти.

Использование этого драгоценного камня также применимо к бегущим работникам, которые несут службу за пределами экосистемы Heroku.

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