17611538698
webmaster@21cto.com

PHP-FPM调优:使用“pm static”最大化性能

资讯 0 5691 2017-12-02 11:56:29

21CTO社区导读:脚本语言现在都有一个Web应用服务器,由它们管理脚本的输入输出过程。比如Python有一个WCGM,用来代理,进程管理及应用监控等功能。而PHP中的PHP-FPM提供了进程管理方式,可以有效控制内存和进程。
 
本文描述如何最优化设置PHP-FPM,实现高吞吐量,低延迟,以及稳定的CPU和内存使用。


 
cloudways-php-fpm.jpg

 
大多数默认情况下,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/insta ... n.php
 
 
PHP-FPM进程管理器(PM)与CPUFreq
 
没错,看起来好像有点跑题,但实际上我是想把一些内容结合到本节PHP-FPM的调优主题中。
 
在大多数时间,我们都有CPU变慢的情况,无论是笔记本,云主机还是专用服务器。
 
对CPU频率处理可以使用CPUFreq 这一调控器(https://www.kernel.org/doc/Doc ... s.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进程,这样就无需频繁创建内存可用性或出现缓存压力等问题。
 
/uploads/fox/02081505_0.png
 
在上面的屏幕截图中,该服务器的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流程,可以使用如下指令显示所需要的内容:
 
[size=15] top -bn1 | grep php-fpm[/size]
 

 
何时使用ondemand 和 dynamic
 
使用pm dynamic,你可能会到如下类似的错误信息:
[size=15] 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[/size]
 

可以会尝试增加/调整设置,我也在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)更受欢迎的原因。希望这是对各位一篇有用的文章。
 
/uploads/fox/02081505_1.png
 

编译:智高
作者:Hayden James
原文:https://www.sitepoint.com/php- ... ance/


评论