最近发现服务器内存消耗方面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日更新