![NGinX + PHP-FPM 微服务死锁](https://linux22.com/image/709375/NGinX%20%2B%20PHP-FPM%20%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%AD%BB%E9%94%81.png)
我有许多小型服务分布在两台服务器上:
- 服务器 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 个请求队列”的选项,或者我的方法是否存在其他问题。
-- 当然,如果有任何诊断/日志我应该运行/提供。我很乐意提供。