最近发现个人博客的Linux服务器和数据库服务经常挂机,让我需要重启才能正常访问,极其恶心。于是决定解决问题,释放时间和精力(不想频繁出错然后手动重启,费力费时)。
分析问题
发现问题后,首先使用free -m指令检查当前服务器执行状态:
可以看到我的服务器内存是2G,但是可用内存只有70M,内存利用率高达92%。由于内存利用率高,数据库服务可能会挂起。
继续查看详细信息,并使用顶部命令:
然后查看指令输出结果中列出的过程细节,重点关注第十列内存使用率:
发现CPU利用率不高,也消除了CPU问题。此外,可以看到数据库服务占用了15.2%的内存。如果内存使用率过高,数据库进程(占用最高内存的进程)将被挤出,导致服务挂起。因此,我们需要检查详细的内存使用情况。哪些进程会消耗这么多内存?
使用说明:
PS auxw | head-1;Ps auxw|sort -rn -k4|head -40查看消耗内存最多的前40个进程:
查看第四列的内存使用率,我们发现除了mysql数据库服务之外,php-fpm服务池打开了太多的子进程,占用了一半以上的内存。发现了问题,我们开始解决问题:设置控制php-fpm进程池的进程数。
解决问题
通过各种搜索方法,发现可以通过配置pm.max_children属性来控制php-fpm子进程的数量。首先,打开php-fpm配置文件并执行指令:
Vi /etc/php-fpm.d/www.conf找到了pm.max_children字段,发现其值过大:
如图所示,pm.max_children的值是50,每个进程占用1%-2.5%的内存,加起来就是大部分的内存,所以我们需要减少它的值,博主这里设置为25。同时,检查以下两个属性:
Pm.max_spare_servers :该值意味着保证最大空闲进程数。如果空闲进程大于该值,此清理pm.min_spare_servers :将保证空闲进程的最小数量。如果空闲进程小于该值,则会创建一个新的子进程。
这两个值不能大于pm.max_children的值。通常,pm.max_spare_servers的值设置为pm.max_children值的60%-80%。
最后,重启php-fpm
Systemctl restart php-fpm再次查看内存使用情况,内存使用情况要低得多:
多次观察内存使用情况后发现,经过这次改进,服务器内存资源的消耗得到了很大的缓解。
Ps:检查php-fpm打开的进程数和每个进程的内存限制
1.通过命令检查服务器上打开了多少php-cgi进程
PS-Fe | grep' PHP-FPM' | grep '池' | WC-L2。检查有多少php-cgi进程被用来处理tcp请求
netstat-ANP | grep ' php-fpm“| grep”TCP“| grep”池“| WC-L3”中每个PHP-fpm进程的内存限制。Linux nginx PHP环境
设置方法:
编辑php-fpm.conf配置文件
PHP _ admin _ value[memory _ limit]=128m(我的服务器上的配置文件包含在PHP-fpm . conf in/etc/PHP 5/fpm/pool . d/www . conf中)后面的数字可以随意更改:32M、64M、128m、256M、512M
摘要
以上就是边肖介绍的Linux中php-fpm进程过多导致内存耗尽问题的解决方案。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!