Apache Prefork vs Worker MPM

Глядя на конфигурационный файл Apache, я вижу Prefork и WorkM MPM. В чем разница и какой из них использует Apache?

Ответ 1

Предпрограмма и работник - это два типа MPM apache. Оба имеют свои достоинства и недостатки.

По умолчанию mpm - это предпрок, который является потокобезопасным.

Prefork MPM использует несколько дочерних процессов с одним потоком каждый, и каждый процесс обрабатывает одно соединение за раз.

Рабочий MPM использует несколько дочерних процессов со многими потоками. Каждый поток обрабатывает одно соединение за раз.

Более подробную информацию вы можете найти https://httpd.apache.org/docs/2.4/mpm.html и https://httpd.apache.org/docs/2.4/mod/prefork.html

Ответ 2

Многопроцессорные модули Apache (MPM) отвечают за привязку к сетевым портам на машине, прием запросов и диспетчеризацию запросов для обработки запросов (http://httpd.apache.org/docs/2.2/mpm.html).

Они похожи на любой другой модуль Apache, за исключением того, что только один и только один MPM должны быть загружены на сервер в любое время. MPM выбираются во время конфигурации и скомпилированы на сервер, используя аргумент --with-mpm=NAME с конфигурацией script, где NAME - это имя желаемого MPM.

Apache будет использовать MPM по умолчанию для каждой операционной системы, если другой вариант не выбран во время компиляции (например, в Windows mpm_winnt используется по умолчанию). Вот список операционных систем и их MPM по умолчанию:

Чтобы проверить, какие модули скомпилированы на сервере, используйте параметр командной строки -l (здесь - это документация). Например, при установке Windows вы можете получить что-то вроде:

> httpd -l
Compiled in modules:
  core.c
  mod_win32.c
  mpm_winnt.c
  http_core.c
  mod_so.c

Начиная с версии 2.2 это список доступных основных функций и модулей MPM:

  • core - Основные функции сервера HTTP Apache, которые всегда доступны
  • mpm_common - набор директив, реализованных более чем одним модулем многопроцессорной обработки (MPM)
  • beos - этот многопроцессорный модуль оптимизирован для BeOS.
  • event - экспериментальный вариант стандартного рабочего MPM
  • mpm_netware Многопроцессорный модуль, реализующий исключительно поточный веб-сервер, оптимизированный для Novell NetWare
  • mpmt_os2 Гибридный многопроцессорный многопоточный MPM для OS/2
  • prefork Реализует безпоточный веб-сервер с предварительной печатью.
  • mpm_winnt - этот многопроцессорный модуль оптимизирован для Windows NT.
  • worker - Многопроцессорный модуль, реализующий гибридный многопоточный веб-сервер с несколькими процессами

Теперь, к разнице между prefork и worker.

prefork MPM

реализует не-поточный, предварительно открытый веб-сервер, который обрабатывает запросов аналогично Apache 1.3. Он уместен для сайты, которым необходимо избегать потоковой передачи для совместимости с небезобезопасные библиотеки. Это также лучший MPM для изоляции каждого запрос, так что проблема с одним запросом не повлияет на другие.

worker MPM реализует гибридный многопроцессорный многопроцессорный сервер и дает лучшую производительность, поэтому он должен быть предпочтительным, если только он не является используя другие модули, которые содержат потокобезопасные библиотеки (см. также это обсуждение или this на Serverfault).

Ответ 3

Посмотрите этот для более подробной информации. Это относится к тому, как Apache обрабатывает несколько запросов. Предварительная загрузка, которая по умолчанию, запускает несколько процессов Apache (по умолчанию здесь по умолчанию, хотя я считаю, что это можно настроить через httpd.conf). Рабочий MPM запустит новый поток за запрос, который, как я полагаю, более эффективен с точки зрения памяти. Исторически сложилось так, что Apache использовал prefork, так что это более проверенная модель. Threading был добавлен только в версии 2.0.

Ответ 4

Для CentOS 6.x и 7.x(включая Amazon Linux) используйте:

sudo httpd -V

Это покажет, какой из MPM настроен. Либо предпродак, рабочий, либо событие. Prefork - это более ранняя, потокобезопасная модель. Рабочий является многопоточным, а событие поддерживает php-mpm, который, как предполагается, является лучшей системой для обработки потоков и запросов.

Однако ваши результаты могут отличаться в зависимости от конфигурации. Я видел много нестабильности в php-mpm, а не улучшения скорости. Агрессивный паук может легко исчерпать максимальные дочерние процессы в php-mpm.

Настройки для предка, рабочего или события устанавливаются в sudo nano/etc/httpd/conf.modules.d/00-mpm.conf(для CentOS 6.x/7.x/Apache 2.4).

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#LoadModule mpm_event_module modules/mod_mpm_event.so

Ответ 5

Вы можете узнать, использует ли Apache преформу или работника, выполнив следующую команду

apache2ctl -l

В результирующем результате найдите ссылки на prefork.c или worker.c