Сервер Apache иногда зависает на несколько минут, запросы накапливаются и требуют слишком много времени для обработки.

Вопрос или проблема

У меня есть сервер с Apache 2.4.38 на Debian 10, и иногда веб-сервер работает неправильно и не отправляет немедленно ответ на HTTP-запросы, которые он получает (все запросы виртуальных хостов на нем полностью неотвечают (независимо от того, к чему они обратные прокси)). После перезагрузки он сразу же восстанавливается или после того, как так работает некоторое время (секунды или даже минуты), и вдруг начинает отправлять ОЧЕНЬ много HTTP-ответов.

Использование ЦП и ОЗУ, похоже, в норме, так что это определенно не в этом. Я не знаю, что именно происходит и почему это происходит.
Я также изменил настройки mpm_event.conf, сейчас они установлены на следующее:

<IfModule mpm_event_module>
        StartServers                     2
        ServerLimit 100
        MinSpareThreads          25
        MaxSpareThreads          75
        ThreadLimit                      128
        ThreadsPerChild          25
        MaxRequestWorkers         400
        MaxConnectionsPerChild   5000
</IfModule>

Тем не менее, есть несколько ошибок, которые я видел в журнале ошибок Apache:

[Tue Mar 22 19:53:38.339703 2022] [core:error] [pid 3375:tid 140244229465216] AH00046: дочерний процесс 29595 все еще не вышел, отправка SIGKILL
[Tue Mar 22 19:53:38.339777 2022] [core:error] [pid 3375:tid 140244229465216] AH00046: дочерний процесс 26190 все еще не вышел, отправка SIGKILL
[Tue Mar 22 19:53:38.339825 2022] [core:error] [pid 3375:tid 140244229465216] AH00046: дочерний процесс 27903 все еще не вышел, отправка SIGKILL
[Tue Mar 22 19:53:38.339889 2022] [core:error] [pid 3375:tid 140244229465216] AH00046: дочерний процесс 16907 все еще не вышел, отправка SIGKILL
[Tue Mar 22 19:53:38.339933 2022] [core:error] [pid 3375:tid 140244229465216] AH00046: дочерний процесс 26880 все еще не вышел, отправка SIGKILL
[Tue Mar 22 19:53:38.340000 2022] [core:error] [pid 3375:tid 140244229465216] AH00046: дочерний процесс 15384 все еще не вышел, отправка SIGKILL
[Tue Mar 22 19:53:38.340041 2022] [core:error] [pid 3375:tid 140244229465216] AH00046: дочерний процесс 24971 все еще не вышел, отправка SIGKILL
[Tue Mar 22 19:53:38.340091 2022] [core:error] [pid 3375:tid 140244229465216] AH00046: дочерний процесс 9780 все еще не вышел, отправка SIGKILL
[Tue Mar 22 19:53:38.340130 2022] [core:error] [pid 3375:tid 140244229465216] AH00046: дочерний процесс 26317 все еще не вышел, отправка SIGKILL

Какие настройки я могу изменить, чтобы исправить эту проблему?

Похоже, что что-то зависает в ваших рабочих процессах. Это плохо. Либо какой-то плагин зависает, либо у вас могут быть проблемы с оборудованием. Менее вероятно, что вы нашли ошибку в Apache.

Я бы проверил dmesg и systemctl на наличие ошибок, особенно связанных с хранилищем.

Если этот простой проверка ничего не даст, прикрепите gdb к вашему процессу apache2 и посмотрите, где именно дочерние процессы зависают, не выходя. Возможно, это плагин, который пытается разрешить имя, и разрешение случайно недоступно? Возможно, это доступ к ненадежно доступному файлу на NFS? Трудно сказать отсюда.

Ответ или решение

Проблема, которую вы описали, связана с работой вашего веб-сервера Apache 2.4.38 на платформе Debian 10. Замедление обработки запросов и неожиданное застревание дочерних процессов могут иметь несколько причин, и решение этой проблемы требует комплексного подхода. Рассмотрим основные аспекты и предлагаемые действия для выявления и устранения проблемы.

1. Анализ ошибок в логах

Согласно приведённым вами записям из логов Apache, мы видим, что происходит нечто критическое — дочерние процессы не завершаются и получают сигнал SIGKILL. Это может указывать на зависание процессов, которое может быть вызвано:

  • Блокировкой ресурсов: Проверьте внешние системы, к которым обращается ваш сервер (например, базы данных, файловые системы и API). Если какой-то из сервисов будет недоступен или медленно отвечать, это может привести к подобным зависаниям.
  • Ошибками в конфигурации модулей: Неправильно настроенные модули могут приводить к зависаниям. Убедитесь, что все ваши модули обновлены и сконфигурированы должным образом.

2. Настройки MPM Event

Согласно вашему конфигурационному файлу mpm_event.conf, у вас есть настройки, которые вполне могут потребовать оптимизации:

<IfModule mpm_event_module>
        StartServers                     2
        ServerLimit 100
        MinSpareThreads          25
        MaxSpareThreads          75
        ThreadLimit                      128
        ThreadsPerChild          25
        MaxRequestWorkers         400
        MaxConnectionsPerChild   5000
</IfModule>
  • MaxRequestWorkers и ServerLimit: Убедитесь, что значение MaxRequestWorkers не превышает возможности вашего сервера. Если у вас слишком много активных процессов, это может привести к исчерпанию ресурсов.
  • ThreadsPerChild: Попробуйте увеличить количество потоков на процесс, чтобы улучшить параллельную обработку запросов. Например, можно увеличить это значение до 50, чтобы проверить, улучшится ли обработка.

3. Дополнительные проверки

  • Системные ресурсы: Даже если CPU и RAM выглядят нормально, проверьте нагрузку на диск, особенно если вы используете сеть (NFS) или проводите высоконагруженные операции. Используйте команды iotop или dstat, чтобы оценить загрузку ввода/вывода.
  • dmesg и systemctl: Проверьте наличие ошибок в системных журналах. Любые сообщения о сбоях или предупреждениях могут подсказать о наличии проблем с оборудованием или драйверами.
  • Отладка с использованием gdb: Подключите gdb к процессу Apache, чтобы определить, в каком именно состоянии зависли ваши процессы. Это может указать на конкретные проблемные участки в коде или модулях.

4. Альтернативные подходы

  • Модульное тестирование: Если вы используете сторонние модули или плагины, попробуйте временно их отключить. Это может помочь вам выяснить, не является ли один из них причиной зависаний.
  • Наблюдение за сетью: Убедитесь, что нет сетевых проблем, включая DNS. Иногда сервер может зависнуть, ожидая разрешения доменных имен, если DNS-сервер недоступен.

Заключение

При устранении проблемы с зависающими запросами на Apache нужно обратить внимание на множество факторов. Постепенное внесение изменений в настройки, контроль за работой системы и отказ от потенциально проблемных модулей — это основные шаги, способствующие восстановлению стабильности работы вашего веб-сервера. Если проблема не будет решена, возможно, стоит рассмотреть вариант обращения к профессиональным администраторам для глубокой диагностики системы.

Оцените материал
Добавить комментарий

Капча загружается...