首先介绍一下如何设置PHP-FPM以实现高吞吐量,低延迟和更稳定的CPU和内存使用。默认情况下,大多数设置都将PHP-FPM的PM(进程管理器)字符串设置为动态,而且如果遇到可用内存问题,还需要使用ondemand(按需)。但是,让我们比较基于php.net文档的两个管理选项(我比较最喜欢的设置 - pm static ):
- 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确定
.P.S. pm = ondemand的工作模式是这个样子的,每个闲置进程,在持续闲置了pm.process_idle_timeout秒后就会被杀掉,如果服务器长时间没有请求,就只会有一个php-fpm主进程,当然弊端是,遇到高峰期或者如果pm.process_idle_timeout的值太短的话,无法避免服务器频繁创建进程的问题
PHP-FPM过程管理器(PM)与CPUFreq(动态调频)的共同点
我们再来看一下CPUFreq的相关参数:看完之后就会觉得相似度很高了
- Governor = ondemand:根据当前负载动态缩放CPU频率。当跳到最高频率后,会随着空闲时间的增加而缩小
- Governor = conservative: 根据当前负载动态缩放频率。比ondemand逐渐缩放频率更低,也就是更缓慢。
- Governor = performance: 总是以最高频率运行CPU。
使用CPU调速器后,性能可以更加安全的提升,因为它几乎完全取决于服务器CPU的限制。其他的是诸如散热,电池寿命(笔记本电脑)以及将CPU频率计时设为为100%的其他因素。一旦设置为performance
,它确实是CPU的最快设置。例如,阅读关于Raspberry Pi(树莓派)上的'force_turbo',这会迫使RPi板使用性能调节器,但是由于CPU时钟速度较低,性能改进更为明显。
使用'pm静态'来实现服务器的最高性能
PHP-FPM pm static设置在很大程度上取决于服务器有多少空闲内存。基本上,如果你的服务器内存很低,那么pm ondemand或dynamic可能是更好的选择。另一方面,如果您拥有可用的内存,则可以通过将pm静态设置为服务器的最大容量来避免大部分PHP进程管理器(PM)开销。换句话说,当你进行数学运算时,应将pm.static设置为可运行的最大数量的PHP-FPM进程,而不会创建内存可用性或缓存压力问题。此外,还不至于压倒CPU(s),还有一堆未决的PHP-FPM操作。
什么时候使用pm 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
在这种情况下,pm.min太低,并且由于网络流量随着下降和峰值波动很大,所以使用pm dynamic可能难以正确调整。常见的建议是使用pm ondemand。然而,情况可能会更糟,因为ondemand会在空闲时没有流量时关闭空闲进程,然后最终会产生与流量波动一样多的开销问题 - 除非您设置空闲超时非常高......在这种情况下,您应该只使用pm.static +更高的pm.max_requests。
但是,当您拥有多个PHP-FPM池时,PM dynamic特别是ondemand可以为您节省时间。例如,在不同池中托管多个cPanel帐户或多个网站。例如,我有一台服务器,拥有100多个cPanel帐户和大约200多个域名,并且pm.static,甚至dynamic的执行都不可能。只有ondemand表现良好,因为超过三分之二的网站几乎没有流量。而按需响应,这意味着所有的空闲进程将被关闭节省大量的服务器内存!值得庆幸的是,cPanel开发者已经明白了这一点,现在它默认为ondemand。以前使用默认dynamic模式,它使得PHP-FPM不是繁忙的共享服务器上的一个选项。许多人会使用suPHP,因为即使在闲置的cPanel PHP-FPM池/帐户中,pm也会动态地消耗内存。所以,如果你的应用有很大的流量,你不会在拥有大量PHP-FPM池(共享主机)的服务器上托管,除非你穷成狗。
所以
当涉及到PHP-FPM时,一旦你开始为大流量提供服务,PHP-FPM的ondemand和dynamic流程管理器会因为固有开销而限制吞吐量。了解系统并设置PHP-FPM进程以匹配服务器的最大容量。从pm.max_children开始,根据pm dynamic或ondemand的最大使用情况设置,然后增加到内存和CPU可以处理而不会变得不堪重负的程度。您会注意到,在pm static模式下,因为您将所有内容都保存在内存中,所以随着时间的推移,流量峰值会对CPU造成较小的峰值,并且您的服务器负载和CPU平均值将变得更加平滑。每个需要手动调整的Web服务器的PHP-FPM进程的平均大小会有所不同,因此更自动化的开销流程管理器(dynamic 和ondemand )是更受欢迎的建议。