Рейтинг:2

Apache «зависает» несколько раз в день

флаг in
JYD

Я пишу сюда после нескольких недель, потраченных на борьбу с проблемой, из-за которой Apache перестает отвечать на запросы до тех пор, пока он не будет перезапущен. Это происходит 3/4 раза в день, иногда через несколько часов, иногда через несколько минут, иногда через день. Никакой связи (по крайней мере, нет доказательств) с количеством одновременных подключений к серверу: это происходит как в период интенсивного трафика (с 8:00 до 18:00), так и ночью, когда доступ очень низок.

Конфигурация: ВМ на Vmware ESXi Rel. 7 — ОС: Ubuntu 20.04, Apache 2.4.41, PHP 8.0.15, драйверы MSSQL 17.8.1.1-1. 6 ЦП "Xeon(R) Gold 5218", 12Гб ОЗУ. 3 веб-сайта, работающего на «чистом» PHP (без CMS, таких как Wordpress, Drupal, Ruby On Rails и т. д.). Awstats показывает, что интранет без внешнего доступа обслуживает < 10 тыс. страниц в день, другие — около 200 тыс. страниц в день. Большую часть времени загрузка процессора составляет около 1%, а памяти используется около 2 ГБ. Когда возникает проблема, пики ЦП/памяти/сети не обнаруживаются.

В тот момент я установил и настроил Монит что каждые 20 секунд проверяйте с помощью curl эту минимальную веб-страницу PHP:

<?php
echo "ok";
?>

Обычно он печатает "ОК". Во время «заморозки» даже эта простая страница не обслуживается; curl завершается с ошибкой тайм-аута и запускает monit, чтобы выполнить «перезапуск службы apache2». Через 2/3 секунды сайт возвращается к нормальной работе (до следующего зависания).

Далее следует список неудачных исправлений (не в хронологическом порядке):

  • Удален certbot-Letsencrypt и использован приобретенный Sectigo сертификат SSL.
  • Переключил Apache с mpm_worker на mpm_event
  • Отключил кучу неиспользуемых модулей Apache
  • Отключена куча неиспользуемых модулей PHP.
  • Отключено большинство некритичных заданий cron (даже нет никаких доказательств того, что зависание происходит во время выполнения заданий cron).
  • Виртуальный сетевой адаптер изменен с VMXNET3 на E1000.
  • Включено подробное ведение журнала: никакая полезная информация/ошибки не записываются, просто есть 25-30-секундный промежуток времени от последней обслуживаемой страницы непосредственно перед зависанием первой обслуживаемой страницы после завершения перезапуска.
  • Включено на несколько дней mod_log_forensic: при использовании утилиты check_forensic не сообщается об (!) ошибках
  • Дважды проверил несколько правил перезаписи в .conf и в .htaccess.
  • Изменена конфигурация Apache; соответствующие значения:
    Стартовые серверы 10
    Минспаретредс 40
    Максспаретредс 120
    ThreadLimit 100
    ThreadsPerChild 75
    Максрекуестворкерс 450
    МаксКоннектионсПерЧилд 1000

Нет очевидной корреляции между «последней» страницей/файлом, который был использован перед проблемой: иногда это страница PHP (очевидно, не та же самая), иногда изображение png/jpeg. Читая журналы, я не могу найти ненормальные/неправильные/чрезмерные запросы клиента.

Проблема на 99,99% связана с Apache, служба PHP-fpm работает отлично и не требует перезапуска после зависания. Все другие запущенные службы сервера не затронуты.

Прежде чем написать сюда, я прочитал тонны веб-страниц, но не нашел ни одной полезной (для меня) подсказки.

Спасибо в рекламе

Чао

JYD

флаг jp
Когда Apache зависает, проверьте статус процесса с помощью `ps`. Проверьте Apache `mod_status`. Используйте `strace`, чтобы узнать, что делают процессы.
флаг fr
Может быть, на это влияет количество потоков httpd? Поскольку это виртуальная машина, может быть, она работает на гипервизоре с раздуванием оперативной памяти?
флаг in
JYD
@AlexD Я добавляю strace в файл, и я опубликую здесь результаты
флаг in
JYD
@казак Никакой «баллонной» памяти, монитор ESX всегда показывает 0 КБ. Все 12 ГБ зарезервированы для этой виртуальной машины.
флаг in
JYD
Наконец то я понял!!!!
флаг in
JYD
Проблема заключалась в неправильной настройке демона файловой системы «incron» и отключении его журнала. В файле конфигурации одно из наблюдаемых событий содержало неправильную экранированную команду. Когда я включаю файл журнала incron, .log начинает расти на сотни строк в секунду и быстро достигает размера десятков МБ. Это странное поведение было вызвано неправильным экранированием символа в его файле конфигурации: в строке вместо "\$" была "$\", что создавало очень предсказуемые условия гонки. Исправил, зависание апача ушло.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.