Press "Enter" to skip to content

解决Linux下php-fpm进程过多导致内存使用率偏高


最近再对主机内存进行监控的时候发现,php-fpm进程有很多,使用top命令按照内存使用率排序如图所示:

进程占用内存比较多,因为决定优化php-fpm,进过一番折腾,终于解决问题。

使用vim打开配置文件,按Esc键,之后输入”/”, 再输入“xxx”可以查找“xxx”这个字符串。具体配置参数如下:
我的配置文件路径为:/etc/opt/remi/php73/php-fpm.d/www.conf (我安装的php73)

pm = dynamic #指定进程管理方式,有3种可供选择:static、dynamic和ondemand。
pm.max_children = 16 #static模式下创建的子进程数或dynamic模式下同一时刻允许最大的php-fpm子进程数量。
pm.start_servers = 10 #动态方式下的起始php-fpm进程数量。
pm.min_spare_servers = 8 #动态方式下服务器空闲时最小php-fpm进程数量。
pm.max_spare_servers = 16 #动态方式下服务器空闲时最大php-fpm进程数量。
pm.max_requests = 2000 #php-fpm子进程能处理的最大请求数。
pm.process_idle_timeout = 10s
request_terminate_timeout = 120
修改后重启进程
sudo systemctl restart php73-php-fpm.service

pm三种进程管理模式说明如下:
pm = static,始终保持一个固定数量的子进程,这个数由pm.max_children定义,这种方式很不灵活,也通常不是默认的。
pm = dynamic,启动时会产生固定数量的子进程(由pm.start_servers控制)可以理解成最小子进程数,而最大子进程数则由pm.max_children去控制,子进程数会在最大和最小数范围中变化。闲置的子进程数还可以由另2个配置控制,分别是pm.min_spare_servers和pm.max_spare_servers。如果闲置的子进程超出了pm.max_spare_servers,则会被杀掉。小于pm.min_spare_servers则会启动进程(注意,pm.max_spare_servers应小于pm.max_children)。
pm = ondemand,这种模式和pm = dynamic相反,把内存放在第一位,每个闲置进程在持续闲置了pm.process_idle_timeout秒后就会被杀掉,如果服务器长时间没有请求,就只会有一个php-fpm主进程。弊端是遇到高峰期或者如果pm.process_idle_timeout的值太短的话,容易出现504 Gateway Time-out错误,因此pm = dynamic和pm = ondemand谁更适合视实际情况而定。

对于大内存以及对并发和可用性要求的话,建议使用static管理模式+最大的pm.max_children。如果是小内存的服务器,建议使用dynamic或者ondemand模式,同时降低pm.start_servers和pm.max_spare_servers进程数。

ps:查看php-fpm开启的进程数以及每个进程的内存限制

1.通过命令查看服务器上一共开了多少的 php-cgi 进程

ps -fe |grep “php-fpm”|grep “pool”|wc -l

2.查看已经有多少个php-cgi进程用来处理tcp请求

netstat -anp|grep “php-fpm”|grep “tcp”|grep “pool”|wc -l

文章参考:
https://www.cnblogs.com/loveyouyou616/p/9842621.html
https://segmentfault.com/a/1190000015927405

发表评论

电子邮件地址不会被公开。 必填项已用*标注

9 + 20 =