通过访问 /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
),这确实是一个相当准确的响应。
等待几毫秒然后重复请求,在我看来是处理此问题的最佳方法。
然而,就我所知,替换文件行应该是安全184
的fpm_status.c
if (!fpm_spinlock(&scoreboard_p->lock, 1)) {
和
if (!fpm_spinlock(&scoreboard_p->lock, 0)) {
启用忙等待锁。