为什么 php-fpm 状态有时会返回“服务器繁忙”(503)?

为什么 php-fpm 状态有时会返回“服务器繁忙”(503)?

通过访问 /fpm-status 页面,使用工具定期检索 Prometheus 指标。有时,该工具无法访问 /fpm-status 页面,因为 php-fpm 响应“服务器繁忙。请稍后重试。”(HTTP 503)在此期间,php-fpm 仅记录以下内容:

注意:[pool www] 状态:记分牌已在使用中。

我们经营的游泳池很小,只有两个静止的孩子。

pm = static
pm.max_children = 2

对 /fpm-status 的请求可能会排队。但这通常不是问题。对 fpm 池的请求数量也非常少。所以我不认为队列会很长。(当然我不能肯定,因为那段时间的指标没有收集)

看看fpm 源代码我可以看到它无法获取记分板上的锁。但它不会等待它可用。因此,当未获取锁时,它会返回错误。但这是否意味着当另一个请求正在写入记分板(更新状态)时 fpm-status 不可用?

这是什么意思(即我该如何解决这个问题)?

  • 我需要增加 max_children 吗?
  • 接受这种情况定期发生,然后简单地重试收集指标?
  • 还有别的吗?

答案1

在浏览完 FPM 代码后,fpm_scoreboard_update函数更新记分牌,似乎是唯一获取相同锁的其他函数。因此,当且仅当此时记分牌已更新或同时有两个/fpm-status请求时,请求才会失败。在这种情况下,服务器将返回HTTP 503状态代码(503 Service Unavailable),这确实是一个相当准确的响应。

等待几毫秒然后重复请求,在我看来是处理此问题的最佳方法。

然而,就我所知,替换文件行应该是安全184fpm_status.c

if (!fpm_spinlock(&scoreboard_p->lock, 1)) {

if (!fpm_spinlock(&scoreboard_p->lock, 0)) {

启用忙等待锁。

相关内容