调试 PHP 进程卡住的原因

调试 PHP 进程卡住的原因

我正在尝试找出是什么原因导致我的系统打开大量 PHP 线程。这个问题在过去两周内发生了 3 次,如果几个小时内未被发现,可能会导致我们的应用程序崩溃,因为一旦它打开 300 个数据库连接,它就会阻止任何人进行进一步的连接。

该应用程序基于 CakePHP 2.X,运行在多个 EC2 实例上,共享一个 RDS 数据库。

出现问题的主要标志是数据库连接数量过多,如下图所示: 在此处输入图片描述

我们设置了 CloudWatch 监控,当平均连接数超过 40 个且持续时间超过 5 分钟时,会在 slack 上通知我们(通常连接数不会超过 10 个)。

查看 New Relic,我还可以看到 php 进程的数量每分钟稳步增加 1 个。这发生在我们的运营服务器上,该服务器仅处理后台处理和任务,不处理任何 Web 流量。 在此处输入图片描述

同时,网络服务器上的图表看起来很正常。

在查看 New Relics 中有关长时间运行进程的信息时,没有提供任何信息表明任何 php 进程运行了 20 多分钟,但是,这些进程被手动终止,这可能是它们在 New Relic 中不可见的原因——我相信它可能没有记录被终止的进程。

虽然这个问题已经发生了 3 次,但我仍然不确定是什么导致了这个问题,或者如何调试正在运行的特定 php 线程正在做什么。上次发生这种情况时,我可以看到所有 php 线程都在运行,并且可以看到它们已经运行了一段时间,但不知道它们在做什么或如何找出它们在做什么,为了防止数据库过载,我不得不将它们全部终止。

是否有任何工具或其他信息我忽略了,可以帮助我搜索确定哪个特定过程导致了此问题?

答案1

您可以连接到正在运行的特定进程,通过strace -p <pid>查看其进行的系统调用来了解其正在执行的操作。您有机会发现问题。

手册页: https://linux.die.net/man/1/strace

相关内容