Как контролировать серверные процессы sidekiq и rails?

#ruby-on-rails #capistrano #unicorn #sidekiq

#ruby-на-рельсах #капистрано #единорог #sidekiq

Вопрос:

Каков наилучший способ управления несколькими взаимосвязанными службами для веб-приложений, таких как:

  • сервер rails / unicorn / puma
  • redis / sidekiq / resque

Так что, если один из них остановлен или запущен, другие тоже будут остановлены / запущены.

Ответ №1:

Обычно для этой цели используется инструмент мониторинга. Одним из таких хороших инструментов является Бог.

Основная идея состоит в том, чтобы запускаться God как системная служба и настраивать вас sidekiq так, чтобы за вами наблюдал Бог. Когда ваш сервер перезапускается, God запускается как сервис, и он запускает ваших sidekiq работников.

Вы получаете больше преимуществ, используя Бога, и это лишь некоторые из них:

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

Обновление: только что прочитал сегодня утром статью, которая может быть очень полезной: создавайте, запускайте и управляйте фоновыми процессами Ruby с помощью upstart.

Комментарии:

1. Очень услужливый Джеймс. Я прочитал много блогов о Боге, выскочке и Моните. Я нахожу, что люди больше жалуются на Бога (то есть на утечки памяти) и предпочитают Monit, хотя God выглядит простым и более адаптируемым для разработчиков Rails.

2. Мой процесс Sidekiq также занимает огромную память (500-800 МБ). Я обнаружил, что некоторые другие разработчики также жалуются на это. Похоже, что программы ruby подвержены утечке памяти. А ты как думаешь?

3. Приложения Ghazi, ruby и rails легко занимают много памяти, но это не обязательно связано с утечкой. Например, если в вашем Sidekiq worker загружается огромное количество объектов activerecord, это может привести к потере памяти. Сложно отлаживать такие проблемы и настраивать ruby GC, но это просто реальность. Возможно, вы захотите, чтобы каждый работник был маленьким и быстрым. Если рабочему действительно нужно работать с большим количеством объектов AR, тщательно настройте запросы и логику (например, используйте find_each для пакетной загрузки объектов db для экономии памяти).