NGinX + PHP-FPM微服务死锁

我有许多小型服务在两台服务器上运行:

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

问题在这里。 在不可预知的时间间隔内,服务器将开始超时,CPU,内存或磁盘活动不会显着。

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

我确定这个问题是PHP-FPM中的一个僵局。 当服务AB接收到n个请求(n是允许产生同时进程的PHP-FPM的数量)之后,它已经设法向同一台机器上的服务发出请求,它将开始排队请求。

显然,如果它已经分配了所有的进程,PHP-FPM将停止处理任何新的请求。 不幸的是,这包括它在同一台服务器上的请求。 因此,服务器将实际上已经死亡(服务器B与它一起)。

起初,我发现解决scheme相当简单:我创build了几个PHP-FPM池,允许应用程序并行运行。 这可以缓解这个问题,因为它现在允许PHP-FPM创build更多的stream程,但是不能解决这个问题。

我不确定问题的确切原因是什么,但是由于问题似乎没有改变:服务器将闲置,但为其中一个服务产生了最大数量的PHP-FPM进程。 我认为现在Nginx已经陷入了僵局。

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

想知道是否有两个不同的服务有“两个请求队列”的选项,或者如果我的方法有什么问题的话。

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