Как рассчитать оптимальное количество потоков для веб-сервера 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 по мере роста трафика и изменения состава приложений на сервере.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.