Вопрос или проблема
Конфигурация системы
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy
ИЛИ
Icon name: computer-vm
Chassis: vm
...
Virtualization: microsoft
Operating System: Ubuntu 22.04.5 LTS
Kernel: Linux 5.15.0-1066-azure
Architecture: x86-64
И
Server version: Apache/2.4.62 (Ubuntu)
Server built: 2024-07-22T12:36:51
Я запускаю сайт на Magento 2 на Apache 2.4 с PHP 8.1, и сайт часто падает примерно на 3 минуты. Проблема сообщается StatusCake со следующими деталями:
HTTP Code: 0
Reason: Timeout / Connection Refused
В ходе расследования я обнаружил, что простои коррелируют с высоким трафиком, когда использование ЦП превышает 90%. Несмотря на обновление ЦП с 32 ядер до 64 ядер, проблема сохраняется.
В журнале ошибок Apache я наблюдал следующие ошибки:
[Wed Jan 08 15:16:28.425970 2025] [mpm_worker:error] [pid 1849:tid 1849] AH00288: scoreboard is full, not at MaxRequestWorkers
[Wed Jan 08 15:16:29.475406 2025] [mpm_worker:error] [pid 1849:tid 1849] AH00286: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
[Wed Jan 08 15:16:30.478815 2025] [mpm_worker:error] [pid 1849:tid 1849] AH00287: server is within MinSpareThreads of MaxRequestWorkers, consider raising the MaxRequestWorkers setting
Чтобы решить эту проблему, я изменил конфигурацию Apache следующим образом:
MaxConnectionsPerChild 0 на 1000
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 64
MaxRequestWorkers 1024
MaxConnectionsPerChild 1000
</IfModule>
Несмотря на эти изменения, проблема сохраняется. Пожалуйста, предоставьте идеи или предложения по поводу проблемы и конфигурации.
Ниже приведены последние логи на момент, когда сайт упал:
[Sun Jan 19 12:18:48.135420 2025] [mpm_worker:error] [pid 184878:tid 184878] AH00288: scoreboard is full, not at MaxRequestWorkers
[Sun Jan 19 12:18:50.136823 2025] [mpm_worker:error] [pid 184878:tid 184878] AH00288: scoreboard is full, not at MaxRequestWorkers
[Sun Jan 19 12:18:51.137918 2025] [mpm_worker:error] [pid 184878:tid 184878] AH00288: scoreboard is full, not at MaxRequestWorkers
[Sun Jan 19 12:18:54.141136 2025] [mpm_worker:error] [pid 184878:tid 184878] AH00288: scoreboard is full, not at MaxRequestWorkers
[Sun Jan 19 12:18:55.142314 2025] [mpm_worker:error] [pid 184878:tid 184878] AH00288: scoreboard is full, not at MaxRequestWorkers
[Sun Jan 19 12:18:56.143406 2025] [mpm_worker:error] [pid 184878:tid 184878] AH00288: scoreboard is full, not at MaxRequestWorkers
[Sun Jan 19 12:18:58.144826 2025] [mpm_worker:error] [pid 184878:tid 184878] AH00288: scoreboard is full, not at MaxRequestWorkers
[Sun Jan 19 12:18:59.145931 2025] [mpm_worker:error] [pid 184878:tid 184878] AH00288: scoreboard is full, not at MaxRequestWorkers
[Mon Jan 20 00:00:00.440197 2025] [mpm_worker:notice] [pid 184878:tid 184878] AH00297: SIGUSR1 received. Doing graceful restart
Ответ или решение
Проблема, описанная в вашем запросе, весьма распространена в ИТ-сфере, особенно когда речь идет о веб-серверах, таких как Apache, работающих в условиях высокой нагрузки. Ниже приведено подробное и профессиональное объяснение возможных причин и решений вашей проблемы.
Теория
Когда сервер отказывается соединяться или выдает таймауты, это часто указывает на исчерпание доступных ресурсов на сервере. Ваш Apache сервер сталкивается с ситуацией, когда ресурсы, необходимые для обработки входящих запросов, превышают доступные ограничения, что подтверждают ошибки в вашем логе:
-
Ошибка Себорда полной таблицы (scoreboard is full): Эта ошибка указывает на то, что текущие настройки сервера Apache не позволяют выделять дополнительное количество воркеров для обслуживания запросов, когда существующие воркеры заняты. Проблема может быть вызвана недостаточным количеством MaxRequestWorkers.
-
Достижена MaxRequestWorkers: Это как раз та ситуация, когда Apache уже не может обрабатывать больше запросов, чем разрешено настройками, и все новые запросы отклоняются.
Пример
Если у вас входной трафик значительно возрастает, например из-за рекламных кампаний или других внешних факторов, это может вызвать резкое увеличение числа одновременных пользователей, что в свою очередь приводит к превышению допустимого количества одновременных соединений вашего Apache сервера.
Применение
На основе предоставленной информации и увеличенной мощности (с 32 до 64 ядер), есть несколько шагов, которые вы можете предпринять для решения проблемы:
-
Оптимизация настройки Apache:
- Увеличьте
MaxRequestWorkers
: Хотя вы уже увеличили это значение до 1024, возможно, стоит и дальше искать баланс, анализируя потребление CPU и памяти, чтобы подобрать оптимальные настройки в соответствии с новым количеством ядер. - Пересмотрите
ThreadsPerChild
иThreadLimit
: Увеличение этих значений может позволить Apache обрабатывать больше запросов параллельно.
- Увеличьте
-
Проверка других ограничений:
- Убедитесь, что конфигурации ОС не устанавливают ограничение на количество файловых дескрипторов или на другие системные ресурсы, которые могут затруднять работу Apache.
- Настройте параметры ядра и сетевых соединений (например,
net.core.somaxconn
) для улучшения обработки большого количества соединений.
-
Мониторинг производительности:
- Используйте инструменты мониторинга, такие как New Relic или Datadog, чтобы получить более глубокое понимание узких мест производительности вашего сервера.
- Собирайте метрики производительности, включая использование CPU, памяти, входные/выходные операции диска и сетевую загрузку.
-
Кэширование и балансировка нагрузки:
- Настройте кэширование на уровне приложения (например, Varnish для Magento) или на уровне сервера (используя модуль Apache mod_cache).
- Рассмотрите возможность использования балансировки нагрузки для распределения входящего трафика между несколькими серверами, что может значительно уменьшить нагрузку на единичный сервер.
-
Общее улучшение приложения:
- Оптимизируйте код и базу данных приложения для повышения производительности. Например, задержка в PostgreSQL или MySQL может служить причиной торможения веб-страниц.
- Рассмотрите возможность использования CDN для распределения статического контента, что также снизит нагрузку на ваш сервер Apache.
В результате, применяя эти рекомендации, вы сможете более эффективно использовать ресурсы вашего сервера и избежать простоев, связанных с текущими перегрузками. Экспериментируйте с параметрами и внимательно анализируйте результаты, чтобы найти оптимальное соотношение производительности и устойчивости системы.