Как рассчитать оптимальное количество потоков для веб-сервера Apache (MaxRequestWorkers), чтобы он не падал при пиковых нагрузках?
Правильный расчёт MaxRequestWorkers — один из ключевых шагов в настройке производительности Apache. Ошибка в этом параметре приводит либо к отказу сервера (OOM-killer убивает процессы), либо к неэффективному использованию ресурсов.
## Основная формула расчёта
Базовая формула выглядит так:
**MaxRequestWorkers = (Доступная RAM) / (Средний размер одного процесса/потока Apache)**
Пример:
— Доступная RAM для Apache: 4 GB (4096 MB)
— Средний размер одного worker-процесса: ~50 MB
— MaxRequestWorkers = 4096 / 50 ≈ 81
Важно: не используйте всю RAM. Оставьте 20–30% для операционной системы, базы данных, кэша и других служб.
## Как узнать реальный размер процесса Apache
Выполните команду на работающем сервере:
ps aux | grep apache2 | awk ‘{print $6}’ | sort -n | tail -20
Значение в колонке RSS показывает реальное потребление в килобайтах. Возьмите среднее или максимальное значение для расчёта.
Либо используйте:
apache2ctl status
## MPM-модуль имеет значение
— **prefork**: каждый запрос — отдельный процесс. Потребление памяти выше. MaxRequestWorkers = количество процессов.
— **worker**: гибридная модель (процессы + потоки). Потребление ниже. Учитывайте ThreadsPerChild.
— **event**: наиболее эффективный модуль для современных нагрузок. Рекомендуется для высоконагруженных сайтов.
Для event/worker: MaxRequestWorkers = ServerLimit × ThreadsPerChild
## Практические рекомендации
1. **Начните с консервативного значения** — лучше отказать части запросов (503), чем упасть целиком.
2. **Мониторьте через mod_status** — смотрите на показатель «Busy workers» в пиковые часы.
3. **Используйте нагрузочное тестирование** (Apache Bench, wrk, Locust) для определения реального потребления.
4. **Учитывайте slow clients** — долгие соединения «занимают» воркеры. Настройте Timeout и KeepAliveTimeout.
5. **Добавьте буфер 15–20%** к расчётному значению на случай всплесков.
## Пример итоговой конфигурации (event MPM)
apache
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 1000
ServerLimit 6
## Дополнительные меры защиты
— Настройте **mod_qos** или **mod_evasive** для ограничения числа запросов от одного IP.
— Используйте **reverse proxy** (Nginx) перед Apache для буферизации медленных клиентов.
— Включите **graceful restart** вместо hard restart при изменении конфигурации.
Регулярно пересматривайте значение MaxRequestWorkers по мере роста трафика и изменения состава приложений на сервере.
