Как Apache обрабатывает поступивший запрос — 2. Модель процессов prefork

Сервер Apache 1.X на Unix-платформах использует для работы модель процессов prefork.

При запуске сервера стартует один-единственный процесс (родительский). Его главное назначение - создавать (с помощью fork() ) и завершать дочерние процессы по мере необходимости. Конфигурационные директивы Apache позволяют контролировать количество порождаемых процессов.

Обработкой клиентских запросов занимаются дочерние процессы. Один дочерний процесс в один момент времени может обрабатывать только один запрос. Чтобы обслужить в один момент времени, например, 1000 клиентов, требуется 1000 одновременно работающих процессов.
Срок жизни порожденного процесса определяется директивой MaxRequestsPerChild. Директива определяет количество запросов, которое будет обработано процессом, после чего процесс заменяется новым.

После запуска сервера, родительский процесс создает пул дочерних процессов, готовых обрабатывать входящие запросы клиентов.

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

Максимальная длина очереди ограничивается директивой ListenBacklog. Если очередь достигает максимальной длины, клиенту, приславшему новый запрос будет возвращаться ошибка с сообщением о недоступности сервера.

Для управления пулом дочерних процессов Apache предоставляет директивы:

  1. StartServers - директива определяет число порожденных процессов, создаваемых Apache при запуске сервера.
  2. MinSpareServers - директива устанавливает минимальное число процессов Apache, которые должны быть доступны в любой момент времени. Если все процессы заняты обработкой клиентских запросов, Apache запускает новые процессы, сохраняя пул доступных серверов на минимальном уровне.
  3. MaxSpareServers - директива устанавливает максимальное число процессов Apache, которые могут бездействовать в любой момент времени.
  4. MaxClients - определяет максимальное число дочерних процессов, которые будут созданы для обработки запросов.

Достоинства и недостатки модели prefork

Модель prefork отличается высокой надежностью. Программный код, обеспечивающий функционирование родительского процесса, очень прост и надежен, и вероятность возникновения ошибок на данном уровне крайне мала. Программный код дочерних процессов, наоборот, достаточно сложен. При подключении дополнительных модулей к серверу, запуске некорректных скриптов, существует вероятность возникновения ошибок и конфликтов, которые могут привести к неожиданному и преждевременному завершению дочернего процесса. Однако, исправно функционирующий родительский процесс сможет отследить ситуацию и своевременно создаст еще одного "ребенка". Кроме того, дочерние процессы изолированы друг от друга. Возникновение ошибки или аварийное завершение одного процесса никак не скажется на других процессах, и значит, обслуживание других клиентов не будет прервано.

Одним из основных недостатков модели prefork является ее требовательность к ресурсам памяти.

Полезные ссылки

EN

Looking at
the Apache V1.3 process model in the IBM HTTP Server

http://httpd.apache.org/docs/1.3/misc/perf-tuning.html

RU

Обработка запросов в Apache
http://ru.wikipedia.org/wiki/Apache