PHP-FPM 调优:为了高性能使用 pm static

让咱们快速了解如何更好的设置 PHP-FPM,以实现高吞吐量和低延迟php

默认状况下,大多数设置都将 PHP-FPM 的 PM(进程管理器)设置为 dynamic,而且若是遇到内存不足的问题,还须要使用 ondemandlinux

让咱们看一下 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(PM)与 CPUFreq 的类似之处

这看起来有点偏离主题,但我但愿将其结合到咱们的 PHP-FPM 调优主题中bash

咱们都遇到过 CPU 缓慢的问题,不管是笔记本,虚拟机仍是服务器。 服务器

你还记得 CPU 调频吗?(CPUFreq),它能够在 linux 和 Windows 上使用,能够将 CPU 频率设置为 ondemand 来提升性能和系统响应能力。php-fpm

如今,咱们来比较一下这些描述并寻找类似之处:性能

  • Governor = ondemand: 按需快速动态调整 CPU 频率, 一有 cpu 计算量的任务,就会当即达到最大频率运行,空闲时间增长就下降频率
  • Governor = conservative: 按需快速动态调整 CPU 频率, 比 ondemand 的调整更保守
  • Governor = performance: 老是运行于最大频率

有关更多详细信息,请参阅 CPUFreq 调控器选项的完整列表测试

有没有注意类似之处呢 ?spa

使用 pm static 来实现最高性能

pm static 设置在很大程度上取决于您的服务器有多少空闲内存。
基本上,若是你的服务器内存很低,那么 pm ondemanddynamic 多是更好的选择。
若是您拥有足够的内存,则能够设置 pm static 来避免大部分 PM 开销。
换句话说,当您进行数学运算时,应将 pm.static 设置为服务器可运行的最大数量的进程数,它就不会有内存不足或缓存压力的问题.net

1509365223linux_top_php-fpm-using-static-pm

在上面的截图中,PHP-FPM 的配置为 pm = staticpm.max_children = 100
它有 32GB的内存,在截图期间,Google Analytics 中约有 200 个 “活跃用户”(过去 60 秒)。
在这个级别上,约有 70% 的 PHP-FPM 进程仍然闲置。
这意味着 PHP-FPM 设置为服务器资源的最大容量后,它不会去在乎当前流量,空闲进程会保持联机状态,等待流量高峰当即响应,而没必要等到请求来了以后再建立进程

我将 pm.max_requests 设置的很是高,由于这是一个没有 PHP 内存泄漏的生产服务器。
若是您对当前和未来的 PHP 代码有 110% 的信心,能够将 pm.max_requests = 0pm static 一块儿使用

什么时候使用 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 配置,但仍然会看到一样的错误
在这种状况下,pm.min 过低,而且由于流量和峰值波动很大,使用 pm dynamic 可能难以调整

通常的建议是使用 pm ondemand。 然而,状况会变的更糟,由于 ondemand 会在没有流量时关闭空闲进程,而后最终会产生与流量波动很大同样的开销问题 (除非您设置空闲超时的时间很是很是的长)

可是,当您拥有多个 pm 进程池时,pm dynamic, 特别是 ondemand 是能够为您节省时间的

结论

当流量波动比较大的时候,,PHP-FPM 的 ondemanddynamic 会由于固有开销而限制吞吐量。 您须要了解您的系统并设置 PHP-FPM 进程数,以匹配服务器的最大容量。
pm.max_children 开始,根据 pm dynamicondemand 的最大使用状况去设置

您会注意到,在 pm static 模式下,由于您将全部内容都保存在内存中,因此随着时间的推移,流量峰值会对 CPU 形成比较小的峰值,而且您的服务器负载和 CPU 平均值将变得更加平滑。 每一个须要手动调整的 PHP-FPM 进程数的平均大小会有所不一样

附上一张 A/B 测试图
1509365219php-fpm-pm-bench

最后但愿这是一篇有用的文章 😁

本文由 Enda 翻译至 PHP-FPM tuning: Using ‘pm static’ for Max Performance
其中有一些本身的见解在里面,若是有错误欢迎纠正~ 谢谢

欢迎关注个人博客和专栏,不按期更新好文章
博客地址:https://www.phpyc.com/

相关文章
相关标签/搜索