当前位置: 首页 > 后端技术 > PHP

【译文】一行代码至少让你的PHP-FPM内存占用减少一半

时间:2023-03-30 05:03:14 PHP

标题直译:如何将PHP-FPM(php5-fpm)内存占用减少50%原标题:如何减少PHP-FPM(php5-fpm))RAMusagebyabout50%英文原文:http://linuxbsdos.com/2015/02...PHP-FPM是PHP的FastCGI进程管理器。在类Unix操作系统(包括Linux和BSD系统)中,通过安装php5-fpm(Linux)或php56-fpm(FreeBSD10.1)来使用PHP-FPM。但是默认安装和很多博主推荐的PHP-FPM最大的问题就是非常耗资源,包括内存和CPU。这个博客使用的服务器遭遇了类似的命运。因为我也是按照那些教程安装的,而教程中对PHP-FPM配置选项的描述不够有效。您可以在/etc/php5/fpm/pool.d目录中找到这些低效的配置选项。例如,这是我服务器上的那些低效选项(当然不是当前站点):选择进程管理器将如何控制子进程的数量。pm=dynamicpm.max_children=75pm.start_servers=10pm.min_spare_servers=5pm.max_spare_servers=20pm.max_requests=500该服务器是具有512M内存的DigitalOceanDroplet。它在上面运行了一个新的网站,即使在完全空闲的时候,它也不得不依靠交换内存来避免冻结。执行top命令显示服务器上占用内存最多的进程。PID用户prnivirsss%cpu%memtime+命令13891cont203969445659633416S0.011.3:14.05php5-fpm13889cont20396480php5-fpm13890cont203963845503232312S0.011.0:13.39php5-fpm13888cont203970565497231988S0.011.0:14.16php5-fpm14464cont203970205469631832S0.010.9:09.44php5-fpm13892cont203966405470431936S0.010.9:12.84php5-fpm13883cont203968645469231940S0.010.9:15.64php5-fpm13893cont203968605462832004S0.010.9:15.13php5-fpm13885cont203968525441232116S0.010.8:13.94php5-fpm13884cont203951645391632364S0.010.7:13.51php5-fpm13989续203949605354832108S3.710.7:14.37php5-fpm2778mysql201359152317041728S0.76.31:38.80mysqld13849root203738321180188S0.00.2:03.27php5-fpm输出显示有12个php5-fpm子进程(用户名为cont)和1个主进程(用户名为root)而这12个子进程就这么坐着,什么都不做,每个子进程都白白消耗了10%以上的内存。这些子进程主要由pm=dynamic配置选项生成。老实说,绝大多数云主机所有者并不知道所有这些配置选项是干什么用的,他们只是简单地复制和粘贴。我也不会假装我理解每个PHP配置文件中每个选项的目的和含义。我在很大程度上也是复制粘贴的受害者。但是我经常检查服务器的资源使用情况,很困惑为什么我的服务器占用这么多内存和CPU。再举个例子,这个服务器上free-mt命令的结果:totalusedfreesharedbufferscachedMem:490480931679-/+buffers/cache:39396Swap:20474911556Total:25389711566innoIn任意访问量的情况下,几乎要占用整整1G的内存(realmemory加上swapmemory)。当然,通过调整配置pm的数量是可以改变的,但只是轻微的。只要设置了pm=dynamic,就会有空闲的子进程在那里等待被使用。直到看了一篇文章《A better way to run PHP-FPM》(BetterRunPHP-FPM),我才开始意识到我应该如何修改我的配置文件。那篇文章大约是一年前写的,很遗憾我昨晚在搜索相关主题时才看到它。如果你也有一个服务器并使用PHP-FPM,我建议你阅读那篇文章。阅读文章后,我修改了我的pm选项如下:;选择进程管理器将如何控制子进程的数量。pm=ondemandpm.max_children=75pm.process_idle_timeout=10spm.max_requests=500主要变化是使用pm=ondemand替换pm=dynamic。这种变化对资源使用的影响是巨大的。以下是更改和重新加载php5-fpm后运行free-mt的结果:totalusedfreesharedbufferscachedMem:49019629328970-/+buffers/cache:116373Swap:20474521595Total:25386491888andbefore对比结果,内存占用下降了50%。tope:2778MySQL201359152567083384S0.011.32:11.06MySQLD26896根203738281900013532S0.013532S0.03.8:02.42PHP5-FPP5-60888888888888888888888888888888888810200682.88888888810881088100682.888810688100682.88888888881068810688100068.881001068810010688100068.0106.8812STSS0.012STSSS.32:PHP5-FPM25818根206420841481492S0.00.8:01.88php5-fpm17385根206420840681416S0.00.8:02.23PHP5-FPM1465S0.00.4:45.55ossec-syscheckd1root20334441940812S0.00.4:03.29init你有没有注意到没有子进程了?他们去哪儿了?这就是设置pm=ondemand所做的。这样设置之后,只有在必要的时候,子进程才会被派生。事情做完之后,子进程会在内存中停留10秒(pm.process_idle_timeout=10s),然后自己退出。我只是对PHP-FPM的配置做了一个小小的修改,节省了50%的内存。当然,这台服务器的并发压力并不大,但考虑到它只有512M的内存,我相信它可以承受相当高的负载。再加上Nginx微缓存的配置,我觉得会做得更好。当然还有其他的PHP-FPM和PerconaMySQL的配置优化我还没有做。这里只是跟大家分享一个我觉得非常有用的小技巧。

最新推荐
猜你喜欢