我对 php-fpm 有以下配置
[www]
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
user = www-data
group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 25
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 2500
pm.status_path = /php-status
我读本文档页面。
希望对 pm 相关设置有更加人性化的解释。
例如,pm = dynamic 是什么意思?pm = 还有其他可能的设置吗?pm.max_children 设置了将要同时处理的请求数量的限制。
那么,这是否意味着如果我有 51 个不同的访问者,php-fpm 就无法处理第 51 位网站访问者?
然后会发生什么?第 51 位访问者会遇到 404 错误吗?
我更侧重于开发而不是操作,因此希望得到更人性化的解释。
答案1
处理器管理(PM)有两种类型:dynamic
和static
。
静止的
静态方法非常简单。您有一个固定的子节点数,php-fpm 将始终尝试维持该子节点数。因此,如果您设置pm=static
和pm.max_children = 50
,无论如何,您始终会有 50 个子节点。
如果您的流量非常稳定且经过严格衡量,那么这种方法就很好。这可以避免浪费精力增加和减少员工(动态影响最小)。它还可以降低不可预测性。节省 CPU
如果设置为静态,则所有其他字段均不使用。
动态的
动态允许您的孩子数数。通过示例,我们更容易理解。
服务器启动时,从 开始pm.start_servers
。按照您的示例,我们现在有 25 个。假设其中 20 个正在使用,并且又一个请求已通过,那么该请求已得到服务,但子进程数增加 1,因为它已达到最小备用阈值。请记住,创建进程非常耗时,因此您需要使用已经处于活动状态的进程来处理它。假设负载进一步增加,现在您有 49 个活动子进程。那么最多可创建 50 个,因为这是最大值。现在假设您的负载减少,有 14 个活动子进程。然后它将卸载一个子进程,使子进程总数达到 49 个,因为它已达到最大备用服务器数。如果负载进一步下降到零,您将有 35 个子进程,并且永远不会低于 35 个(通过最大请求数除外,请参见下文)。子进程数减少,因此您可以获得更多可用 RAM。
动态有点像“别担心,我会在限制范围内为你优化”。
如果您需要保持低内存,那么这很好。节省 RAM
请求超过最大限额
如果您有 50 个活动请求并收到另一个请求,则管理器可能会将其放入队列中。虽然不确定,但我认为如果队列长度太长,它也倾向于拒绝。如果它在队列中停留的时间太长,请求者(如 nginx)将向最终用户返回 504,因为网关已超时。为了避免由于无休止的拥塞(ddos?)导致所有请求都超时,一旦后端的错误数量达到一定数量,nginx 通常会在 nginx 定义的一段时间内(完全猜测大约 30 秒)停止将负载传递给死机服务器。
最大请求数
pm.max_requests 值定义子进程在销毁自身以便新进程取代它之前应处理多少个请求(如果仍在上述定义的当前动态状态的限制范围内,则不处理任何请求)。这有助于防止内存泄漏(无论是在 php-fpm 子进程本身还是您的应用程序中)。因此,如果存在内存泄漏,子进程的内存使用量将继续上升。为什么它在 php 执行完成后仍继续上升,而这一切都是 php-fpm 如何优化其进程等……我觉得这是一篇单独的文章。
为防止您的帖子中出现混淆(或缺乏清晰度),请注意。这与您的访客数量或当前有多少人在查看您的网站无关。这完全取决于我们同时处理多少个 php。您可能希望大多数进程在 300 毫秒内完成。个人认为 100 毫秒内是理想的。有了更好的硬件,您可以更快地进行处理,因此尽管同时处理的数量没有变化,但您可以处理更多的访客(或更准确地说是请求)。
PS 我在这里所说的也适用于 Apache。只是变量名不同。