小内存vps php-fpm优化

      前两天对博客进行压力测试,发现并发到100左右,站就会挂,而且很久都不能恢复,于是到服务器上面top去看,卧槽,在高并发的情况下面,php-fpm fork出了20多个进程,直接玩爆了我的512M内存,进了swap。由于我的vps存储是HDD的,IO略差,CPU性能更是感人,一旦进swap,top里面看到cpu资源就会全部卡在IO等待上面,网站当然就会GG了。

php-fpm1

      而且,就是不做压力测试,在网站空闲的情况下,php-fpm也占用了大量内存,减去cached和buffers,空闲内存常常只有100M上下。

    于是想到了对php-fpm的参数进行一定的优化,让php-fpm根据需求,更好地调整进程数,达到节省内存的目的。参考了网上的一些资料,根据自己的情况做了一定修改。

     php-fpm的配置保存在/etc目录下面,其中默认的pool是www,配置文件保存在/etc/php-fpm.d/www.conf,我们对这个文件里面的参数进行修改。

    下面列出我修改的参数

pm = dynamic
#这个选项决定着php-fpm的进程管理方式,对于小内存的vps来说,设置成dynamic可以让php-fpm根据需求自动调整进程的数量,节约内存。

pm.max_children = 10
#php-fpm最大的进程数,可以根据内存大小/40M得到,当然对于mysql、nginx都和php在同一台机子上面跑的环境,需要留出一定的余量。

pm.min_spare_servers = 3
#php-fpm在空载时,保留的最小进程数。

pm.max_spare_servers = 6
#php-fpm在空载时,保留的最大的进程数。

pm.start_servers = 3
#php-fpm启动时fork的进程数量,默认值是min_spare_servers + (max_spare_servers – min_spare_servers) / 2

pm.max_requests = 2048
#某些php模块可能存在内存溢出的情况,所以有时候可以看到某个php-fpm进程的内存占用变得奇高。设置这个参数,可以使单个进程在处理N个请求后重启,有效避免内存溢出。小内存的vps建议启用这个参数并且设置一个比较小的值。

      设置完成之后,重启php-fpm服务,使用siege对网站进行压力测试,300个并发的情况下,虽然网站响应很慢,但是测试结束以后网站数秒内立即满血复活,内存占用也降低到正常水平。而且设置好之后,网站空闲时php-fpm对系统内存的占用也降低了不少,减去cached和buffers的话,大概能有200M的空闲。

      当然,限制php-fpm进程的数量,在负载较大的情况下会影响php执行速度,如果你的网站访问量较大,php-fpm的进程数经常达到你设定的最大值,请考虑升级vps配置。

参考资料:
https://www.douban.com/note/315222037/
http://blog.csdn.net/dc_726/article/details/12340349

发表评论

电子邮件地址不会被公开。 必填项已用*标注