我有以下情况发生:
我们正在使用8核,8gb ram,2.6 ghz的linode(使用nginx + php-fpm) – 我们获得了非常高的cpu使用率图表(我们不想成为如此糟糕的VPS邻居)…
我们的网站一次只有不到100个用户 – 所以这种情况也令人难以置信 – 我们的CPU使用率非常高。
我们正在使用一个非常未知的,可能是CPU密集型的PHP智慧,可怕的框架,而不是众所周知的,有据可查的,精心制作的其他框架,如WordPress或Drupal,其中有大量关于caching的文档(以及插件处理caching)在一个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 – 所以我们无法处理足够的进程。
这个问题 – 我们可以做些什么来减lessphp-fpm cpu使用的过程,这样我们可以增加php-fpm池configuration文件中的设置 – 也是, / var / log / php5- fpm.log正在大喊大叫我们增加我们的孩子,并调整/增加我们的最小/最大/启动服务器。 但是这样做会使我们的负载平均如前所述疯狂。 我们如何做到这一点,而不必使用caching或我们的select是什么?
我的想法? 我已经读过关于使用cpulimit的一些事情,以确保没有进程需要超过分配的数量的cpu – 但会减慢到不可用的东西? 或者这样做,我们可以增加我们运行多个stream程的能力 – 我还认为运行两个池 – 一个用于我们面向前方的网站(客户体验),另一个用于后端(当时间正在影响我们的前向网站消耗的报告正在运行)。
我已经花了几天的时间在这个话题上进行研究和search,这很困难,因为每个人的情况对于他们的系统来说都是独一无二的 – 麻烦就在于这样一个特定的,闻所未闻的,可能是写得不好的框架 – 很难find解决办法。 我们不能只是放弃这个框架 – 我必须find某种解决scheme。
更新:我已经实现了memcache来存储php会话 – 因为框架严重依赖于用户会话,我们的系统的性质是员工经常使用多个选项卡 – 每次检查会话以确认能力/用户数据/等…所以我希望能看到这方面的成绩有所提高 – 欢迎大家评论一下,如果你愿意的话 – 明天我们会看到我们在高峰时段的成绩。
有几件事情要考虑(如果你已经考虑过这些,请事先道歉):首先,确保优化你的nginxconfiguration,并且只在绝对必要时调用php-fpm。 你要做的最后一件事是让PHP处理静态HTML页面(它会很乐意的)。
其次,由于您使用的是php-fpm,因此我build议php-fpm的孩子可以活到多久。 你需要find短暂的线程/孩子和稳定之间的甜蜜点。 对于任何生产系统,恕我直言,php-fpm默认是太方便了。 工人被允许为请求提供服务的时间越长,就会越不稳定。 内存泄漏的风险也更高,如果你提到的这个框架有一些像无限循环一样的错误,这可能会导致CPU负载的问题,这应该不会受到影响。
我会减less生产池的pm.max_requests的数量。 我认为默认是200.我会从50开始,看看你需要去哪里。
失败/补充,你也可以尝试这些全局选项(AFAIK默认情况下都是禁用的):
emergency_restart_threshold 3 emergency_restart_interval 1m process_control_timeout 5s
这是什么意思? 如果3个PHP-FPMsubprocess在1分钟内退出SIGSEGV或SIGBUS(即崩溃),那么PHP-FPM应该自动重启。 孩子的进程等待5秒,以便对主人发出的信号作出反应。
下面是我在这里提到的所有configuration选项以及其他的一个很好的概述: http : //myjeeva.com/php-fpm-configuration-101.html
希望这些提示可以帮助你! 记住调整和观察,不幸的是,对于所有这些,似乎并没有一个经验法则,正如你所观察到的那样,有太多的variables会影响PHP的行为和稳定性。
最后,你询问的CPU限制设施在这里被logging下来 ,但是如果你耗尽了所有其他的select,我只会诉诸于它。 如果你select了这个path,我一定会留意PHP-FPM调整和你的limits.confconfiguration之间可能的交互。 在这一点etckeeper可能是一个救星! 🙂
祝你好运!
Rouben
你正在运行操作码caching,对吗?
它曾经是APC,但是这已经是一段时间了,而且已经被Zend Opcache所取代,它现在是PHP的5.5版本的一部分,并且在PECL中有一个5.3版本的backport。和5.4。