Время простоя при перезагрузке демона mod_wsgi? - PullRequest
5 голосов
/ 09 сентября 2010

Я запускаю приложение Django на Apache с mod_wsgi.Будут ли какие-либо простои во время обновления?

Mod_wsgi работает в режиме демона, поэтому я могу перезагрузить свой код, коснувшись файла скрипта .wsgi, как описано в документе «ReloadingSourceCode»: http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode. Предположительно, для перезагрузки требуется некоторое ненулевое количество времени.Что произойдет, если запрос поступит во время перезагрузки?Будет ли Apache ставить запрос в очередь, а затем завершит его, как только демон wsgi будет готов?

Документация включает следующее утверждение:

Итак, если вы используете Django в режиме демона и нуждаетесьчтобы изменить файл «settings.py», после внесения необходимых изменений также коснитесь файла сценария, содержащего точку входа приложения WSGI.Сделав это, при следующем запросе процесс будет перезапущен, и ваше приложение Django перезагружено.

Для меня это говорит о том, что Apache будет корректно обрабатывать каждый запрос, но я подумал, что хочу попросить об этом.,Мое приложение не критично (небольшое время простоя не было бы катастрофическим), поэтому вопрос в основном академический.

Спасибо.

Ответы [ 2 ]

18 голосов
/ 10 сентября 2010

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

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

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

Таким образом, существует промежуточное положение.Процесс демона будет ожидать завершения запросов, прежде чем завершится, но если они не были завершены в течение периода завершения работы, то процесс демона будет принудительно завершен, а активные запросы будут прерваны.

Период этоговремя отключения по умолчанию составляет 5 секунд.Его можно переопределить, используя опцию shutdown-timeout для директивы WSGIDaemonProcess, но следует должным образом учесть последствия его изменения.

Таким образом, в отношении этой конкретной проблемы, если у вас все еще активны долго выполняющиеся запросыкогда первый запрос приходит после того, как вы коснулись файла сценария WSGI, существует риск прерывания активных длинных запросов.

Следующее, что вы можете заметить, это то, что даже если нет долго выполняющихся запросови быстро завершает работу, затем все равно необходимо снова загрузить приложение WSGI в новом процессе.Время, которое потребуется, будет рассматриваться как задержка в обработке запроса.Насколько велика эта задержка, будет зависеть от платформы и вашего приложения.Самым худшим нарушителем, насколько мне известно, является время TurboGears.Django несколько лучше и лучше, если учесть, что время быстрого запуска - это легкие микро-фреймворки, такие как Flask.

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

1 голос
/ 10 сентября 2010

Нет, простоев не будет.Запросы с использованием старого кода будут выполнены, и новые запросы будут использовать новый код.

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

Это похоже на команду apachectl graceful для Apache в целом, которая говорит ему запустить новую конфигурацию без простоя.

...