php5-fpm 配置 pm -(节点)更多外行术语中的进程管理器设置节点

Kim*_*cks 2 php-fpm

我对 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
Run Code Online (Sandbox Code Playgroud)

我阅读了这个文档页面

希望对 pm 相关设置进行更人性化的解释。

例如,什么是 pm = dynamic ?pm = 还有其他可能的设置吗?pm.max_children 设置将同时提供的请求数量的限制。

那么这是否意味着如果我有 51 个不同的访问者,php-fpm 无法处理该网站的第 51 个访问者?

那会发生什么?第 51 位访客是否收到 404?

我比操作员更像开发人员,所以希望得到更人性化的解释。

Gru*_*mpy 5

有两种类型的处理器管理 (PM)。dynamicstatic

静止的

静态方法非常简单。您有一定数量的孩子,php-fpm 将始终尝试保持该数量的孩子。所以,如果你设置pm=staticpm.max_children = 50,你将永远有 50 个孩子,无论如何。

如果您有非常一致且经过良好测量的流量,这很好。这可以防止浪费精力增加和减少工人(动态影响最小)。它还减少了不可预测性。节省CPU

如果设置为静态,则所有其他字段都不会使用。

动态的

动态允许您的孩子计数波动。随着我们的进行,通过示例更容易理解。

当服务器启动时,它开始于 pm.start_servers. 以您的示例为例,我们现在有 25 个。假设其中 20 个正在使用,并且另一个请求已经通过,然后它被提供,但您的孩子数量增加了 1,因为它达到了最低备用阈值。请记住,创建进程非常耗时,因此您希望使用已经处于活动状态的进程来处理它。假设负载增加更多,现在您有 49 个活跃的孩子。然后最多制作 50 个,因为这是您的最大值。现在假设您的负载减少并且有 14 个活动负载。然后它会卸载一个孩子,达到总共 49 个孩子,因为它满足您的最大备用服务器。如果您的负载进一步下降到零,您将有 35 个孩子,并且您永远无法低于 35(通过最大请求除外,见下文)。儿童数量减少,因此您可以获得更多可用的 ram。

动态有点“别担心,我会在限制范围内为你优化”。

如果您需要保持低内存,这很好。节省内存

请求超过最大值

如果您有 50 个活动并收到另一个请求,它很可能会被经理排在队列中。虽然不确定,但我认为如果队列长度太长,它也会被拒绝。如果它在队列中停留的时间过长,请求者(如 nginx)将在网关超时时向最终用户返回 504。为了避免所有请求由于无休止的拥塞(ddos?)而超时,一旦达到一定数量的错误,nginx 通常会在 nginx 中定义的一段时间内停止将负载传递到死服务器(完全猜测大约 30 秒)从后端。

最大请求数

pm.max_requests 值定义了子进程在销毁自己以取代它的位置之前应该处理多少请求(或者如果仍然在上面定义的当前动态状态的限制内,则不处理)。这有助于防止内存泄漏(在 php-fpm child 本身或您的应用程序中)。所以,如果有内存泄漏,孩子的内存使用量会继续上升。为什么即使在 php 执行完成后它还会继续上升,这就是 php-fpm 优化其进程和内容的方式......我觉得那是一篇单独的文章。


注意防止您的帖子指出的混淆(或缺乏清晰度)。这与您有多少访问者甚至有多少人正在查看您的网站无关。这完全取决于我们同时处理了多少个 php。您希望大多数流程在 300 毫秒内完成。个人认为 100 毫秒以下是理想的。使用更好的硬件,您可以更快地处理,因此您可以处理更多的访问者(或更准确地说,请求),尽管同时进程数没有变化。


PS 我在这里说的所有内容也适用于 apache。只是变量名不同。