Открыть сервис

Multi-Processing Modules

Multi-Processing Modules (MPM, модули многопроцессорной обработки) — это программные компоненты веб-сервера Apache HTTP Server, отвечающие за привязку сетевых портов, приём входящих запросов и распределение их между рабочими процессами или потоками для обработки. MPM определяет модель параллельной обработки запросов, влияя на производительность, масштабируемость и потребление ресурсов сервера.

История и назначение

До появления MPM архитектура Apache основывалась на одной модели — preforking (предварительное создание дочерних процессов). Однако с ростом нагрузки и разнообразием операционных систем возникла необходимость в гибкой настройке обработки запросов. Начиная с версии Apache 2.0, разработчики внедрили модульную систему MPM, позволяющую администраторам выбирать наиболее подходящую модель в зависимости от платформы и требований к производительности.

Основное назначение MPM — абстрагировать механизмы многозадачности (процессы, потоки, их комбинации) от остальной логики сервера. Это позволяет Apache работать как на Unix-подобных системах (Linux, FreeBSD), так и на Windows, используя различные подходы к параллелизму.

Основные виды MPM

Apache HTTP Server поставляется с несколькими стандартными MPM. Выбор конкретного модуля осуществляется на этапе компиляции или загрузки сервера.

Prefork MPM

Prefork (модуль prefork.c) — одна из старейших и наиболее стабильных моделей. Реализует многопроцессную архитектуру без использования потоков.

  • Принцип работы: При запуске сервер создаёт один родительский процесс, который порождает фиксированное или динамическое количество дочерних процессов. Каждый дочерний процесс обрабатывает один запрос в данный момент времени. Дочерние процессы изолированы друг от друга, что повышает надёжность: сбой в одном процессе не влияет на другие.
  • Преимущества: Высокая стабильность и безопасность за счёт изоляции процессов. Совместимость с библиотеками, не поддерживающими потоки (например, старые версии PHP с модулем mod_php).
  • Недостатки: Высокое потребление оперативной памяти (каждый процесс занимает свой адресное пространство) и ограниченная масштабируемость при большом количестве одновременных подключений.
  • Применение: Традиционно используется для серверов с умеренной нагрузкой и при необходимости работы с небезопасными в отношении потоков модулями.

Worker MPM

Worker (модуль worker.c) — гибридная модель, сочетающая процессы и потоки.

  • Принцип работы: Родительский процесс порождает несколько дочерних процессов, каждый из которых создаёт фиксированное количество потоков-обработчиков. Каждый поток обслуживает один запрос. Потоки внутри одного процесса разделяют общую память, что снижает накладные расходы.
  • Преимущества: Меньшее потребление памяти по сравнению с Prefork, так как потоки легче процессов. Хорошая масштабируемость при большом числе параллельных запросов.
  • Недостатки: Меньшая изоляция между запросами (сбой в одном потоке может затронуть весь процесс). Требует, чтобы все загруженные модули были потокобезопасными.
  • Применение: Рекомендуется для серверов с высокой нагрузкой и современными версиями PHP (например, через PHP-FPM).

Event MPM

Event (модуль event.c) — наиболее современная и производительная модель, доступная начиная с Apache 2.4.

  • Принцип работы: Основана на архитектуре Worker, но с ключевым отличием: отдельный поток-слушатель (listener) обрабатывает соединения, находящиеся в состоянии ожидания (keep-alive), и передаёт готовые к обработке запросы рабочим потокам. Это предотвращает блокировку потоков на поддержании простаивающих соединений.
  • Преимущества: Максимальная эффективность при работе с большим количеством долгоживущих соединений (HTTP Keep-Alive, WebSocket). Значительно меньшее потребление памяти и процессорного времени по сравнению с Worker и Prefork.
  • Недостатки: Требует потокобезопасности модулей, как и Worker. Может быть менее стабильна на очень старых системах или с экзотическими модулями.
  • Применение: Стандартная рекомендация для современных веб-серверов под управлением Linux. Используется по умолчанию в большинстве дистрибутивов Apache 2.4.

WinNT MPM

WinNT MPM (модуль mpm_winnt.c) — единственный MPM, используемый в Apache для операционной системы Windows.

  • Принцип работы: Реализует модель на основе одного процесса с несколькими потоками. Родительский процесс управляет дочерним, который создаёт пул потоков для обработки запросов.
  • Особенности: Оптимизирован под архитектуру Windows (использует механизмы IOCP — Input/Output Completion Ports). Не поддерживает модель Prefork или Worker на данной платформе.
  • Применение: Все установки Apache на Windows.

Сравнение характеристик

ПараметрPreforkWorkerEvent
МодельМногопроцесснаяМногопроцессно-потоковаяМногопроцессно-потоковая с асинхронным слушателем
Потребление памятиВысокоеСреднееНизкое
МасштабируемостьНизкаяСредняяВысокая
Изоляция запросовПолная (процессы)Частичная (потоки)Частичная (потоки)
Требования к модулямНе требует потокобезопасностиТребует потокобезопасностиТребует потокобезопасности
Поддержка keep-aliveЭффективнаСредняяОптимальная
ПлатформыUnix-подобныеUnix-подобныеUnix-подобные

Конфигурация и выбор MPM

Выбор MPM осуществляется на этапе сборки Apache или через директиву LoadModule в конфигурационном файле. В большинстве дистрибутивов Linux (например, Debian, Ubuntu, CentOS) MPM настраивается через отдельные пакеты или конфигурационные файлы в директории mods-enabled.

Основные директивы управления MPM включают:

  • StartServers — количество дочерних процессов при запуске.
  • MinSpareThreads / MaxSpareThreads — минимальное и максимальное количество свободных потоков.
  • MaxRequestWorkers — максимальное количество одновременных запросов (ограничивает общее число потоков).
  • MaxConnectionsPerChild — количество запросов, которое может обработать один дочерний процесс до перезапуска (для предотвращения утечек памяти).

Рекомендации по выбору:

  • Для старых приложений с небезопасными модулями (например, mod_php в режиме DSO) — Prefork.
  • Для современных стеков с PHP-FPM, Python WSGI или Node.jsEvent.
  • Для Windows — WinNT (единственный вариант).

Влияние на производительность

MPM напрямую влияет на способность сервера выдерживать пиковые нагрузки. При неправильном выборе модели могут возникать:

  • Нехватка памяти (при Prefork на сервере с тысячами параллельных подключений).
  • Блокировка потоков (при Worker на медленных соединениях keep-alive).
  • Высокая загрузка CPU (при неоптимальной конфигурации Event).

Для типичного веб-приложения с высокой посещаемостью (например, новостной портал или интернет-магазин) оптимальным выбором является Event MPM с настройкой MaxRequestWorkers в зависимости от объёма оперативной памяти (обычно 150–300 потоков на 1 ГБ ОЗУ).

Критика и ограничения

Основная критика MPM связана с тем, что архитектура Apache, основанная на процессах/потоках, уступает по эффективности асинхронным моделям (например, Nginx или Lighttpd) при обработке статического контента или большого числа долгоживущих соединений. Для решения этой проблемы часто используется связка Apache (как backend для динамики) с Nginx (как frontend для статики).

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

Источники

  1. Документация Apache HTTP Server. «MPM Common Directives».
  2. Документация Apache HTTP Server. «MPM Prefork», «MPM Worker», «MPM Event».
  3. Книга «Apache: The Definitive Guide» (Ben Laurie, Peter Laurie).
  4. Официальный сайт Apache Software Foundation. «Apache HTTP Server Version 2.4 Documentation».
  5. Статья «Choosing the Right MPM for Apache» (DigitalOcean Community Tutorials).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →