从网上一些文献资料可以了解到:
PHP-FPM(或Fast Process Manager)比mod_PHP提供了几个优势,其中两个最值得注意的是它的配置更灵活,目前是社区中许多人首选的运行PHP的模式。然而,如果你使用包管理器的默认配置设置,那么你可能无法充分利用它。举例子通俗的讲如果你的服务器配置低并且按照大部分网上的配置或默认的php-fpm.conf配置的话,php-fpm会大量占用你的内存,你的服务器死机的概率将大大提升。
在这篇文章中,我将通过讨论PHP-FPM的三种流程管理器类型,以及在何种情况下最好使用哪一种,来简要概述如何提高PHP-FPM的性能。
PHP-FPM可以使用三种过程管理类型:
- static
- dynamic
- ondemand
让我们来详细了解一下每一个是什么。
Static
静态可确保始终有固定数量的子进程可用于处理用户请求。这是用pm.max_children设置的。在这种模式下,请求不需要等待新进程启动,这是最快的方法。
假设你想使用静态配置,并且始终有10个子进程可用,你可以在/etc/php/7.2/fpm/pool.d/www.conf中对其进行如下配置(假设你使用的是Debian/Ubunde的php-fpm的默认配置文件):
pm = static pm.max_children = 10
要查看配置更改是否有效,请在重新启动PHP-FPM后,运行pstree -c -H <PHP-FPM process id> -S <PHP-FPM process id>。这将显示有10个可用的进程,如下面的示例所示。
php-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
Dynamic
在这种模式下,PHP-FPM动态管理可用子进程的数量,并确保至少有一个子进程始终可用。
此配置使用五个配置选项:
- pm.max_children:允许派生的最大子进程数。
- pm.start_servers:PHP-FPM启动时要启动的子进程数。
- pm.min_spare_servers:PHP-FPM将创建的空闲子进程的最小数量。如果可用数量少于此数量,则会创建更多。
- pm.max_spare_servers:PHP-FPM将创建的空闲子进程的最大数量。如果可用的子进程数超过此值,则某些子进程将被终止。
- pm.process_idle_timeout:空闲时间(以秒为单位),在此之后子进程将被终止。
现在有趣的部分来了;如何计算每个设置的值?Sebastian Buckpesch提供以下公式:
- max_children(总内存(RAM)-用于Linux、DB等的内存)/ 进程大小
- start_servers CPU内核数x 4
- min_spare_servers CPU核数x 2
- max_spare_servers与start_servers相同
我们还需要设置pm.process_idle_timeout,这是空闲进程将被终止的秒数。
假设我们的服务器有两个CPU,每个CPU有四个核心,8GB RAM。如果我们假设Linux和相关守护进程使用大约2GB(使用free -hl获得更具体的值),那么我们剩下大约6192MB。
现在,每个进程使用了多少内存?为此,有一个名为ps_mem.py的Python脚本。运行它后,使用sudo python ps_mem.py | grep php-fpm,你将获得类似于以下内容的输出:
28.4 MiB + 33.8 MiB = 62.2 MiB php-fpm7.2 (11)
第一列是专用内存,第二列是共享内存,第三列是使用的总RAM,第四列是进程名称。
从上面可以看出,进程大小为62.2MiB。因此,将所有这些信息输入我们的公式,我们得出以下结果:
# Round the result up. (8192 - 2000) / 62.2
基于此,我们得出以下设置值:
Setting | Value |
---|---|
max_children | 100 |
start_servers | 32 |
min_spare_servers | 16 |
max_spare_servers | 32 |
我们将把pm.process_idle_timeout保留为默认值10s。假设我们对这些设置感到满意,那么我们将按如下方式进行配置:
pm = dynamic
pm.max_children = 100
pm.start_servers = 32
pm.min_spare_servers = 16
pm.max_spare_servers = 32
pm.max_requests = 200
你还可以定期使用内存监控工具来监控应用程序正在使用的内存量。PHP有很多可用的选项,包括PHP-memprof和Tideways。
ondemand
当接收到请求时,ondemand具有PHP-FPM分支进程。要配置PHP-FPM以使用它,我们需要将pm设置为dynamic,并提供以下值:
- max_children
- process_idle_timeout
- max_requests
max_requests设置每个子进程在重新发布之前应执行的请求数。文档表明,此设置有助于解决内存泄漏问题。
假设我们采用与动态相同的设置,我们将按如下方式进行配置:
pm = ondemand
pm.max_children = 100
pm.process_idle_timeout = 10s
pm.max_requests = 200
哪种配置适合你?
这就完全取决于你的服务器配置了
低流量站点
如果你有一个流量较低的站点,例如承载后端控制面板(如cPanel)的站点,则使用ondemand。内存将被保存,因为子进程只会在需要时产生,而在不再需要时被扼杀。由于它是一个后端,用户可以在线程生成以处理他们的请求时再等待一两分钟。
高流量网站
如果你有一个高流量的网站,那么使用静态设置,并根据你的需求和可用的硬件资源调整设置。让大量子进程始终准备好接收请求似乎有些过头了。
然而,高流量网站需要尽快做出响应。因此,必须使用static,以便有足够数量的子进程可以这样做。
通过使用ondemand,子进程可能会消耗过多的内存,并且启动延迟会影响性能。
根据配置的不同,使用dynamic可能不会那么糟糕。然而,你最终可能会得到一个有效镜像静态的配置。
低配置服务器的大致php-fpm配置:
pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 5
pm.max_requests = 500
pm.process_idle_timeout = 10s
至少能让你的低配置服务不至于死机
另外补充下找不到自己的php-fpm配置文件试着查找下,命令如下
find / -name php-fpm.conf
最后,大致的配置你计算下,实在不行就逐级降低以上参数配置,当你的内存不再是多频率跑满那就是最适合你服务器的配置了