Назад | Перейти на главную страницу

Отладка причины зависания процессов PHP

Я пытаюсь выяснить, что заставляет мою систему открывать большое количество потоков PHP. Эта проблема возникала 3 раза за последние 2 недели и может привести к сбою нашего приложения, если ее не обнаруживают в течение нескольких часов, поскольку после открытия 300 подключений к базе данных она не позволяет кому-либо подключиться дальше.

Приложение основано на CakePHP 2.X, работает на нескольких экземплярах EC2, которые совместно используют базу данных RDS.

Основным признаком того, что что-то идет не так, является большое количество подключений к базе данных, как показано на этом графике:

У нас есть настройка мониторинга CloudWatch, чтобы уведомлять нас о неактивном состоянии, когда среднее количество подключений превышает 40 в течение более 5 минут (обычно количество подключений не превышает 10).

Глядя на New Relic, я также вижу, что количество процессов php постоянно увеличивается на 1 в минуту. Он находится на нашем операционном сервере, который только выполняет фоновую обработку и задачи и не обрабатывает веб-трафик.

В то же время графики на веб-серверах выглядят нормально.

При просмотре информации New Relics о длительно работающих процессах нет информации, которая предполагала бы, что какие-либо процессы php работали в течение 20+ минут, однако эти процессы были убиты вручную, что может быть причиной того, что они не видны в New Relic - я считаю он не может записывать завершенные процессы.

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

Есть ли какие-либо инструменты или другая информация, которые я упускаю из виду, которые могут помочь мне в моем поиске, чтобы определить, какой конкретный процесс вызывает эту проблему?

Вы можете присоединиться к конкретному запущенному процессу с помощью strace -p <pid> чтобы увидеть, что он делает, просматривая системные вызовы, которые он выполняет. Есть шанс, что вы видите проблему.

Страница руководства: https://linux.die.net/man/1/strace