我做了一些调查,发现这需要计算和调整pm.max_children价值
https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/
例如:
- 我的服务器上有 8Gb
- 我托管了 30 个网站
- php-fpm 平均进程大小约为 40mb
- php-fpm 最大进程大小约为 80mb
- 我想为 php-fpm 进程分配最多 5Gb 的内存
如果我应用这个:
pm.max_children = 专用于 Web 服务器的总 RAM/最大子进程大小
就我的情况来说:
pm.max_children = 5120 / 80 = 64
但如果我添加下午.max_children = 64在每个 php-fpm 网站配置文件中,这意味着每个网站都可以使用64 子进程X1 个进程的大小(例如 40mb)=2560兆字节
如果我们想象一下,所有 30 个网站同时达到 pm.max_children 值,我们将得到:2560兆字节(每个网站最多)x三十网站 =76,800兆字节
我对么?
是的,这意味着当许多网站托管在同一台服务器上时,我们必须将计算结果除以pm.max_children = 5120 / 80=64按托管网站数量(此处为 30 个)。
所以 64 / 30 = 2,1 并且pm.max_children = 2每个网站
它正确吗?
谢谢
答案1
据我所知,你的计算是正确的。
在同一台服务器上拥有多个网站只有在并非所有网站都同时使用所有可用资源的情况下才有效。这就是人们通常所说的过度配置。
但是,我建议不要简单地计算pm.max_children
可用的 RAM,而要计算网络正常运行所需的实际工作量。从较低的值开始,然后监视php-fpm.log
。如果max_children
达到设置,您将在日志中找到它,并且可以增加它。
另外,请确保 PHP 工作进程只在必要时存活。例如,如果出现大量请求,以下配置将允许池使用最多 32 个 PHP 工作进程,但每个工作进程将在 3 秒不活动后退出并释放宝贵的 RAM:
pm = ondemand
pm.max_children = 32
pm.process_idle_timeout = 3s
ondemand
如果内存不足,请使用进程管理器。它比dynamic
pm 慢一点,但不会浪费内存来运行不活跃的网站。
如果要控制 PHP 进程的总数,有一个名为 的设置process.max
。php-fpm.conf
我从未使用过它,但在我看来,你可以使用它来确保无论池如何配置,工作进程的数量都不会超过一定值。
顺便说一句,对属于不同用户的不同网站使用不同的池是个好主意。这样,您就不会遇到用户权限问题或从其他网站缓存的数据问题。
答案2
我只能根据我们的经验给你一些建议。
我们只有一个 PHP-FPM 池运行来共享资源(CPU 和 RAM)。
多个池允许不同的用户帐户(例如 www-data1、www-data2 ...),并可能有助于限制访问。此外,如果需要,您还可以为 CPU 和 RAM 消耗分配不同的值。
但是以下示例仅使用一个池:
; www.conf
;
; set pool management to have a fixed number of php workers
pm = static
; number of php processes (6 processes per CPU core)
pm.max_children = 48
我建议使用静态池管理。这意味着始终有固定数量的 PHP 工作者。
; www.conf
;
; redirect worker stdout and stderr into main error log
catch_workers_output = yes
如果您的应用程序遇到错误,这可能会有所帮助。
; php-fpm.conf
;
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
这是对正在运行的 PHP 工作程序的一些基本生命监控。
这些更改之后,请不要忘记重新启动 PHP-FPM 服务。