PHP-如何解决PHP+FPM导致内存泄露的问题?

PHP-如何解决PHP+FPM导致内存泄露的问题?

瑾兮 发布于 2017-09-13 字数 106 浏览 1070 回复 2

php-fpm配置过程中最大问题是内存泄漏的问题:服务器的负载不大,但是内存占用迅速增加,如何解决该问题?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

虐人心 2017-11-05 2 楼

根据官方的介绍,php-cgi不存在内存泄漏,每个请求完成后php-cgi会回收内存,但是不会释放给操作系统,这样就会导致大量内存被php-cgi占用。

官方解决办法是降低PHP_FCGI_MAX_REQUESTS的值,对应php-fpm.conf中的max_requests,该值的意思是发送多少个请求后会重启该线程,需要适当降低这个值,让php-fpm自动的释放内存,还有另一个跟它有关联的值max_children,这个是每次php-fpm会建立多少个进程,这样实际上的内存消耗是max_children*max_requests*每个请求使用内存

归属感 2017-10-27 1 楼

没别的特别原因,就是因为内存不够用了,除了上面说的降低PHP_FCGI_MAX_REQUESTS的值,还有其他解决办法:

1.检查php进程的内存占用,杀掉内存使用超额的进程

一般情况下,如果php-cgi进程占用超过1%的内存,就得考虑一下是否要杀掉它了。因为普通情况下,php-cgi进程一般占用0.2%或以下。

这里提供一个脚本供各位使用,就是放在cron任务里,每分钟执行一次。

使用crontab -e 命令,然后添加如下调度任务

* * * * * /bin/bash /usr/local/script/kill_php_cgi.sh

kill_php_cgi.sh脚本如下

#!/bin/sh
#如果是要杀掉php-fpm的进程,下面的语句中php-cgi请改成php-fpm
pids=`ps -ef|grep php-cgi|grep -v "grep"|grep -v "$0"| awk '{print $2}'`
if [ "$pids" != "" ];then
for  pid  in   $pids;
do
kill -9 $pid
done

2.增加内存,将PHP_FCGI_MAX_REQUESTS的值设置成跟你内存总存储量相对应的值

3.优化程序,降低处理每次请求占用的内存大小