最近一段时间,发现经常性的服务器内存耗尽,导致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子进程或者等待下一次请求。