Сведения о вопросе

Codeliver

00:16, 9th August, 2020

Теги

ruby-on-rails   ruby   mongrel    

Как мне изящно закрыть веб-сервер Mongrel

Просмотров: 433   Ответов: 6

Мое приложение RubyOnRails настроено с обычным пакетом дворняг за конфигурацией Apache. Мы заметили, что использование памяти нашего веб-сервера Mongrel может быть довольно большим при определенных операциях, и мы действительно хотели бы иметь возможность динамически выполнять изящный перезапуск выбранных процессов Mongrel в любое время.

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

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

Существует ли стандартная техника или лучшая практика для этого?



  Сведения об ответе

SILA

02:50, 27th August, 2020

Я провел еще немного исследований в источнике Mongrel, и оказалось, что Mongrel устанавливает обработчик сигнала, чтобы поймать стандартный процесс kill (TERM) и сделать изящное завершение работы, так что мне не нужна специальная процедура в конце концов.

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

** TERM signal received.
Thu Aug 28 00:52:35 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown'
Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:41 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown'
Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:43 +0000 2008 (13051) Rendering layoutfalsecontent_typetext/htmlactionindex within layouts/application


  Сведения об ответе

LIZA

07:35, 10th August, 2020

Посмотрите на использование monit. Вы можете динамически перезапустить mongrel на основе использования памяти или CPU. Вот строка из конфигурационного файла, который я написал для своего клиента.

check process mongrel-8000 with pidfile /var/www/apps/fooapp/current/tmp/pids/mongrel.8000.pid
    start program = "/usr/local/bin/mongrel_rails cluster::start --only 8000"
    stop program = "/usr/local/bin/mongrel_rails cluster::stop --only 8000"

    if totalmem is greater than 150.0 MB for 5 cycles then restart       # eating up memory?
    if cpu is greater than 50% for 8 cycles then alert                  # send an email to admin
    if cpu is greater than 80% for 5 cycles then restart                # hung process?
    if loadavg(5min) greater than 10 for 3 cycles then restart          # bad, bad, bad
    if 3 restarts within 5 cycles then timeout                         # something is wrong, call the sys-admin

    if failed host 192.168.106.53 port 8000 protocol http request /monit_stub
        with timeout 10 seconds
        then restart
    group mongrel

Затем вы повторили бы эту конфигурацию для всех ваших экземпляров кластера mongrel. Строка monit_stub - это просто пустой файл, который monit пытается загрузить. Если это не удается, он также пытается перезапустить экземпляр.

Примечание: мониторинг ресурсов, похоже, не работает на OS X с Darwin kernel.


  Сведения об ответе

padenie

03:19, 23rd August, 2020

Болотистый:

Если у вас есть один запущенный процесс, он изящно завершит работу (обслуживайте все запросы в своей очереди, которая должна быть только 1, Если вы используете правильную балансировку нагрузки). Проблема в том, что вы не можете запустить новый сервер, пока старый не умрет, поэтому ваши пользователи будут стоять в очереди в подсистеме балансировки нагрузки. То, что я нашел успешным, - это 'cascade' или переходящий перезапуск дворняг. Вместо того, чтобы останавливать их все и запускать их все (поэтому запросы в очереди до тех пор, пока одна дворняжка не будет выполнена, остановлена, перезапущена и принимает соединения), вы можете остановить, а затем запустить каждую дворняжку последовательно, блокируя вызов для перезапуска следующей дворняжки до тех пор, пока не будет создана резервная копия предыдущей (используйте реальную проверку HTTP для контроллера /status). Когда ваши дворняги катятся, только один за раз падает, и вы служите по двум кодовым базам - если вы не можете этого сделать, вы должны бросить страницу обслуживания на минуту. Вы должны быть в состоянии автоматизировать это с помощью capistrano или любого другого инструмента развертывания.

Итак у меня есть 3 задачи: cap:deploy - что делает традиционный метод перезапуска все в то же время с крюком, который помещает страницу обслуживания, а затем снимает ее после проверки HTTP. cap:deploy:rolling-что делает этот каскад через машину (я тяну из iClassify, чтобы узнать, сколько дворняг находится на данной машине) без страницы обслуживания. cap deploy:migrations-который делает страницу обслуживания + миграции, так как это обычно плохая идея для запуска миграции 'live'.


  Сведения об ответе

VCe znayu

20:48, 7th August, 2020

Лучше вопрос в том, как уберечь ваше приложение от потребления такого количества памяти, что оно требует от вас перезагрузки дворняг время от времени.

www.modrails.com значительно сократил объем нашей памяти


  Сведения об ответе

baggs

04:56, 2nd August, 2020

Попробуйте использовать:

mongrel_cluster_ctl stop

Вы также можете использовать:

mongrel_cluster_ctl restart


  Сведения об ответе

+-*/

22:44, 20th August, 2020

у меня есть вопрос

что происходит, когда срабатывает /usr/local/bin/mongrel_rails cluster::start --только 8000 ?

все ли запросы обслуживаются этим конкретным процессом до их завершения ? или они прерваны ?

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться