Nginx + php-fpm-每个php-fpm在运行时处理70-100%cpu


8

我遇到以下情况:

  • 我们使用8核,8gb ram,2.6 GHz频率的linode-使用nginx + php-fpm-我们获得了非常高的cpu使用情况图(我们不想成为如此糟糕的VPS邻居)...

  • 我们一次在网站上的用户数少于100,因此这种情况也令人难以置信,这是因为我们的CPU使用率很高。

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

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

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

    pm = dynamic
    pm.max_children = 10
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 6
    
  • 我们进行此^设置是因为,按照我的解释方式,我们的内存实际上是惊人的(htop显示使用了472/7000 + mb,没有交换等),并且我们可以处理更多的进程并中断等待获得的行已处理-但不幸的是,由于每个进程在运行时对我们的cpu来说过于繁琐-我们最终将CPU驱动通过屋顶-因此我们无法处理足够的进程。

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

  • 我的点子?我已经阅读了有关使用cpulimit的信息,以确保没有任何进程花费超过分配的cpu数量-但这会使速度变慢以致无法使用吗?或者这样做,我们可以提高运行多个流程的能力-我还认为可以运行两个池-一个池用于我们的前向网站(客户体验),另一个用于后端(这在一定时间影响我们的前向站点) -正在运行消耗性报告)。

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


更新:我已经实现了memcache来存储php会话-因为该框架严重依赖于用户会话,并且我们系统的性质是员工经常一次使用多个选项卡-每个选项卡都返回到会话以确认功能/用户数据等...因此,我希望由此带来的效果有所提高-如果您愿意,欢迎对此发表评论-我将在明天达到更高的高峰时段时看看情况如何。


Nginx对于cpu密集型Web应用程序不是很好-但是我们的高cpu不好-确实很糟糕-我们正在努力修复它。没有最大的最大客户端设置,因为它应该能够支持相当数量的客户端-但是每个进程的高CPU使用率会使该功能产生偏差。我们之所以改用apache,只是因为它在cpu利用率较高的情况下会更好地解决问题-但最终,该问题更能说明网络应用程序存在问题,可能需要一段时间才能解决,但是没有比现在更早的时间来修复它了。
amurrell 2014年

当您去看医生时,他告诉您服用某些药物-因为他知道您不会听“停止喝苏打水和吃快餐”的陈述-这正是为什么对我没有很好答案的原因-因为事实是,实际上没有应用任何设置或快速修复-只是我们必须大幅度改变我们的网络应用本身的可悲事实。
amurrell 2014年

幸运的是,如果您对流行的框架有此问题,则可以选择利用缓存和丰富的文档来解决问题-但是我们处于一些模糊的随机事物上,除了框架本身,我们无法更改。好极了!
amurrell 2014年

1
因此,据我了解,opcache将您的PHP代码存储为二进制文件,并且可以被php-fpm更快地使用(缓存),但是您还应该利用对象缓存。一个示例是将整个页面输出存储为“对象” ”,例如memcached。这实际上将缓存页面输出(或其他您想要的内容,例如php会话等)...接下来,您还可以使用清漆,它是反向代理-但基本上它是请求和服务器之间的中间人,因此您服务器不会直接受到请求的攻击-它可以从内存中工作以提供缓存的网址。
amurrell 2014年

1
Varnish对此非常棒-将从服务器获取的内容的缓存副本存储在内存中-因此varnish承担了很多负载。我目前的雇主在nginx上,我们使用清漆和memcached。幸运的是,我们现在使用的框架具有自己的缓存机制来确定页面缓存(输出的页面数据)。在我的上一份工作中,我不得不自己将其编写到框架中-不好玩,但是可以工作。Apache-我不会回头,除非您没有时间修复nginx。.我讨厌回头,但这是唯一的解决方案是在编写缓存机制时不完全杀死我们的项目。
amurrell 2014年

Answers:


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

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

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

希望这些技巧对您有所帮助!请记住要进行调整和观察,不幸的是,似乎所有这些似乎都没有经验法则,正如您所观察到的那样,有太多变量影响PHP的行为和稳定性。

最后,您查询的CPU限制功能记录在这里,但是如果您用尽其他所有选项,我只会求助于此。如果您选择此路径,我肯定会注意PHP-FPM调整与limits.conf配置之间可能存在的相互作用。到那时,etckeeper可能就是救生员!:)

祝好运!

鲁本


我明天将尝试限制max_requests-似乎我们允许的每个进程都想吃掉CPU,所以这可能是个好主意。我们正在使用紧急重启阈值,但我的数字略高-我将尝试使用您的阈值,看看情况如何。多谢您的协助-非常感谢。是否想知道您对缓存的想法?我想知道利用php缓存是否意味着必须定制框架来处理它。我对这个概念很陌生。
amurrell 2014年

3

您正在运行操作码缓存,对吗?

它曾经是APC,但在相当长一段时间以来一直是个小问题,并已由Zend Opcache取代,后者从5.5开始成为PHP的一部分,并且在PECL中有5.3的反向移植和5.4。


我对这个Zend OpCache感兴趣-我们在5.3上-如果您可以扩展这个答案,我将非常感谢!
amurrell 2014年

我们有xcache-但现在我选择了Zend Opcache,并已安装它并确认它已在phpinfo()中启动并运行。我会告诉您我们的表现是否因交叉手指
amurrell 2014年

我现在必须禁用zend opcache-一切正常,除了任何由dynamic-php生成的css或js文件。我试图将来自opcache的那些文件列入黑名单-但是要么黑名单不起作用,要么我无法说出为什么opcache导致nginx仅针对那些文件导致502错误的网关错误。我需要它们作为模板,它们是不良框架的一部分。在Nginx日志中,我收到大量的readv失败-104对等连接错误。
amurrell 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.