减少php-fpm的内存消耗

最近发现服务器内存消耗方面php-fpm占的比例确实是很重的,
php-fpm其实也提供了一个很好的机制来控制内存,也就是通过动态控制线程的数量来达到控制内存的消耗,

本文主要讲述的是通过两方面来达到控制php-fpm的内存

第一种方法  对php-fpm进行设定

 

本文适用于CentOS 6    x86_64

以及 php-fpm-5.3.3-23.el6_4.x86_64

 

php-fpm 设定档的通常位置是

vim /etc/php-fpm.d/www.conf

我们可以用vim打开它

 

主要看的还是这几个参数

 

//既然是要减少内存,就要需要用的时候多开点,不需要的时候少开点,所以是动态的
//如果选择不是动态的,将无法使用下面的参数
pm = dynamic

//最大的线程数,本人的主机是爆发内存可以用到1G,因此25个线程应该不成问题
pm.max_children = 25

//服务一开启后的线程数量,这个涉及平稳时期的内存消耗,如果平时不想消耗太多内存应该要开少一点,
//当然每个线程打开的时候要消耗大概一秒左右的时间,因此,还是要看需要
pm.start_servers = 3

//这是下限
pm.min_spare_servers = 3

//根第二项其实是重复的,不过这一项是针对动态的.
pm.max_spare_servers = 25

 

 

 

将php-fpm reload 一下你用pstree看就能够看到线程的数量的,如果没有人访问的情况下,往往是跟pm.start_servers是一致的

service php-fpm reload
pstree

这时候可以再看看主机的实时内存是多少,根据你的需要调整数值

 

 第二种方法 定时对php-fpm进行reload

有时候你会发现,php-fpm的线程控制并不是那么的科学,它要过很长时间才会关闭线程并释放内存,另外一方面,php-fpm的插件也不可避免地会有或多或少的内存泄露,我们怎样才能够更加主动的关闭php-fpm呢.

这里讲述的会是其中一种特别有用的解决方案,就是用crond来定时执行sh脚本,通过sh来定时reload php-fpm,来达到释放内存的效果.

 

crond在非精简版(Minimal) 的CentOS里面应该是标准配置.

通过chkconfig 将crond设置为开机启动并打开crond

service crond start
chkconfig crond on

 

sh脚本方面也是相当简单,就是一句话

service php-fpm reload

保存为sh

注意,应该要开启执行的权限

打开crond设置档

crontab -e

输入

0       */1     *       *       *       /root/run/clear.sh              >/dev/null 2>&1

当然这里因人而异了,我这里设置是没一小时释放一次内存,最后将输出导向linux的黑洞,不发送烦人的crond电子邮件.

当然,十分要注意的是,线程的打开其实是需要时间的,但是很多情况下感觉不到,特别是第二次访问的时候,所以,当你的网站访问量不是很大的时候,没有必要太担心.总而言之,这些数值方面都要经过自己的精心调配吧

 

 

 

------

经过一段时间的调试,发现php-fpm 的内存消耗其实还跟Nginx 的监听数量呈正相关. 因此尽量减少Nginx的监听数量也是很有用的,特别是在多个IP的主机里面,最好不要共同监听全部IP的80端口.

2013年12月19日更新

 

 

 

 

 

------

最近才发现,OpenVZ的主机可能存在一些内存管理方面的漏洞,导致无法释放内存,个人建议,挑选VPS的时候还是尽量不要使用OpenVZ架构下的虚拟主机,如果可以尽量使用Xen架构的。因为内存管理问题,可能导致php-fpm和mongodb之类的产品在OpenVZ主机上面内存出现巨额消耗。

 

在几乎相同的设置的Xen主机上面就没有这样的问题。

2014年7月29日更新

 

这篇博文发表在 开发运维 | Dev Ops 目录下,标签为 , , , ,
如需引用,请使用链接:https://note.mc256.dev/?p=24

This article published in 开发运维 | Dev Ops with tags , , , , .
Cite this page using this link:https://note.mc256.dev/?p=24

您的邮箱地址不会被公开,评论使用Gravatar头像。
Your email address will not be published. This blog is using Gravatar.

正在提交评论... Submitting ...
正在为您准备评论控件 Loading Comment Plugin
Copyright © 2013-2024 mc256. All Rights Reserved.
Powered by WordPress on top of a dual-stack k3s Cluster using JuiceFS.
Wordpress Theme Designed By mc256.
Encrypted By Let's Encrypt.  Hosted On Linode + OVH + AWS.
DNS Provided By Hostker.
Status Page by CloudFlare Worker.