PHP-FPM 设置:使用 pm static 以获得最大性能

PHP-FPM 设置:使用 pm static 以获得最大性能

本文的未经编辑版本最初发表于 海登詹姆斯.io 并经她许可在此发布 作者.

我将简要告诉您如何最好地配置 PHP-FPM 以提高吞吐量、减少延迟并更一致地使用 CPU 和内存。 默认情况下,PHP-FPM 中的 PM(进程管理器)行是 动态,如果你没有足够的内存,那么最好安装 一经请求。 让我们根据 php.net 文档比较 2 个控制选项,看看我最喜欢的与它们有何不同 静止 高峰流量请pm:

pm = 动态 — 子进程的数量是根据以下指令动态配置的: pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers.
pm = 点播 - 进程是按需创建的(与动态创建相反,当服务启动时启动 pm.start_servers 时)。
pm = 静态 — 子进程的数量是固定的,由参数指示 pm.max_children.

详细信息请参见 全局指令 php-fpm.conf 的完整列表.

PHP-FPM进程管理器和CPU频率控制器之间的相似之处

这可能看起来偏离主题,但我将把它链接到 PHP-FPM 配置主题。 谁没有经历过至少一次处理器速度下降的情况——在笔记本电脑、虚拟机或专用服务器上。 还记得 CPU 频率缩放吗? 这些选项可用于 nix 和 Windows 可以通过更改处理器节流设置来提高系统性能和响应能力 一经请求表现*。 这次,我们来对比一下描述,看看有什么相似之处:

调速器=点播 — 根据当前负载动态调整处理器频率。 快速跳至最大频率,然后随着不活动时间的增加而降低频率。
州长=保守= 根据当前负载进行动态频率缩放。 比按需更平滑地增加和减少频率。
调速器=性能 — 频率始终是最大的。

详细信息请参见 处理器频率调节器参数的完整列表.

看到相似之处了吗? 我想通过这个比较来说服您最好使用 下午静态 对于 PHP-FPM。

对于处理器调节器参数 性能 有助于安全地提高性能,因为它几乎完全取决于服务器的 CPU 限制。 当然,除此之外,还有温度、电池电量(在笔记本电脑中)以及处理器持续以 100% 运行的其他副作用等因素。 性能设置可确保最快的处理器性能。 例如,阅读有关 树莓派中的force_turbo参数,RPi 面板将使用调节器 性能,由于 CPU 时钟速度较低,性能提升会更加明显。

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

PHP-FPM 选项 下午静态 很大程度上取决于服务器上的可用内存。 如果内存较低,最好选择 一经请求 или 动态。 另一方面,如果你有内存,你可以通过设置 pm 来避免 PHP 进程管理器的开销 静止 到最大服务器容量。 换句话说,如果一切都计算得很好,你需要建立 静态 可以执行的 PHP-FPM 进程的最大数量, 不会产生内存或缓存不足的问题。 但不要太高,以免压垮处理器并积累一堆等待执行的 PHP-FPM 操作.

PHP-FPM 设置:使用 pm static 以获得最大性能

在上面的屏幕截图中,服务器有 pm = 静态且 pm.max_children = 100,这占用了可用 10 GB 中的大约 32 GB。请注意突出显示的列,这里的一切都很清楚。 在此屏幕截图中,Google Analytics 中有大约 200 个活跃用户(超过 60 秒)。 在此级别,大约 70% 的 PHP-FPM 子进程仍然处于空闲状态。 这意味着无论当前流量如何,PHP-FPM 始终设置为最大服务器资源量。 空闲进程等待流量高峰并立即响应。 你不必等到 pm 将创建子进程,然后在期限到期时终止它们 pm.process_idle_timeout。 我将值设置为非常高 pm.最大请求数因为这是一个 PHP 中没有内存泄漏的工作服务器。 您可以安装 pm.max_requests = 0 如果您对现有和未来的 PHP 脚本完全有信心,请使用 static。 但最好随着时间的推移重新运行脚本。 设置大量的请求,因为我们想避免不必要的pm成本。 例如,至少 pm.max_requests = 1000 - 取决于数量 pm.max_children 以及每秒的请求数。

屏幕截图显示了该命令 Linux 顶层,按 u(用户)和 PHP-FPM 用户名过滤。 仅显示前 50 个左右的进程(我没有准确统计),但本质上 top 显示了适合终端窗口的顶部统计信息。 在本例中按 CPU 百分比 (%CPU) 排序。 要查看所有 100 个 PHP-FPM 进程,请运行以下命令:

top -bn1 | grep php-fpm

何时使用pm ondemand 和dynamic

如果你用pm 动态,会出现这样的错误:

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 动态。 通常使用pm 一经请求, 正如同一篇文章中所建议的。 但这更糟糕,因为 一经请求 当流量很少或没有流量时,将空闲进程终止为零,并且您仍然会因更改流量而产生开销。 当然,除非您设置了很长的等待时间。 然后使用比较好 静态 + 高数 pm.最大请求数.

PM 动态 特别是 一经请求 如果您有多个 PHP-FPM 池,可能会派上用场。 例如,您在不同的池中托管多个 cPanel 帐户或多个网站。 我的服务器有 100 多个 cpanel 帐户和大约 200 个域,pm.static 甚至动态都无法拯救我。 你需要的只是这里 一经请求,毕竟,超过三分之二的网站收到的流量很少或没有,并且 一经请求 所有子进程都会脱落,这将为我们节省大量内存! 幸运的是,cPanel 开发人员注意到了这一点并将该值设置为默认值 一经请求。 以前,当默认值是 动态,PHP-FPM 根本不适合繁忙的共享服务器。 很多人都用过 超级PHP, 因为下午 动态 即使池和 cPanel PHP-FPM 帐户处于空闲状态,也会消耗内存。 最有可能的是,如果流量良好,您将不会托管在具有大量 PHP-FPM 池(共享托管)的服务器上。

结论

如果您使用 PHP-FPM 并且流量很大,流程管理器 一经请求 и 动态 PHP-FPM 由于其固有的开销,吞吐量将受到限制。 了解您的系统并根据最大服务器容量配置PHP-FPM进程。 第一组 pm.max_children 取决于 pm 的最大使用量 动态 или 一经请求,然后将该值增加到内存和处理器能够正常工作而不会过载的水平。 你会注意到 下午静态,由于所有内容都在内存中,随着时间的推移,流量峰值将导致 CPU 峰值减少,服务器和 CPU 负载平均值将趋于平稳。 平均 PHP-FPM 进程大小取决于 Web 服务器,并且需要手动配置,因此更自动化的进程管理器 动态 и 一经请求 - 更流行。 我希望这篇文章有用。

UPD 添加了基准图表 ab。 如果 PHP-FPM 进程位于内存中,则性能的提高是以它们等待的内存消耗为代价的。 找到最适合自己的选择。

PHP-FPM 设置:使用 pm static 以获得最大性能

来源: habr.com

添加评论