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.
Сравнение характеристик
| Параметр | Prefork | Worker | Event |
|---|---|---|---|
| Модель | Многопроцессная | Многопроцессно-потоковая | Многопроцессно-потоковая с асинхронным слушателем |
| Потребление памяти | Высокое | Среднее | Низкое |
| Масштабируемость | Низкая | Средняя | Высокая |
| Изоляция запросов | Полная (процессы) | Частичная (потоки) | Частичная (потоки) |
| Требования к модулям | Не требует потокобезопасности | Требует потокобезопасности | Требует потокобезопасности |
| Поддержка 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.js — Event.
- Для Windows — WinNT (единственный вариант).
Влияние на производительность
MPM напрямую влияет на способность сервера выдерживать пиковые нагрузки. При неправильном выборе модели могут возникать:
- Нехватка памяти (при Prefork на сервере с тысячами параллельных подключений).
- Блокировка потоков (при Worker на медленных соединениях keep-alive).
- Высокая загрузка CPU (при неоптимальной конфигурации Event).
Для типичного веб-приложения с высокой посещаемостью (например, новостной портал или интернет-магазин) оптимальным выбором является Event MPM с настройкой MaxRequestWorkers в зависимости от объёма оперативной памяти (обычно 150–300 потоков на 1 ГБ ОЗУ).
Критика и ограничения
Основная критика MPM связана с тем, что архитектура Apache, основанная на процессах/потоках, уступает по эффективности асинхронным моделям (например, Nginx или Lighttpd) при обработке статического контента или большого числа долгоживущих соединений. Для решения этой проблемы часто используется связка Apache (как backend для динамики) с Nginx (как frontend для статики).
Кроме того, не все MPM доступны на всех платформах, а переход между ними требует перекомпиляции сервера или изменения конфигурации, что может быть неудобно для администраторов.
Источники
- Документация Apache HTTP Server. «MPM Common Directives».
- Документация Apache HTTP Server. «MPM Prefork», «MPM Worker», «MPM Event».
- Книга «Apache: The Definitive Guide» (Ben Laurie, Peter Laurie).
- Официальный сайт Apache Software Foundation. «Apache HTTP Server Version 2.4 Documentation».
- Статья «Choosing the Right MPM for Apache» (DigitalOcean Community Tutorials).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →