Рейтинг:1

Рабочие Apache MPM застряли в G (изящно заканчивая), растущие - «табло заполнено»

флаг us

Запуск рабочего MPM, Apache 2.4.46, Debian 9

Изящно заканчивающие рабочие со временем только растут, они, кажется, никогда не заканчивают. В конце концов у меня заканчивается емкость и появляется ошибка «табло заполнено». Если я перезапущу apache, они будут освобождены.

Я не верю, что это как-то связано с кодом моего веб-сайта (php), так как многие из зависающих запросов представляют собой просто чистые изображения GET, без участия php.

введите описание изображения здесь

<IfModule mpm_worker_module>
ServerLimit 500
StartServers       10
MinSpareThreads    50
MaxSpareThreads    100
    ThreadLimit          64
    ThreadsPerChild      64
    MaxRequestWorkers     500
    MaxConnectionsPerChild   0
</IfModule>

табло введите описание изображения здесь

пример g рабочие введите описание изображения здесь

Apache за неделю, свободных слотов становится все меньше введите описание изображения здесь

введите описание изображения здесь

пробовал включать и выключать поддержку

введите описание изображения здесь

флаг us
Где я сейчас в том, что я понял, что застрявший PID G, показанный в статусе apache, даже не работает ?? > kill 21734 sh:1: kill: Нет такого процесса
Рейтинг:1
флаг jo

При использовании MPM worker запросы обрабатываются потоками, существующими в процессах.

От https://httpd.apache.org/docs/2.4/mod/worker.html

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

В Linux процесс «содержит» потоки, то есть один PID может иметь несколько потоков, которые совместно используют память (среди других ресурсов) с другими потоками в этом PID.

На самом деле, Linux действительно заботится только о «задачах», не многопоточный процесс — это PID с контейнером один задача.

Когда вы корректно перезагружаете Apache, вы завершаете содержащий его процесс. Здесь происходит то, что Apache заставляет каждый поток ждать, пока все потоки в содержащем процессе не завершатся, прежде чем перезапустить PID контейнера.

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

У вас есть несколько вариантов.

  1. Просто перестаньте ждать и перезапустите.
  2. Найдите проблемную ветку (возможно, ошибка в приложении) и исправьте ее.

1, легко. Добавьте параметр конфигурации GracefulShutdownTimeout со значением, которое является высоким, но не глупым. Скажем, 900 секунд. По умолчанию это бесконечно, что означает, что ваши потоки вечно ждут завершения вашего проблемного потока.

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

2, потребует от вас обнаружения потока, который застрял в списке рабочих процессов, а затем диагностики того, что делает соединение, но вы обязательно найдете то, что может быть недостатком дизайна, и вы сможете более уверенно объяснить поведение, прежде чем просто сдуть прочь проблемную ветку.

флаг us
Во-первых, спасибо за ваш ответ, некоторые (несколько задач на pid) из того, что вы говорите, имеют отношение и имеют смысл и дали мне некоторые подсказки, но то, что вы говорите о изящном перезапуске apache, я не верю, что связано, поскольку GracefulShutdownTimeout afaik связано только с поведением apache когда вы выдаете перезагрузку. Я не выдаю перезагрузку, моя проблема просто возникает со временем, без перезапусков. Однако я исследую все задачи с одинаковым PID, возможно, в этом списке есть зависший процесс PHP.
флаг us
Все еще происходит, я просмотрел свой PID, и в зависших потоках G нет задач PHP...так что не уверен, что происходит, только статические запросы изображений/активов, которые никогда не выходят из изящного завершения
флаг us
Итак, я понял, что статус сервера apache показывает только статические файлы, а не активность php-fpm, что оказалось правдой, поэтому я настроил статус php-fpm, чтобы я мог видеть, что это такое. скорее всего, это то, что висит, и я также настроил медленный журнал, чтобы поймать его. https://gist.github.com/Jiab77/a9428050ab9bb3f17c5e33343da94fd8
флаг us
Так что все еще не повезло, я настроил мониторинг процессов php, и там нет pid, который застрял в G, и я понимаю, что мне даже не нужно было этого делать, поскольку я мог просто посмотреть список запущенных процессов для застрявшего PID ! Таким образом, кажется, что pid либо не работает, но apache думает, что это так, либо находится в каком-то состоянии, из-за которого он не отображается в обычном отображении процесса ???

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

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