解决Linux中PHP-FPM进程过量占用内存

1. 事情经过

其实这个问题困扰了我很长时间。事情经过是这样的:我在写这篇文章前几天,对网站服务器进行了停机维护,其中包括更换操作系统、重新配置网站环境、更换博客程序、使用新模板等许多操作(包括误删数据库并没有)。然后问题就出现了!内存多次跑满(如图)!由于我在服务器商处设置了内存超量报警,导致收到了几十条报警信息。由于我这几天有些事情(因为懒并不是),没有认真打理网站,所以只是确定服务器未被入侵后就重启了之。这一拖就到了今天。但是问题早晚要解决!现在我们来解决这个问题吧。

2. 排查过程

实际上排查还是很简单的,直接使用 linux 自带的命令free -m 然后查看空闲内存确定是内存跑满,然后是使用top命令查看进程情况,并确定 cpu 状态正常。

(这里本应有一张我修复故障前的 top 命令结果图,但是我忘记截图了……)

查询结果可以看见我服务器中PHP-FPM进程占用了一半多的内存,找到原因,果断处理!

补充几条命令,会对你排错有帮助:

查看每个PHP-FPM进程的内存占用:ps -ylC php-fpm –sort:rss

查看消耗内存最多的前 40 个进程:ps auxw|head -1;ps auxw|sort -rn -k4|head -40

查看PHP-FPM的平均内存占用:ps –no-headers -o “rss,cmd” -C php-fpm | awk ‘{ sum+=$1 } END { printf (“%d%s\n”, sum/NR/1024,”M”) }’

3. 处理方法

我们可以通过修改 php 的配置文件来限制PHP-FPM的创建和销毁。

我们找到 /www/server/php/etc/php-fpm.conf (在我服务器中是这个路径) 文件,用 vi 打开,找到 pm.max_children 也就是控制 php-fpm 子进程数量的字段,我修改前这个字段是 50,我将其修改为 25。再找到pm.max_spare_servers 这个字段表示空闲进程数的最大值,这个数应为pm.max_children 的 60%~80%,所以我设置为 17。

注意:如果pm.max_children设置过小可能会导致 502 错误频发,应按照自己服务器业务要求和服务器能力自行设置!

这样我们就修改好了配置文件 :wq 退出 vi,并使用 systemctl restart php-fpm 重启PHP-FPM。

(我基本可以确定,90%用户的php-fpm.conf文件与上图不同,大家自己找对应字段就好

4. 处理结果

我们可以看到重启服务后内存瞬间降低至 26%然后稳定到 50%,所以这个问题算是解决了!

标签:PHPLinux 发布于:2019-10-25 14:52:13