Nginx + php-fpm - 运行时每个 php-fpm 进程 70-100% cpu

amu*_*ell 9 vps nginx central-processing-unit cache php-fpm

我有以下情况发生:

  • 我们使用 8 核、8GB 内存、2.6 GHz 的 linode - 使用 nginx + php-fpm - 我们得到了极高的 CPU 使用率图(我们不想成为如此糟糕的 VPS 邻居)...

  • 我们网站上一次只有不到 100 个用户——所以这种情况也非常尴尬——我们的 CPU 使用率非常高。

  • 我们正在使用一个非常未知的、可能是 CPU 密集型的 php-wise、可疑的可怕框架,而不是众所周知的、有据可查的、精心设计的其他框架,如 wordpress 或 drupal,其中有很多关于缓存(以及插件)的文档在 nginx + php_fpm 平台上处理缓存)php。

  • 因此,我们有大约 6 个开放的 php-fpm 进程在运行时单独消耗大量(30+,通常接近 99%)的 cpu - 我真的一点也不知道如何阻止它们使用这么多 cpu . 我不知道是哪些 php 脚本导致了这些峰值,因为它们一直在发生……通常只有 1 或 2 个正在运行 - 但是当所有 6 个脚本都运行时,我们最大化了所有 8 个 cpu。

  • 我的 pool.d/www.conf 文件具有以下设置:

    pm = dynamic
    pm.max_children = 10
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 6
    
    Run Code Online (Sandbox Code Playgroud)
  • 我们这样做 ^ 设置是因为,按照我解释它的方式,我们的内存实际上是惊人的(htop 显示使用了 472/7000+mb,没有交换等)并且我们可以处理更多进程并分解等待获取的线路已处理 - 但不幸的是,由于每个进程在运行时在我们的 CPU 上都太紧张了 - 我们最终会驱动我们的 CPU 通过屋顶 - 所以我们无法处理足够的进程。

  • 问题- 我们到底能做些什么来减少进程 php-fpm cpu 的使用,以便我们可以增加该池 conf 文件中的 php-fpm 设置- 还有,/var/log/php5- fpm.log对我们大喊大叫要增加我们的孩子并调整/增加我们的最小/最大/启动服务器。但是这样做会使我们的平均负载变得疯狂,如前所述。我们如何在不必使用缓存的情况下做到这一点,或者我们有哪些选择?

  • 我的点子?我已经阅读了有关使用 cpulimit 来确保没有进程占用超过分配数量的 cpu 的内容-但这会减慢速度以使其无法使用吗?或者这样做我们可以提高我们运行多个进程的能力 - 我还想运行两个池 - 一个用于我们的前向网站(客户体验),另一个用于后端(这会影响我们的前向网站,当时间- 正在运行消耗报告)。

  • 我已经花了几天时间研究、谷歌搜索等关于这个主题 - 这很困难,因为每个人的情况对于他们的系统来说都是如此独特 - 问题在于这样一个闻所未闻的,可能写得很糟糕的特定框架 - 正在制作很难找到解决办法。我们也不能只是废弃这个框架——我必须找到某种解决方案。


更新:我已经实现了 memcache 来存储 php 会话 - 因为该框架严重依赖于用户会话,而我们系统的性质是员工经常一次使用多个选项卡 - 每个检查回会话以确认能力/用户数据等...所以我希望看到性能有所提高-如果您愿意,欢迎对此发表评论-明天当我们度过更高的交易量高峰期时,我会看看情况如何。

Rou*_*ben 6

需要考虑的几件事(如果您已经考虑过这些,请提前道歉):首先,确保优化您的 nginx 配置并仅在绝对必要时调用 php-fpm。您要做的最后一件事是让 php 处理诸如静态 HTML 页面之类的事情(它很乐意这样做)。

其次,由于您使用的是 php-fpm,我建议您对 php-fpm 的孩子可以活多长时间更加积极。您需要找到短期线程/子项和稳定性之间的最佳位置。恕我直言,php-fpm 的默认设置对于任何生产系统来说都太过分了。一个工人被允许服务请求的时间越长,它就会变得越不稳定。还有更高的内存泄漏风险,如果您引用的这个框架存在无限循环之类的错误,这可能会导致您对 CPU 负载感到悲伤,这应该不会受到伤害。

我会减少pm.max_requests您的生产池的数量。我认为默认值是 200。我会从 50 开始,看看它会带你去哪里。

失败/补充,您还可以尝试这些全局选项(AFAIK默认情况下它们都被禁用):

emergency_restart_threshold 3
emergency_restart_interval 1m
process_control_timeout 5s
Run Code Online (Sandbox Code Playgroud)

这是什么意思?如果 3 个 PHP-FPM 子进程在 1 分钟内以 SIGSEGV 或 SIGBUS 退出(即崩溃),则 PHP-FPM 应该自动重新启动。子进程等待 5 秒对来自主进程的信号作出反应。

这是我在这里提到的所有配置选项以及其他配置选项的一个很好的概述:http : //myjeeva.com/php-fpm-configuration-101.html

希望这些技巧能帮到你!记住要调整和观察,不幸的是,这一切似乎没有经验法则,正如您所观察到的,影响 PHP 行为和稳定性的变量太多了。

最后,您询问的 CPU 限制工具记录在此处,但如果您用尽所有其他选项,我只会求助于它。如果你确实选择了这条路径,我肯定会注意 PHP-FPM 调整和你的 limits.conf 配置之间可能的交互。那时,etckeeper可能是救星!:)

祝你好运!

鲁本