微信号:we21cto

介绍:21CTO(21CTO.com)是中国项级技术专家的学习与服务平台.我们为CTO、技术总监、架构师等技术专家提供高质量的资讯、问答、活动等产品,同时与企业连接,提供技术咨询、研发、运维、技术支持、培训及人才招聘等服...

PHP-FPM调优:使用’pm static‘最大化性能

2017-12-01 23:59 21CTO

脚本语言现在都有一个Web应用服务器,由它们管理脚本的输入输出过程。比如Python有一个WCGM,用来代理,进程管理及应用监控等功能。而PHP中的PHP-FPM提供了进程管理方式,可以有效控制内存和进程。


本文描述如何最优化设置PHP-FPM,实现高吞吐量,低延迟,以及稳定的CPU和内存使用。


大多数默认情况下,PHP-FPM我们配置完就不管了,即将PHP-FPM的PM(Process Manager进程管理器)的字符串变量设置为dynamic动态方式,若遇到内存可用问题,通用的建议是用ondemand。但是,有两个管理选项却非常有用。我基于PHP.net上的文档与比较我的实践所得,针对于高流量,还有一个选项 —— Satic pm。


pm = dynamic


该指令用来设置动态子进程的数量。包括如下指令:


pm.max_children

pm.start_servers

pm.min_spare_servers

pm.max_spare_servers


pm = ondemand


进程在请求时产生,而非动态。其中 pm.start_servers 在服务启动时启动。


pm = static


子进程的数据由 pm.max_children 指定。


关于php-fpm的详细配置请参阅:http://php.net/manual/en/install.fpm.configuration.php



PHP-FPM进程管理器(PM)与CPUFreq


没错,看起来好像有点跑题,但实际上我是想把一些内容结合到本节PHP-FPM的调优主题中。


在大多数时间,我们都有CPU变慢的情况,无论是笔记本,云主机还是专用服务器。


对CPU频率处理可以使用CPUFreq 这一调控器(https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt)

这些工具在Unix、Linux和Windows上都能用,它可以通过使用ondemand参数来提升CPU频率,以此提高性能和系统响应能力。接下来,我们就来比较关于CPUFreq与PHP-FPM的那点儿事。


Governor = ondemand


根据当前负载来动调整CPU频率,可以提到最高频率 ,然后根据系统空闲状态,动态增加或减小。


Governor = conservative


根据当前负载动态调整频率。比按需调整频率会更频繁。


Governor = performance


始终以最高频率来使用CPU。关于更多详细信息,请大家参阅 CPUFreq调控器选项的完整列表。


你有注意到相似之处了么?我的用意就是想通过这个比较,希望大家使用pm-static做为PHP-FPM作为性能最优化设置的首选。


使用CPU governor,性能会得到安全的提升,它几乎完全突破了服务器CPU的限制。除了诸如热量,电池寿命(笔记本电脑)和其它副作用之外,将CPU频率永久保存到100%,保持配置不变。 比如阅读关于Raspberry Pi上的'force_turbo'设置(强制提速,详情请见:https://haydenjames.io/raspberry-pi-3-overclock/),这会强制RPi主板使用CPU governor配置,尤其在CPU时钟速度较低时,性能改进会更为明显。



使用'pm staic'来达到服务器的最高性能



PHP-FPM 上的pm static 设置上很大程度取决于服务器有多少空闲内存。如果服务器内存较小,那么ondemand或dynamic选项可能是更好的选择。


如果你有富余的内存,可以通过将pm static 设置为服务器的最大容量,避免大部分PHP进程管理器(PM)的开销。 比如进行数学运算时,pm.static设置为可以运行的最大数量的PHP-FPM进程,这样就无需频繁创建内存可用性或出现缓存压力等问题。



在上面的屏幕截图中,该服务器的pm = static和pm.max_children = 100 ,它使用的最大容量是32GB物理内存的10GB。 注意图片中突出的列。 在我截图期间,Google Analytics(分析)中大约有200个“活跃用户”(过去60秒)。 在那个时间段上,约有70%的PHP-FPM子进程仍然为闲置状态。 这意味着PHP-FPM始终设置为服务器资源的最大容量,而不管当前的流量如何。 空闲进程保持联机状态,等待流量高峰并立即响应,而不必等到下午产生子进程,然后在pm.process_idle_timeout过期后再将其关闭。


我将 pm.max_requests设置的非常高,因为这是一个没有PHP内存泄漏的生产服务器。 如果您对当前和后面的PHP脚本有110%的信心,可以使用 pm.max_requests = 0 。 然后建议重启脚本。 要避免pm开销,请将requests数设置为较高的数字。举例来说,pm.max_requests = 1000 ,这个数字取决于pm.max_children数量和每秒的请求数量。


屏幕截图使用由“u”(用户)选项过滤的Linux TOP工具(https://haydenjames.io/linux-top-customize-it/)过滤显示 PHP-FPM 用户的进程。 显示的进程数量为“top”50左右的数量,排在最前面的显示了适合终端窗口的最高统计信息。


在这种情况下,想按CPU%排序,查看所有100个PHP-FPM流程,可以使用如下指令显示所需要的内容:



 top -bn1 | grep php-fpm



何时使用ondemand 和 dynamic


使用pm dynamic,你可能会到如下类似的错误信息:


 WARNING: [pool xxxx] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 4 idle, and 59 total children


可以会尝试增加/调整设置,我也在Serverfault帖子中看到过类似的错误。 在这种情况下, pm.min值太低,并且网络流量峰值波动很大,使用pm dynamic可能难以正确调整。 常见的建议是使用pm ondemand 。 然而,情况可能会更糟糕,因为ondemand会在空闲流量很少的情况下将空闲进程关闭到0,然后最终导致流量波动的开销问题。除非设置空闲超时非常高...在这种情况下,我们应该只用pm.static + 高的 pm.max_requests 。


但是,当您拥有多个PHP-FPM池时,pm static 特别是ondemand可以节省您的时间。 例如,在不同池中托管多个cPanel帐户/多个虚拟主机。比如,我有一台服务器,拥有100多个cPanel帐户和大约200多个域名,pm.static甚至是dynamic都不可能表现良好。 只有ondemand表现良好,因为超过三分之二的网站几乎没有流量。 随之,这意味着所有的子进程将被关闭,节省大量的服务器内存! 值得庆幸的是,cPanel开发人员已经明白了这一点,默认为ondemand值。 以前他们默认使用dynamic模式,使PHP-FPM在共享服务器上不再压力过大。 


结论


当涉及到PHP-FPM时,一旦开始服务严重的流量,PHP-FPM的ondemand和dynamic流程管理器会由于固有开销而限制流量吞吐量。 


了解系统并设置PHP-FPM进程以匹配服务器到最大容量。 我们从基于pm dynamic和ondemand,以及最大使用量设置pm.max_children开始,然后增加内存和CPU可以处理,使其不会会得不堪重负。 大家会注意到,在pm static模式下,所有内容都保存在内存中。随着流量激增对CPU也只是较小的开销,使服务器的负载和CPU平均值变得更平滑。 


每个需要手动调整的Web服务器的PHP-FPM进程的平均值都有所不同,所以也是因为自动化开销进程管理器(dynamic和ondemand)更受欢迎的原因。希望这是对各位一篇有用的文章。




译者:智高

作者:Hayden James

原文:https://www.sitepoint.com/php-fpm-tuning-using-pm-static-max-performance/


 
21CTO 更多文章 Android开发与移动应用优化思想 加速优化网站的五大技巧 万维网之父:蒂姆·伯纳斯·李 写代码,就应该像音乐家谱写曲子一样来思考 王小川:热爱,会让你克服掉所有困难
猜您喜欢 Tomcat官方的集群(Cluster)配置说明 金融壹账通移动技术周报(第四十六期) 刘世锦:除了总理说的“包容审慎”,创新还有哪些规律? | 创新在中国 python网络爬虫(三) VeSpace 5.2 正式版本发布 | 分布式存储系统