目录
PHP-FPM 进程管理器 (PM) 与 CPUFreq 调节器的相似之处
使用 pm static 实现服务器的最大性能
结论
关于 PHP-FPM 调整的常见问题解答 (FAQ)
什么是 PHP-FPM,为什么它对我的服务器性能很重要?
PHP-FPM 如何提高我的网站性能?
PHP-FPM 中的 pm static 配置是什么,它如何影响性能?
如何调整 PHP-FPM 以获得最大性能?
PHP-FPM 的一些常见问题是什么,我该如何对其进行故障排除?
PHP-FPM 与其他 PHP 处理程序相比如何?
我可以将 PHP-FPM 与任何 Web 服务器一起使用吗?
什么是操作码缓存,它如何提高 PHP 性能?
如何监控 PHP-FPM 的性能?
使用 PHP-FPM 的一些最佳实践是什么?
首页 后端开发 php教程 php-fpm调整:使用' pm static'用于最大性能

php-fpm调整:使用' pm static'用于最大性能

Feb 09, 2025 am 08:25 AM

PHP-FPM tuning: Using 'pm static' for Max Performance

关键要点

  • 对于内存充足的服务器,PHP-FPM 的 pm static 设置可提供高吞吐量和低延迟。此设置使 PHP-FPM 进程始终保持最大容量,能够快速响应流量峰值,无需生成新的进程。
  • 使用 pm static 需要仔细调整,以避免内存不足或缓存压力问题。pm.max_children 应根据服务器在不影响 CPU 性能的情况下能够处理的 PHP-FPM 进程最大数量来设置。
  • 对于具有多个 PHP-FPM 池或内存较低的服务器,pm dynamicpm ondemand 可能更合适。这些设置根据当前负载调整子进程的数量,可以节省内存,但也可能导致流量波动时的开销问题。
  • 无论选择哪种设置,定期监控和调整 PHP-FPM 配置对于获得最佳性能至关重要。PHP-FPM 进程的平均大小因服务器而异,需要手动调整并清楚地了解服务器的资源和流量模式。

文章原稿未经编辑,最初发表于 HaydenJames.io,经作者许可在此转载。

让我们快速了解如何最佳设置 PHP-FPM 以实现高吞吐量、低延迟以及更稳定的 CPU 和内存使用。默认情况下,大多数设置将 PHP-FPM 的 PM(进程管理器)字符串设置为 dynamic,如果遇到可用内存问题,通常建议使用 ondemand。但是,让我们根据 php.net 的文档比较这两个管理选项,并比较我最喜欢的用于高流量设置的选项——static pm:

  • pm = dynamic:子进程的数量根据以下指令动态设置:pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers
  • pm = ondemand:进程按需在请求时生成,这与 dynamic 不同,dynamic 在服务启动时启动 pm.start_servers
  • pm = static:子进程的数量由 pm.max_children 固定。

请参阅完整的全局 php-fpm.conf 指令列表以了解更多详细信息。

PHP-FPM 进程管理器 (PM) 与 CPUFreq 调节器的相似之处

这看起来可能有点离题,但我希望将其与我们的 PHP-FPM 调整主题联系起来。好的,我们都在某些时候遇到过 CPU 速度慢的问题,无论是笔记本电脑、虚拟机还是专用服务器。还记得 CPU 频率缩放吗?(CPUFreq 调节器。)这些设置在 nix 和 Windows 系统上都可用,可以通过将 CPU 调节器设置从 ondemand 更改为 performance* 来提高性能和系统响应能力。这次,让我们比较一下描述并寻找相似之处:

  • Governor = ondemand:根据当前负载动态缩放 CPU 频率。跳到最高频率,然后随着空闲时间的增加而降低频率。
  • Governor = conservative:根据当前负载动态缩放频率。比 ondemand 更平缓地缩放频率。
  • Governor = performance:始终以最大频率运行 CPU。

请参阅完整的 CPUFreq 调节器选项列表以了解更多详细信息。

注意到相似之处了吗?我想先使用这个比较,目的是找到最佳方法来撰写一篇文章,推荐将 PHP-FPM 的 pm static 作为您的首选。

对于 CPU 调节器,performance 设置是一个相当安全的性能提升,因为它几乎完全取决于您服务器 CPU 的限制。其他因素只有诸如热量、电池寿命(笔记本电脑)以及将 CPU 频率永久设置为 100% 的其他副作用。一旦设置为 performance,它确实是 CPU 最快的设置。例如,阅读关于 Raspberry Pi 上的 force_turbo 设置的信息,该设置强制您的 RPi 板使用 performance 调节器,由于 CPU 时钟速度低,性能改进更为明显。

使用 pm static 实现服务器的最大性能

PHP-FPM pm static 设置在很大程度上取决于服务器有多少可用内存。基本上,如果您遇到服务器内存不足的问题,那么 pm ondemanddynamic 可能是更好的选择。另一方面,如果您有足够的可用内存,则可以通过将 pm static 设置为服务器的最大容量来避免大部分 PHP 进程管理器 (PM) 开销。换句话说,当您进行计算时,pm.static 应设置为在不创建内存可用性或缓存压力问题的情况下可以运行的 PHP-FPM 进程的最大数量。此外,不要设置得太高以至于压垮 CPU(s) 并导致大量未处理的 PHP-FPM 操作。

PHP-FPM tuning: Using 'pm static' for Max Performance

在上图中,此服务器的 pm = staticpm.max_children = 100,最多使用约 10GB 的 32GB 已安装内存。请注意自解释的高亮列。在该屏幕截图期间,Google Analytics 中大约有 200 个“活跃用户”(过去 60 秒)。在这个级别,大约 70% 的 PHP-FPM 子进程仍然处于空闲状态。这意味着 PHP-FPM 始终设置为服务器资源的最大容量,而不管当前流量如何。空闲进程保持在线,等待流量峰值并立即响应,而不是必须等待 pm 生成子进程,然后在 pm.process_idle_timeout 到期后将其关闭。我已经将 pm.max_requests 设置得非常高,因为这是一个没有 PHP 内存泄漏的生产服务器。如果您对当前和未来的 PHP 脚本有 110% 的信心,则可以在 static 中使用 pm.max_requests = 0。但是,建议定期重新启动脚本。将请求数设置为一个较高的数字,因为重点是避免 pm 开销。例如,至少 pm.max_requests = 1000,具体取决于您的 pm.max_children 数量和每秒请求数。

该屏幕截图使用 Linux top,按“u”(用户)选项和 PHP-FPM 用户的名称进行过滤。显示的进程数量只有大约 50 个(没有计算),但基本上 top 显示适合您终端窗口的顶级统计信息——在本例中,按 %CPU 排序。要查看所有 100 个 PHP-FPM 进程,您可以使用以下命令:

<code>top -bn1 | grep php-fpm</code>
登录后复制

何时使用 pm ondemanddynamic

使用 pm dynamic,您可能已经注意到类似以下的错误:

<code>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</code>
登录后复制

您可能会尝试增加/调整设置,但仍然会看到与 Serverfault 帖子中某人描述的相同的错误。在这种情况下,pm.min 太低,并且由于网络流量随着低谷和峰值的波动而波动很大,因此很难正确调整 pm dynamic。通常的建议是使用 pm ondemand。但是,这更糟糕,因为当流量很少或没有流量时,ondemand 会将空闲进程关闭到 0,然后您最终会遇到与流量波动一样多的开销问题——除非,当然,您将空闲超时设置为极高……在这种情况下,您应该只使用 pm.staticpm.max_requests

但是,当您有多个 PHP-FPM 池时,PM dynamic,尤其是 ondemand 可以为您节省资源。例如,托管多个 cPanel 帐户或不同池下的多个网站。例如,我有一台服务器,拥有 100 多个 cPanel 帐户和大约 200 多个域名,pm.static 甚至 dynamic 都无法很好地执行。只有 ondemand 才能很好地执行,因为超过三分之二的网站几乎没有流量。使用 ondemand,这意味着所有子进程都将关闭,从而节省大量服务器内存!值得庆幸的是,cPanel 开发人员已经解决了这个问题,现在它默认为 ondemand。以前,由于默认情况下使用 dynamic,即使在空闲的 cPanel PHP-FPM 池/帐户上,它也使 PHP-FPM 成为共享服务器上的一个选项。如果您收到良好的流量,您不太可能托管在具有大量 PHP-FPM 池(共享主机)的服务器上。

结论

在 PHP-FPM 中,一旦您开始提供大量的流量,PHP-FPM 的 ondemanddynamic 进程管理器可能会由于固有的开销而限制吞吐量。了解您的系统,并将您的 PHP-FPM 进程设置为匹配服务器的最大容量。从基于 pm dynamicondemand 的最大使用量设置 pm.max_children 开始,然后增加到内存和 CPU 能够处理而不会不堪重负的程度。您会注意到,使用 pm static,因为您让所有内容都驻留在内存中,因此随着时间的推移,流量峰值会导致 CPU 的峰值减少,并且服务器的负载和 CPU 平均值将更加平滑。您的 PHP-FPM 进程的平均大小因 Web 服务器而异,需要手动调整,因此为什么更自动化的开销进程管理器——dynamicondemand——更受欢迎的建议。希望这篇文章对您有所帮助。

更新:添加了 A/B 基准比较图表。让 PHP-FPM 进程驻留在内存中有助于提高性能,但代价是增加内存使用量以使其处于等待状态。找到您的设置最佳点。

PHP-FPM tuning: Using 'pm static' for Max Performance

关于 PHP-FPM 调整的常见问题解答 (FAQ)

什么是 PHP-FPM,为什么它对我的服务器性能很重要?

PHP-FPM 或 FastCGI 进程管理器是另一种 PHP FastCGI 实现,它具有一些对任何规模的站点(尤其是一些繁忙的站点)有用的附加功能。它对服务器性能很重要,因为它允许服务器通过利用工作进程池来处理更多同时访问者的请求。这些进程负责解析 PHP 文件、生成动态内容并将其提供给客户端。通过有效地管理这些进程,PHP-FPM 可以显著提高服务器的性能和可扩展性。

PHP-FPM 如何提高我的网站性能?

PHP-FPM 通过有效管理 PHP 进程来提高网站性能。它使用主进程来控制多个子进程,这些子进程处理 PHP 脚本。这允许有效地使用服务器资源,因为可以终止空闲进程,并且可以根据需要生成新进程。此外,PHP-FPM 支持操作码缓存,这可以通过将预编译的脚本字节码存储在共享内存中来显着加快 PHP 执行速度,从而无需 PHP 在每次请求时加载和解析脚本。

PHP-FPM 中的 pm static 配置是什么,它如何影响性能?

PHP-FPM 中的 pm static 配置将子进程的数量设置为固定数量。这意味着始终会有特定数量的进程准备好为传入请求提供服务,而不管当前服务器负载如何。这可以在高负载下带来更好的性能,因为不需要生成新进程。但是,它也可能导致更高的内存使用率,因为即使不需要这些进程,它们也始终在运行。

如何调整 PHP-FPM 以获得最大性能?

调整 PHP-FPM 以获得最大性能涉及调整多个配置设置。这些设置包括确定要使用的进程管理器的 pm 设置,以及设置子进程最大数量的 pm.max_children 设置。其他重要设置包括 pm.start_serverspm.min_spare_serverspm.max_spare_servers,它们分别控制启动的服务器数量、空闲服务器的最小数量和最大数量。将这些设置调整为匹配服务器的资源和流量模式可以显着提高性能。

PHP-FPM 的一些常见问题是什么,我该如何对其进行故障排除?

PHP-FPM 的一些常见问题包括高 CPU 使用率、响应时间慢以及与达到子进程最大数量相关的错误。这些问题通常可以通过调整 PHP-FPM 配置设置来解决,例如增加 pm.max_children 设置或切换到不同的进程管理器。此外,监控工具可用于识别瓶颈和性能问题。

PHP-FPM 与其他 PHP 处理程序相比如何?

PHP-FPM 通常被认为比其他 PHP 处理程序更高效、更灵活。它支持各种进程管理器,可以根据服务器的资源和流量模式进行调整。此外,PHP-FPM 支持操作码缓存,并且可以处理大量同时请求,这使其成为繁忙站点的理想选择。

我可以将 PHP-FPM 与任何 Web 服务器一起使用吗?

是的,PHP-FPM 可以与任何支持 FastCGI 协议的 Web 服务器一起使用。这包括流行的 Web 服务器,如 Apache、Nginx 和 Lighttpd。

什么是操作码缓存,它如何提高 PHP 性能?

操作码缓存是一种通过将预编译的脚本字节码存储在共享内存中来提高 PHP 性能的技术。这无需 PHP 在每次请求时加载和解析脚本,从而缩短了执行时间。

如何监控 PHP-FPM 的性能?

有几种工具可用于监控 PHP-FPM 的性能。这些工具包括 PHP-FPM 状态页面(提供有关工作进程当前状态的信息)以及各种命令行工具,如 topps。此外,还有一些第三方监控解决方案提供更详细的指标和警报。

使用 PHP-FPM 的一些最佳实践是什么?

使用 PHP-FPM 的一些最佳实践包括:将进程管理器设置调整为匹配服务器的资源和流量模式;启用操作码缓存;定期监控性能以识别和解决问题。此外,务必使 PHP-FPM 和 Web 服务器软件保持最新状态,以利用最新的性能改进和安全修复。

以上是php-fpm调整:使用&#x27; pm static&#x27;用于最大性能的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

PHP 8.1中的枚举(枚举)是什么? PHP 8.1中的枚举(枚举)是什么? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

描述扎实的原则及其如何应用于PHP的开发。 描述扎实的原则及其如何应用于PHP的开发。 Apr 03, 2025 am 12:04 AM

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试? 在PHPStorm中如何进行CLI模式的调试? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何用PHP的cURL库发送包含JSON数据的POST请求? 如何用PHP的cURL库发送包含JSON数据的POST请求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

See all articles