Apache Error AH00161: server reached MaxRequestWorkers — Тюнинг MPM
Под высокой нагрузкой веб-сервер перестает своевременно обрабатывать входящие HTTP-запросы, отдавая задержки или 504 Gateway Timeout. В error.log появляется предупреждение исчерпания пула потоков: [mpm_event:error] [pid 1234:tid 5678] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting.
| Модуль MPM | Ключевой лимит | Поведение при достижении лимита |
|---|---|---|
mpm_prefork | MaxRequestWorkers 256 | Новые процессы не форкаются, запросы ставятся в очередь ListenBacklog |
mpm_event / worker | ThreadsPerChild * ServerLimit | Исчерпан пул рабочих потоков, задержка установки TCP-соединений |
| Клиентский опыт | Time to First Byte (TTFB) | Рост времени ответа от сотен миллисекунд до десятков секунд |
- Apache утилизирует все выделенные воркеры и блокирует новые клиентские подключения.
- При переполнении очереди подключений клиенты получают сетевую ошибку
Connection refused.
- Определите активный модуль MPM в вашей системе:
# Debian/Ubuntu: apache2ctl -M | grep mpm # RHEL/CentOS: httpd -M | grep mpm - Если используется mpm_event (рекомендуется для Highload), скорректируйте лимиты в
/etc/apache2/mods-available/mpm_event.confили/etc/httpd/conf.modules.d/00-mpm.conf:<IfModule mpm_event_module> ServerLimit 32 StartServers 4 MinSpareThreads 64 MaxSpareThreads 256 ThreadsPerChild 64 # MaxRequestWorkers = ServerLimit * ThreadsPerChild (32 * 64 = 2048): MaxRequestWorkers 2048 MaxConnectionsPerChild 10000 </IfModule> - Если вы вынуждены использовать mpm_prefork, рассчитайте безопасное значение
MaxRequestWorkersисходя из доступной RAM:# 1. Узнайте среднее потребление памяти одним процессом Apache: ps -ylC apache2 --sort:rss | awk '{sum+=$8; ++n} END {print "Avg RAM per worker (MB):", sum/(n-1)/1024}' # 2. Формула: MaxRequestWorkers = (Доступная RAM для Apache) / (Средний размер воркера) - Пропишите рассчитанные значения для
mpm_prefork.conf:<IfModule mpm_prefork_module> ServerLimit 150 MaxRequestWorkers 150 MaxConnectionsPerChild 3000 </IfModule> - Проверьте синтаксис и перезапустите веб-сервер:
sudo apache2ctl configtest && sudo systemctl restart apache2
mpm_prefork бездумное увеличение MaxRequestWorkers (например, до 1000) при среднем размере процесса PHP в 80 МБ потребует 80 ГБ оперативной памяти. Если памяти не хватит, система зависнет и Linux OOM Killer уничтожит MySQL или Apache.Частые вопросы (FAQ)
Что такое MaxRequestWorkers?
Это директива Apache 2.4 (в Apache 2.2 называлась MaxClients), которая задает жесткий предел на максимальное количество одновременных запросов, которые веб-сервер способен обслуживать в единицу времени.
Чем MaxRequestWorkers отличается от ServerLimit?
ServerLimit задает максимальное число процессов Apache. В многопоточных MPM (event/worker) MaxRequestWorkers равен произведению ServerLimit на ThreadsPerChild.
Зачем нужна директива MaxConnectionsPerChild?
Она указывает, сколько запросов может обработать дочерний процесс перед тем, как он будет принудительно пересоздан. Это эффективно предотвращает утечки оперативной памяти в долгоживущих процессах.
Почему mpm_event эффективнее mpm_prefork?
mpm_event использует выделенные потоки для удержания Keep-Alive соединений без блокировки тяжелых рабочих воркеров, требуя в 5-10 раз меньше оперативной памяти при аналогичном RPS.