Развертывание Apache MPM Event: расчет MaxRequestWorkers, ThreadsPerChild, ServerLimit
- В логах Apache фиксируется предупреждение:
server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting. - Внезапные всплески задержек (latency) при обработке Keep-Alive соединений.
- Нерациональный расход оперативной памяти процессами
httpd/apache2.
1. Архитектура MPM Event
MPM Event использует выделенные потоки для прослушивания Keep-Alive сокетов без блокировки рабочих потоков, что позволяет обрабатывать тысячи параллельных подключений минимальным количеством процессов.
2. Формула расчета параметров
Total RAM for Apache= Доступная RAM сервера - RAM для ОС/БД/PHP-FPMAvg Process Size= ~15-25 MB (без встроенного mod_php)ServerLimit= (Total RAM for Apache) / (Avg Process Size)MaxRequestWorkers= ServerLimit × ThreadsPerChild
3. Конфигурация /etc/apache2/mods-available/mpm_event.conf (Debian/Ubuntu)
Пример расчета для сервера с 8 GB RAM (выделено 4 GB под Apache):
<IfModule mpm_event_module>
# Количество потоков на один дочерний процесс
ThreadsPerChild 64
# Максимальное число процессов
ServerLimit 32
# Максимальное число параллельных запросов (32 * 64)
MaxRequestWorkers 2048
# Начальное число процессов
StartServers 4
# Минимальное число свободных потоков
MinSpareThreads 64
# Максимальное число свободных потоков
MaxSpareThreads 256
# Коэффициент асинхронных Keep-Alive соединений
AsyncRequestWorkerFactor 2
# Перезапуск процесса после обработки N запросов (защита от утечек)
MaxConnectionsPerChild 10000
</IfModule>4. Применение и мониторинг через mod_status
apachectl configtest && systemctl restart apache2
apachectl status Частые вопросы (FAQ)
Что регулирует параметр AsyncRequestWorkerFactor?
Он определяет, сколько дополнительных Keep-Alive соединений сверх MaxRequestWorkers может принять один рабочий поток (по умолчанию 2). При значении 2 и 2048 воркерах Apache может удерживать до 4096 Keep-Alive сессий.
Почему при изменении MaxRequestWorkers нужно менять и ServerLimit?
ServerLimit задает жесткий верхний лимит процессов в разделяемой памяти Apache. Если MaxRequestWorkers / ThreadsPerChild превышает ServerLimit, Apache откажется запускаться с фатальной ошибкой.