Вопрос

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

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

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

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

Это было полезно?

Решение

Я провел еще небольшое исследование исходного кода Mongrel, и оказалось, что Mongrel устанавливает обработчик сигнала для перехвата стандартного завершения процесса (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

Другие советы

Посмотрите на использование 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.

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

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

Болотистый:

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

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

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

mongrel_cluster_ctl stop

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

mongrel_cluster_ctl restart

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top