NGinX + PHP-FPM 微服务死锁

NGinX + PHP-FPM 微服务死锁

我有许多小型服务分布在两台服务器上:

  • 服务器 A) 管理高安全性服务:用户帐户和个人消息。
  • 服务器 B)管理低安全性服务:图像上传和公共内容。

问题来了。在某些不可预测的时间间隔内,服务器将开始超时,而没有明显的 CPU、内存或磁盘活动。

我很快发现问题在于服务器 A 正在运行两个相互依赖的服务。在此示例中,我将它们称为服务 AA 和 AB。当服务 AB 收到请求时,它将 curl AA 以类似 oAuth 的方式检索有关用户帐户的数据。

我确定该问题是由于 PHP-FPM 内部出现死锁。当服务 AB 在向同一台机器上的服务发出请求之前收到 n 个请求(n 是允许 PHP-FPM 生成的同时进程数)时,它将开始对请求进行排队。

显然,如果已经分配了所有进程,PHP-FPM 将停止处理任何新请求。遗憾的是,这包括它在同一台服务器上处理请求。因此,服务器实际上将停止运行(服务器 B 也随之停止运行)。

起初我发现解决方案相当简单:我创建了多个 PHP-FPM 池,允许应用程序并行运行。这缓解了问题,因为它现在允许 PHP-FPM 整体创建更多进程,但并没有解决问题。

我不确定问题的具体原因是什么,但问题似乎没有变化:服务器将处于空闲状态,但会为其中一项服务生成最大数量的 PHP-FPM 进程。我假设死锁现在在 NginX 方面。

我不想声称了解 nguni 是如何工作的,但据我所知,如果有 n+1(n 仍然是其中一个池的 PHP-FPM 进程限制)对服务 AB 的请求 - 这取决于 AA - NginX 将等待 PHP-FPM 接受该请求。

很想知道是否可以为两种不同的服务提供“2 个请求队列”的选项,或者我的方法是否存在其他问题。

-- 当然,如果有任何诊断/日志我应该运行/提供。我很乐意提供。

相关内容