Я пытаюсь выяснить, что заставляет мою систему открывать большое количество потоков 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