让我们快速了解一下如何设置PHP-FPM以实现高吞吐量、低延迟和稳定使用CPU和内存。状态。大多数设置默认将PHP-FPMPM(进程管理器)设置为动态,或者当您遇到可用内存问题时通常建议按需使用。下面我们来对比一下这两个管理选项的区别和我最常用的设置——根据php.net官方文档的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指令决定。查看完整列表以深入了解所有php-fpm.conf指令。PHP-FPMProcessManager(PM)和CPUFreqGovernor之间的相似性现在,我们要说一些题外话,但我认为它与PHP-FPM调优有关。好吧,无论是笔记本电脑、虚拟机还是专用服务器,我们都曾在某个时候遇到过CPU速度慢的问题。还记得CPU频率缩放问题吗?(CPUFreqgovernor)这些设置在Unix-like系统和Windows上有效,你可以通过将CPUgovernor从ondemand修改为performance来提高性能和加快系统的响应速度。现在,我们来比较一下下面的CPUFreqgovernor描述与PHP-FPMPM有何相似之处:Governor=ondemand:根据当前负载动态调整CPU频率。先把CPU频率调到最大,然后随着空闲时间的增加降低频率。Governor=conservative:根据当前负载动态调整频率。比设置为ondemand慢。Governor=性能:始终以最大频率运行CPU。有关详细信息,请参阅CPUFreq调控器选项的详细列表。注意到相似之处了吗?这是我比较的主要目的,为了找到写这篇文章的最佳方式,我建议您使用PHP-FPM的pmstatic作为您的首选。使用CPUGovernor的性能设置是一种非常安全的提高性能的方法,因为它可以完美地利用您的服务器CPU的全部性能。唯一需要考虑的是散热、电池寿命(笔记本电脑)以及CPU始终以100%运行的一些副作用。一旦设置为性能,那么它确实是您CPU的最快设置。例如阅读RaspberryPi上的“force_turbo”设置,它教您在RPi板上使用性能调速器,由于较低的CPU时钟速度,性能提升会更加明显。使用pmstatic来优化你的服务器性能PHP-FPM的静态设置取决于你的服务器有多少空闲内存。在大多数情况下,如果您的服务器内存不足,将PM设置为ondemand或dynamic将是更好的选择。但是,一旦有空闲内存可用,将PM设置为静态最大值将减少许多PHP进程管理器(PM)强加的开销。换句话说,您应该使用pm.static来设置PHP-FPM进程的最大数量,而不会耗尽内存和缓存压力。此外,CUP和其他挂起的PHP-FPM操作的使用不会受到影响。在上面的屏幕截图中,服务器的设置(pm=static,pm.max_children=100)使用了高达10GB的内存。请注意突出显示的列。GoogleAnalytics图表中大约有200个活跃用户(在60秒内)。有了这个数量的用户,70%的PHP-FPM子进程是空闲的。这意味着无论当前流量如何,PHP-FPM始终保持足够的进程。空闲进程始终保持在线,即使在流量高峰时也能快速响应,而不是等待PM生成子进程,然后在xpm.process_idle_timeout秒后杀死进程。我将pm.max_requests设置得非常高,因为这是一个不太可能发生内存泄漏的PHP生产服务器。如果你对你的PHP脚本有110%的信心,那么你可以选择使用pm.max_requests=0。但是建议适当重启服务。将请求数设置得高是为了避免过多的PM开销。比如设置pm.max_requests=1000,但是这个需要根据pm.max_children的设置和实际每秒的请求数来决定。使用Linuxtop使用“u”(用户)选项和PHP-FPM用户名过滤屏幕截图。并且只显示前50个左右(未计数)的进程,但基本上top只会显示适合终端窗口大小的进程——在本例中,按%CPU排序。查看全部100个PHP-FPM进程,需要使用以下命令:top-bn1|grepphp-fpm当使用ondemand和dynamic使用pmdynamic时,可能会出现类似如下的错误:WARNING:[poolxxxx]seemsbusy(youmayneedtoincreasepm.start_servers,orpm.min/max_spare_servers),spawning32个孩子,有4个闲置,总共有59个孩子你可能会尝试调整pm配置,但仍然看到相同的错误\在这种情况下,pm.min太低,并且因为流量和峰值波动很大,可能是难以使用pm动态进行调整。一般建议使用pmondemand。然而,情况变得更糟,因为当没有流量时ondemand关闭空闲进程,你最终会遇到与流量波动相同的开销问题(除非你将空闲超时设置为非常非常长)但是,当你pmdynamic和当你有多个pm进程池时,尤其是ondemand可以节省你的时间。例如,在共享VPS上,有100+个cPanel帐户和200+个域名。无法使用pm.static或pm.dynamic。即使没有流量,内存也会瞬间用完。而pm.ondemand意味着所有空闲的子进程都会被彻底关闭,节省了大量的内存。cPanel的开发者意识到了这个问题,现在cPanel默认设置为pm.ondemand。结论当流量波动较大时,PHP-FPM的按需和动态会因为固有的开销而限制吞吐量。您需要了解您的系统并设置PHP-FPM进程的数量以匹配您服务器的最大容量。\从pm.max_children开始,并根据pmdynamic或ondemand的最大使用率进行设置您会注意到,在pm静态模式下,流量会随着时间的推移而出现峰值,因为您将所有内容都保存在内存中导致CPU、服务器负载和CPU平均值的峰值较少会更顺畅。需要手动调整的每个PHP-FPM进程号的平均大小会有所不同更新:附件是A/B测试的图表。转自PHP/Laravel开发者社区https://laravel-china.org/top...
