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

Waa*_*als 0 php php-fpm

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

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

我们经营一个非常小的游泳池,只有两个静态的孩子。

pm = static
pm.max_children = 2
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

dir*_*rdi 5

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

等待几毫秒然后重复请求,将是处理此恕我直言的最佳方法。

184但是,AFAICS 替换文件fpm_status.c行应该是安全的

if (!fpm_spinlock(&scoreboard_p->lock, 1)) {
Run Code Online (Sandbox Code Playgroud)

if (!fpm_spinlock(&scoreboard_p->lock, 0)) {
Run Code Online (Sandbox Code Playgroud)

启用忙等待锁。