【问题小记】解决Linux下php-fpm进程过多耗尽内存问题

By | 6月 5, 2021

最近一段时间,发现经常性的服务器内存耗尽,导致mysql服务down掉,一开始以为是mysql跑的太久占用较多内存,后来认真排查了一下原来是是PHP-FPM进程过多导致的。

今天一看内存又达到了82%,预计不会太久服务又会挂掉,于是进行了排查解决,先查看目前空闲内存,已经不多了

[root@asdfasfa~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3790        2756         123          61         911         648
Swap:          1024        1021           3

先后top命令+M对占用内存较多的进程进行排序,发现大量的php-fpm进程,每一个虽然只占用1.5%的内存,但是架不住数量多,所以需要修改php-fpm的配置文件设置进程数来解决问题。

然后我就找到了php-fpm的配置文件php-fpm.conf(如果不清楚具体路径可以find命令搜索),发现原配置文件设置的数目是80,服务器内存不够妥妥的撑不住,赶紧修改pm.max_children和pm.max_spare_servers为25,pm.max_children表示最大的子进程数;pm.max_spare_servers表示最大空闲进程数,如果空闲进程数超过设置的值就会被清理掉;pm.min_spare_servers表示最小示空闲进程数,如果当前进程数小于该值则会新建进程

pm = dynamic
pm.status_path = /phpfpm_56_status
pm.max_children = 25
pm.start_servers = 15
pm.min_spare_servers = 15
pm.max_spare_servers = 25
request_terminate_timeout = 100
request_slowlog_timeout = 30
slowlog = var/log/slow.log

修改完成php-fpm.conf文件后重启php-fpm,命令如下:

[root@asdfasfa etc]# systemctl restart php-fpm

这个时候再用top命令看下内存占用,可以看到php-fpm数据少了,内存占用也降了下来,搞定!

然后可以再看下目前有多少个php-fpm进程,用命令ps -ef|grep "php-fpm"|grep "pool"|wc -l

[root@asdfasfa ~]# ps -ef|grep "php-fpm"
root      5283     1  0 14:56 ?        00:00:00 php-fpm: master process (/etc/php-fpm.conf)
www       5284  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5285  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5286  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5287  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5288  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5289  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5290  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5291  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5292  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5293  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5294  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5295  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5296  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5297  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5298  5283  0 14:56 ?        00:00:00 php-fpm: pool www
www       5301  5283  0 14:56 ?        00:00:00 php-fpm: pool www
root      5642  2936  0 15:00 pts/0    00:00:00 grep --color=auto php-fpm
[root@asdfasfa ~]# ps -ef|grep "php-fpm"|grep "pool"|wc 
     16     160    1056
[root@asdfasfa ~]# ps -ef|grep "php-fpm"|grep "pool"|wc -l
16
[root@iZ2ze847ngk4zxvazwm13lZ ~]# 

最后补充下,php-fpm是FastCGI进程管理工具,提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。
具体的工作原理:

1)Web Server启动同时,加载FastCGI进程管理器
2)FastCGI进程管理器读取php.ini配置文件,对自身进行初始化,启动多个CGI解释器进程(php-cgi),等待来自Web Server的连接。
3)当Web Server接收到客户端请求时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server会将相关环境变量和标准输入发送到FastCGI子进程php-cgi进行处理
4)FastCGI子进程完成处理后将数据按照CGI规定的格式返回给Web Server,然后关闭FastCGI子进程或者等待下一次请求。

发表评论

您的电子邮箱地址不会被公开。