php 降低内存使用,一行代码就将你的PHP-FPM内存占用降低至少一半

6c687ad324870227212f5691013d288f.png

标题直译:如何减少PHP-FPM ( php5-fpm )内存占用50%

原标题:How to reduce PHP-FPM (php5-fpm) RAM usage by about 50%

PHP-FPM是PHP的FastCGI过程管理器。在类Unix操作系统(包括Linux以及BSD系统)中,PHP-FPM通过安装php5-fpm ( Linux )或者php56-fpm ( FreeBSD 10.1 )来使用。

但是缺省安装以及按照大量博客推荐安装的PHP-FPM的最大问题是它会消耗大量资源,包括内存和CPU。本博客使用的服务器也遭遇了类似的命运。因为我也是按照那些教程安装的,而教程里对于PHP-FPM的配置选项描述的不够有效。

你可以在/etc/php5/fpm/pool.d目录下发现这些低效的配置选项。举例来说,以下是我的服务器(当然不是目前这个站点)上的那些低效选项:

; Choose how the process manager will

control the number of child processes.

pm = dynamic

pm.max_children = 75

pm.start_servers = 10

pm.min_spare_servers = 5

pm.max_spare_servers = 20

pm.max_requests = 500

那台服务器是一台DigitalOcean Droplet,配置512M内存。它上面运行了一个新网站,即使完全空闲时,也必须要靠交换内存才能避免僵死。执行top命令显示了服务器上占用内存最多的进程。

PID USER PR NI VIRT RES SHR S %CPU %MEM

TIME+ COMMAND

13891 cont 20 396944 56596 33416 S 0.0 11.3

:14.05 php5-fpm

13889 cont 20 396480 56316 32916 S 0.0 11.2

:17.67 php5-fpm

13887 cont 20 624212 55088 32008 S 0.0 11.0

:14.02 php5-fpm

13890 cont 20 396384 55032 32312 S 0.0 11.0

:13.39 php5-fpm

13888 cont 20 397056 54972 31988 S 0.0 11.0

:14.16 php5-fpm

14464 cont 20 397020 54696 31832 S 0.0 10.9

:09.44 php5-fpm

13892 cont 20 396640 54704 31936 S 0.0 10.9

:12.84 php5-fpm

13883 cont 20 396864 54692 31940 S 0.0 10.9

:15.64 php5-fpm

13893 cont 20 396860 54628 32004 S 0.0 10.9

:15.13 php5-fpm

13885 cont 20 396852 54412 32116 S 0.0 10.8

:13.94 php5-fpm

13884 cont 20 395164 53916 32364 S 0.0 10.7

:13.51 php5-fpm

13989 cont 20 394960 53548 32108 S 3.7 10.7

:14.37 php5-fpm

2778 mysql 20 1359152 31704 1728 S 0.7 6.3

1:38.80 mysqld

13849 root 20 373832 1180 188 S 0.0 0.2

:03.27 php5-fpm

输出结果显示有12个php5-fpm子进程(用户名是cont )和一个主进程(用户名是root )。而这12个子进程只是呆坐在那里,什么事也不做,每个子进程白白消耗超过10%的内存。这些子进程主要是由pm=dynamic这个配置选项产生的。

老实说,绝大部分的云主机拥有者也不知道所有这些配置选项是干什么用的,只是简单地复制粘贴而已。我也不准备假装我了解每个PHP配置文件里的每一个选项的目的和意义。我在很大程度上也是复制粘贴的受害者。

但是我经常检查服务器的资源占用情况,困惑于为什么我的服务器占用这么多的内存和CPU。举另外一个例子,是这台服务器上的free -mt命令的结果:

total used free shared buffers cached

Mem: 490 480 9 31 6 79

-/+ buffers/cache: 393 96

Swap: 2047 491 1556

Total: 2538 971 1566

在没有任何访问量的情况下,也几乎有整整1G的内存(实际内存加上交换内存)被占用。当然,通过调整配置pm的数量可以有所改变,但只是轻微的。只要设置pm=dynamic,就会有空闲的子进程等在那里等待被使用。

直到读了一篇文章《A better way to run PHP-FPM》(更好地运行PHP-FPM

)之后,我开始意识到应该如何修改我的配置文件。那篇文章是大约一年前写的,令人失望的是我从昨天晚上搜索相关主题时才看到它。如果你也有服务器并且使用PHP-FPM的话,我建议你好好读一下那篇文章。

读完文章之后,我修改了我的pm选项,如下:

; Choose how the process manager will

control the number of child processes.

pm = ondemand

pm.max_children = 75

pm.process_idle_timeout = 10s

pm.max_requests = 500

最主要的改动就是用pm=ondemand替换了pm=dynamic。这一改动对资源占用的影响是巨大的。下面是改动并重新加载php5-fpm之后运行free -mt的结果:

total used free shared buffers cached

Mem: 490 196 293 28 9 70

-/+ buffers/cache: 116 373

Swap: 2047 452 1595

Total: 2538 649 1888

和之前的结果对比,内存使用量下降了50%。产生这一下降的原因通过执行top命令一目了然:

2778 mysql 20 1359152 56708 3384 S 0.0 11.3

2:11.06 mysqld

26896 root 20 373828 19000 13532 S 0.0 3.8

:02.42 php5-fpm 25818 root 20 64208 4148 1492 S 0.0 0.8 :01.88 php5-fpm

25818 root 20 64208 4148 1492 S 0.0 0.8

:01.88 php5-fpm

17385 root 20 64208 4068 1416 S 0.0 0.8

:02.23 php5-fpm 1465 ossec 20 15592 2960 480 S 0.0 0.6 :08.60 ossec-analysisd

1500 root 20 6312 2072 328 S 0.0 0.4 :45.55

ossec-syscheckd 1 root 20 33444 1940 812 S 0.0 0.4 :03.29 init

你注意到这里已经没有子进程了吗?它们去哪里了?这就是设置pm=ondemand的作用。这样设置之后,只有当有需要的时候,子进程才会被产生。事情做完之后,子进程会留在内存中10秒钟时间( pm.process_idle_timeout = 10s ),然后自己退出。

我只是对PHP-FPM的配置做了一点小小的修改,就节省了50%的内存。当然,这台服务器没有承受大并发的压力,但我相信它能顶得住合理的高负载,考虑到它只有512M内存。再加上Nginx微缓存的配置,我想它会做的更好。当然还有另外一些PHP-FPM和Percona MySQL的配置优化我还没有做。这里只是给大家分享一个我觉得非常有用的小窍门。

今天就给大家讲这么多吧,php作为开发类的一个语言,现在受到越来越多人的关注,选择合肥达内PHP培训,不再孤军奋战,轻轻松松做IT高薪白领。合肥达内培训带领有明确目标的学子迈向成功之路!

【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值