Apache Error AH03490: scoreboard is full, not at MaxRequestWorkers — Решение
Веб-сервер перестает принимать новые входящие подключения, несмотря на то, что текущее количество активных воркеров не достигло предела MaxRequestWorkers. В error.log появляется сообщение об исчерпании системной таблицы процессов: [mpm_event:error] [pid 1234:tid 5678] AH03490: scoreboard is full, not at MaxRequestWorkers. Consider raising the ServerLimit.
| Состояние процесса | Слот Scoreboard | Причина блокировки слота |
|---|---|---|
G (Graceful finishing) | Заблокирован старым процессом | Процесс не может завершиться из-за зависшего Keep-Alive или долгого запроса |
ServerLimit | Достигнут аппаратный максимум слотов | Параметр ServerLimit меньше, чем требуется для размещения новых воркеров |
| Новый форк процесса | Отказ создания воркера | Scoreboard не имеет свободных ячеек для регистрации нового PID |
- Apache прекращает масштабирование процессов при резких скачках нагрузки.
- Клиенты получают задержки соединения или отказ в обслуживании (Connection reset / Timeout).
- Проверьте текущее состояние таблицы процессов (Scoreboard) через модуль
mod_status, перейдя по адресуhttp://127.0.0.1/server-status(или выполнитеapache2ctl fullstatus). - Обратите внимание на количество процессов в статусе "G" (Gracefully finishing). Большое их количество означает, что старые воркеры не могут закрыться после команды
graceful reloadиз-за зависших TCP-соединений. - Уменьшите таймауты Keep-Alive и общие таймауты соединений в
apache2.conf/httpd.conf:Timeout 30 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 3 - Увеличьте директиву
ServerLimitв файле конфигурации вашего MPM (mpm_event.confилиmpm_worker.conf):<IfModule mpm_event_module> # ServerLimit должен быть больше, чем (MaxRequestWorkers / ThreadsPerChild) ServerLimit 32 StartServers 4 ThreadsPerChild 64 MaxRequestWorkers 2048 MaxConnectionsPerChild 10000 </IfModule> - ВАЖНО: Директива
ServerLimitне может быть изменена через мягкийreload. Требуется полный перезапуск процесса Apache:sudo apache2ctl configtest && sudo systemctl restart apache2
Частые вопросы (FAQ)
Почему при ошибке AH03490 Apache пишет 'not at MaxRequestWorkers'?
Потому что сумма активных рабочих потоков еще не достигла лимита MaxRequestWorkers, но таблица слотов процессов уже переполнена 'зависшими' процессами в стадии Graceful Shutdown.
Почему ServerLimit требует именно restart, а не reload?
ServerLimit определяет размер массива разделяемой памяти (Scoreboard), который выделяется ядром ОС строго один раз в момент старта главного мастер-процесса.
Как скрипты logrotate могут провоцировать AH03490?
Если logrotate вызывает graceful reload каждые несколько часов на сервере с долгими WebSocket или Keep-Alive сессиями, старые процессы накапливаются в статусе 'G', забивая Scoreboard.
Помогает ли директива GracefulShutdownTimeout?
Да! Установка GracefulShutdownTimeout 60 принудительно убивает зависшие процессы через 60 секунд после команды релоада, освобождая слоты Scoreboard.