1. 首页
  2. 黑科技

WordPress 内存占用不断攀升问题与解决方案

原因

往往是因为php-fpmFastCGI进程一旦加载就不会释放,当其工作完成后,并不会释放给系统内存,而是休眠于FastCGI系统池中,等待下一次被唤醒。
这造成了内存不断上升的问题。
php-fpm默认配置对服务器的要求,对于这个垃圾服务器不太合适,需要修改配置文件。

解决方案

寻找配置文件并修改以下参数:

pm:表示使用哪种方式。有两个值可以选择:static(静态)或者dynamic(动态,默认)
pm.max_children:静态方式下开启的php-fpm进程数
pm.start_servers:动态方式下的起始php-fpm进程数
pm.min_spare_servers:动态方式下的最小php-fpm进程数
pm.max_spare_servers:动态方式下的最大php-fpm进程数
pm.max_requests:最大请求数

我改成:

pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 12
pm.max_requests = 320

于我的情况而言,首先是在etc目录下找到了php-fpm.conf,但其中没有发现相应参数。
文件中提到几个路径,其中一个是同目录下php-fpm.d/*.conf,找进去发现一个www.conf,里面有上述参数,修改保存。

3.3? php-fpm配置示例

这里以1GB内存的VPS配置php-fpm为演示,实际操作来看设置数值还得根据服务器本身的性能、PHP等综合考虑。

pm = dynamic #dynamic和ondemand适合小内存。
pm.max_children = 15 #static模式下生效,dynamic不生效。
pm.start_servers = 8 #dynamic模式下开机的进程数量。
pm.min_spare_servers = 6 #dynamic模式下最小php-fpm进程数量。
pm.max_spare_servers = 15 #dynamic模式下最大php-fpm进程数量。

四、解决php-fpm进程不释放内存问题

上面通过减少php-fpm进程总数来达到减少php-fpm内存占用的问题,实际使用过程中发现php-fpm进程还存长期占用内存而不释放的问题。解决的方法就是减少pm.max_requests数。

44lt5m5v77

最大请求数max_requests,即当一个 PHP-CGI 进程处理的请求数累积到 max_requests 个后,自动重启该进程,这样达到了释放内存的目的了。以1GB内存的VPS主机设置为例(如果你设置的数值没有达到释放内存可以继续调低):

pm.max_requests = 500

5q4806xvyd

php-fpm进程达到了pm.max_requests设定的数值后,就会重启该进程,从而释放内存。下图是我测试后的效果,可以看出php-fpm进程被强制结束并释放了内存。

9h3fnlor8q

五、总结

对于大内存以及对并发和可用性要求的话,建议使用static管理模式+最大的pm.max_children。如果是小内存的服务器,建议使用dynamic或者ondemand模式,同时降低pm.start_servers和pm.max_spare_servers进程数。

为什么我调整了参数没有达到应有的效果?根据wzfou.com的经验,php-fpm配置文件参数不能一概而论,必须要结合服务器自身的性能、WEB动态内容以及对可用性的要求来进行调整,内存长期占用最好是再检查一下是否有内存泄露。

 

发表评论

邮箱地址不会被公开。