Code前端首页关于Code前端联系我们

解决PHP-FPM进程导致的服务器内存占用问题

terry 2年前 (2023-09-28) 阅读数 68 #未命名

php-fpm服务器经常有大量内存。

最简单、立即有效的方法就是重启服务或者干脆重启服务器。这对于某些临时进程导致的虚假高内存可能有效,但显然在这里不可能。很可能会影响生意。解决方案本节有三项设置方式有三种:static、dynamic、ondemand

一种是pm=static,始终保持固定数量的子进程。该数量由 pm.max_children 确定。这种方法非常不灵活,通常不是默认设置。

第二个是pm=dynamic,就是这样的。启动时会创建固定数量的子进程(由pm.start_servers控制),可以理解为最小子进程数,最大子进程数由pm决定。 max_children 受到控制。在这种情况下,子进程的数量在最大和最小范围内变化。还没结束。空闲子进程的数量还可以通过另外两个配置来控制,即pm.min_spare_servers和pm.max_spare_servers,即空闲子进程也可以有一个最小和最大数量,如果空闲子进程超过pm.max_spare_servers,他们会被杀。 (注意 pm.max_spare_servers 小于 pm.max_children)

第三种模式是 pm = ondemand 模式。此模式与 pm = 动态相反。它优先考虑记忆。它的工作方式非常简单。每个空闲进程在空闲 pm.process_idle_timeout 秒后被终止。在这种模式下,在服务器高峰期,内存会自然减少。如果服务器长时间没有请求,则只有一个php-fpm master。当然,该进程的缺点是,在高峰时段或者pm.process_idle_timeout值太短时,无法避免服务器重复创建进程的问题。所以,pm=dynamic和pm=ondemand哪个选项更合适,需要根据实际情况而定。

正如您所看到的,pm = 动态模式非常灵活,通常是默认选项。但是,为了最大化服务器响应,动态模式会增加内存使用量,因为此模式仅杀死超过空闲服务器最大数量 (pm.max_spare_servers) 的空闲进程。比如最大未使用进程数为30,最大未使用进程数为30,进程数为50,则网站出现峰值。目前50个进程全部繁忙,空闲进程数为0。那么高峰时间过后,可能就没有任何请求了,所以有50个空闲进程,但是目前PHP fpm只杀死20个子进程,并且始终是30个进程保持空闲进程等待请求。这可能是在高峰期过后,即使请求数大幅下降,服务器的内存使用率也没有大幅下降的原因,也可能是为什么有时候服务器重启后情况会好很多?因为重启后,php-fpm中的子进程数变成了最小空闲进程数,而不是之前的最大空闲进程数。

max_requests

也就是说,如果每个进程超过这个数量(和php进程关系不大,关系不大),就会被自动杀死。

max_children

最大进程数,一般来说通常每个php-fpm服务器消耗大约4000万内存。理想的最大进程数可以计算为1000/40=25。但实际上,php-fpm 比 php-fpm 使用内存更多,所以可以根据实际情况来确定。 ,适当缩小,避免由于php-fpm进程过多而导致内存消耗。而如果“max_children”设置为较低的值,如5-10,php-fpm会“很累”,处理速度会很慢,等待时间会更长。如果长时间未处理请求,则会显示“504网关超时”错误消息。

request_terminate_timeout

根据服务器的性能进行设置。一般来说,性能越好,可以设置得越高,从20到30分钟。由于我的服务器上的 PHP 脚本需要运行很长时间,有些可能需要 10 分钟以上,所以我将其设置为 1200 秒,这样 php-fpm 就不会死掉并得到 502 Bad gateway 错误。

Pm.Start_Servers

动态模式下初始 PHP-FPM 进程数

pm.min_slare_servers

动态模式下 PHP-FPM 最低空闲时间

pm.min_slare_servers

动态 php -FPM fpm 模式下最大空闲进程数

php-fpm配置文件分离出来,方便管理。在 /opt/plesk/php/7.1/etc/php-fpm.d

中,这样我们就可以找到哪个是

[root@orion php-fpm.d]# ls

aabus 。 com.conf coachrun.com.conf jadiamortgage.com.conf jadia.net.conf livechat.taketours.com.conf lltours.com.conf sunnyboston.com.conf

[root@orion php-fpm.d]# vim livechat.taketours.com.conf

这是之前的配置文件:

pm = ondemand #按需ondemand
pm.max_children = 5 #最大进程数
pm.max_spare_servers = 1 #动态方式下的最大php-fpm闲置进程数量
pm.min_spare_servers = 1 #动态方式下的最小php-fpm闲置进程数
pm.process_idle_timeout = 10s #按需方式下多长时间杀掉php-fpm子进程,直到master进程
pm.start_servers = 1 #动态方式下的起始php-fpm进程数量

编辑后的配置:

pm = ondemand
pm.max_children = 5
pm.max_spare_servers = 2
pm.min_spare_servers = 2
pm.process_idle_timeout = 10s
pm.start_servers = 1
pm.max_requests = 1024 指的是每个子进程在处理了1024个请求数量之后就重启

跟踪Jäne后,我注意到内存在30,000kb左右波动,并且进程中物理内存的百分比仅0.1%

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门