Рейтинг:0

Рекомендации по устранению неполадок, связанных с зависанием приложения php из-за внутренних вызовов curl к не отвечающим конечным точкам

флаг cn

Недавно я обнаружил, что веб-сайт (электронная коммерция Prestashop на машине Centos PHP-FPM/Apache/MySql) не работает и не отвечает на веб-запросы.

После расследования проблема возникла из-за вызова API, сделанного с помощью php-curl к конечной точке, которая временно была отключена, внутри PHP-файла приложения, который был отозван на всех страницах веб-сайта.

Вызов cURL был ошибочно выполнен без настроек CURLOPT_TIMEOUT_MS, поэтому пользователи, посещающие мой веб-сайт, быстро заполняли максимальное количество соединений php, блокируя процессы php-fpm и не позволяя моему серверу получать другие входящие соединения.

Интересно, можно ли быстро и эффективно предотвратить/выявить такую ​​проблему «в производстве» с терминала, если она повторится (особенно быстро понять, какая конечная точка заблокирована, или определить файл, из которого сгенерирован скрипт, блокирующий сервер) , поскольку в моем случае мне пришлось проверять проблему на «уровне приложения», а не на сервере, поскольку:

  • при запуске «сверху» сервер показывает список заблокированных процессов php-fpm без какой-либо дополнительной информации для понимания проблемы (также средняя загрузка сервера была около 0,00, так как активности почти не было из-за зависших соединений).
  • Запуск «netstat -nputw» показывает мне много внутренних подключений в статусе TIME_WAIT, но снова нет информации о «виновнике» сбоя (могу ли я увидеть конечную точку, вызываемую php-curl с помощью netstat или аналогичной сетевой команды?)
  • Запуская "strace" процессов php-fpm вижу много задействованных файлов, но это не очень помогает, так как сайт при средней посещаемости открывает десятки и десятки файлов.
  • Журналы веб-сервера сообщили мне только о тайм-ауте подключения к веб-ресурсам, но не о сценарии, содержащем проблемный вызов cURL.

Спасибо за вашу помощь.

флаг ua
Добавьте время ожидания и измерьте, как долго он зависает.
user3256843 avatar
флаг cn
вопрос не в том, что делать после понимания корня проблемы, а в том, как правильно обнаружить ее, если она повторится (например, на другом сайте)
флаг ua
Если результаты завитка необходимы для построения страницы, вы должны подождать, пока завиток не завершится или не истечет время ожидания. Какой аспект этого утверждения вы можете расслабиться?
user3256843 avatar
флаг cn
возможно, я недостаточно четко сформулировал вопрос, что мне нужно знать, с точки зрения «сисадмина», как найти с терминала в кратчайшие сроки первопричину в такой ситуации, если это должны были произойти снова, например, на другом сервере, без знания того, как приложение сделано, и без анализа приложения.
флаг ua
И мое предложение было одним из шагов к этому. У меня могут быть дополнительные подсказки после того, как вы ответите на мои вопросы. (Когда я не могу ответить на вопрос, я хотя бы пытаюсь помочь с отладкой.)
user3256843 avatar
флаг cn
Я попытаюсь объяснить себя лучше: как только я обнаружил проблему в приложении, я прекрасно знаю, что для ее решения необходимо установить тайм-аут для не отвечающего вызова curl (или вызов curl должен быть отключен вообще), но исправление плохо написанного приложения не было частью моей работы... Вопрос был задан, потому что мне как системному администратору нужно определить основную причину проблемы, ничего не зная о базовом приложении, в кратчайшие сроки с оболочкой передо мной.
флаг ua
Анекдот: много лет назад у меня была программа, которая делала много сгибаний рук. Время от времени он зависал. Изучив это довольно много и спросив экспертов, я пришел к выводу, что проблема была вызвана чем-то очень низким в ОС. Я мог неоднократно показывать, что зависание составило ровно 80,0 секунд. Это, конечно, было неприемлемо. Но я не смог найти обходной путь в потоке. (Возможно, использование нескольких потоков позволило бы мне продолжить обработку, но я не хотел этого делать.)

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

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