Как изящно завершить работу веб-сервера Mongrel - PullRequest
4 голосов
/ 26 августа 2008

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

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

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

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

Ответы [ 6 ]

12 голосов
/ 28 августа 2008

Я немного больше изучил источник 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
5 голосов
/ 29 августа 2008

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

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.

1 голос
/ 05 февраля 2009

Boggy:

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

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

1 голос
/ 27 августа 2008

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

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

0 голосов
/ 14 декабря 2008

есть вопрос

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

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

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

0 голосов
/ 26 августа 2008

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

mongrel_cluster_ctl stop

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

mongrel_cluster_ctl restart
...