Apache fcgid php Работающие незанятые php-процессы

У нас возникла проблема, из-за которой процессы PHP Apache (2.4.10) FCGID (2.3.9) зависают в «рабочем» состоянии в Debian.

Эти PHP-процессы не занимают системных ресурсов (помимо их ранее использованного объема памяти при обработке предыдущих запросов) и простаивают. Они по-прежнему подключены к правильному логическому родительскому процессу (процесс apache2, обрабатывающий запросы на этом виртуальном хосте).

Подключение к ним strace показывает, что они находятся в состоянии: accept(0, мы предполагаем прослушивание для получения следующего запроса.

Регистрация приложения, добавленная в нашу обработку PHP в функции handle_shutdown, показывает, что все эти запросы попали в функцию handle_shutdown (без ошибок) - как и следовало ожидать для любого обработанного запроса PHP (поскольку вы всегда нажимаете функцию handle_shutdown), так что к лучшему насколько нам известно, весь запрос «успешен». Ответ 200 регистрируется в журнале доступа apache.

Однако раздел apachectl fullstatus fcgid показывает, что процесс «Работает», а не «Готов».

Изменение коэффициентов повторного использования в настройках Fcgid (максимальное количество запросов, время жизни, начало установки тайм-аутов выше или ниже и т. д.), по-видимому, не влияет на их регулярность.

Изящный apachectl успешно очищает все бездействующие «рабочие» потоки и возвращается в нормальное состояние.

Однако, конечно, если мы оставим это без наблюдения, в конечном итоге каждый из процессов рано или поздно окажется в этом состоянии, пока мы не получим полностью простаивающий сервер, где все наши максимальные процессы (100) все застряли «Ожидание». "но без дела. В этот момент использование памяти является разумным, и, конечно, ЦП, сеть и др. падают до незначительного уровня, поскольку единственный запрос, на который ответит сервер, — это полный статус (поскольку он не попадает в раздел PHP vhost)


person Meh-Lindi    schedule 20.09.2017    source источник
comment
(О, и мы попытались изменить режим Mutex в apache2.conf с file: [sdfds] на sem... так как мы нашли некоторые упоминания об apache в debian)   -  person Meh-Lindi    schedule 20.09.2017
comment
Вы можете получить лучший ответ на serverfault.com, так как SO больше связан с программированием.   -  person Machavity♦    schedule 21.09.2017


Ответы (1)


Что ж.

Оказывается, первый предложенный ответ (установить режим мьютекса apache2 на «sem» из файла:» был правильным, но когда он был применен впервые — наши службы apache2 не были запущены в холодном состоянии, а перезапущены, поэтому конечно, новый режим Mutex на самом деле не использовался.

Таким образом, когда тестирование все же показало ошибку, это предложение было списано.


Что происходит?

Процесс apache2 fcgid PM хранит три списка всех текущих дочерних процессов: «Готово», «Работает» и «Ошибка/Выход».

Он использует мьютекс (блокировку) для защиты этих списков всякий раз, когда он перемещает информационный блок дочерних процессов из состояния «Готово» в состояние «Ожидание», когда он отправляет ему запрос на обработку, и снова, когда дочерний процесс завершает запрос, чтобы чтобы вернуть его в состояние «Готово».

Этот мьютекс защищает общий ресурс, доступ к которому осуществляется из нескольких потоков или процессов, от возможности «перезаписи» одним процессом, в то время как другой процесс также пытается прочитать или записать значение (в результате чего этот другой процесс либо прочитал несовместимое значение, или чтобы его запись потерялась), позволяя только одному процессу одновременно получать доступ к этому жизненно важному ресурсу.

Мьютексы «file:» по умолчанию в Debian, по-видимому, не подходят для работы, вызывая очень редко (как предлагается в других местах в сети), два запроса на изменение состояния, происходящие в одно и то же время, и, таким образом, одно изменение выполняется успешно, в то время как другое (одновременно ) изменение "теряется".

Таким образом, ребенок знал, что все закончилось, а родитель думал, что это не так.

Гррр!


Мораль: в Debian измените режим мьютекса, если используете apache2 с fcgid, и убедитесь, что вы выполняете полную остановку apache, за которой следует запуск apache, и не доверяйте администраторам вашего сервера, которые только что перезапустили apache!

person Meh-Lindi    schedule 21.09.2017