不断必须重新加载PHP-FPM

我们有一个运行nginx和PHP-FPM的负载很重的服务器。 我们在这个服务器上有6个网站,运行PHP-FPM和nginx。 软件全是vBulletin 3.8和WordPress。 数据库位于单独的服务器上。

现在,由于这些网站是非常受欢迎的网站,我们通常同时在线访问7-8,000个访问者,每个页面大部分都在数据库中。 我相信这是我们问题的原因。

因为我们在MySQL服务器上有这么多的大型数据库,而且由于这些查询在软件上可能会更好,所以我认为MySQL会偶尔无法及时地向PHP返回结果,从而产生一个级联效应,最终导致一切都停止,直到我们重新加载PHP-FPM。 我们这样做之后,事情又开始好了。

我在解决问题时遇到问题的原因是因为我无法真正辨别日志中的任何内容。 在MySQL慢速查询日志中,当停机发生时,我没有什么兴趣。 在nginx日志中,我看到成千上万的条目说读取请求超时或连接超时(到PHP-FPM)。 而在PHP-FPM日志中,我看到很多行表示“执行超时(31秒),终止

所以在这一点上,我完全不知道在哪里寻找问题。 显然,无论发生什么事情都是因为这些脚本有时执行得不够快(通常它们在一秒钟之内加载,但是会导致加载时间急剧增加)。 这种情况一天发生好几次,对我们来说已经成了一个问题。

现在我只需要一个crontab来为php5-fpm每10分钟刷新一次,这样就可以解决崩溃的问题。 当然,当PHP重新加载时,nginx会抛出一个502网关错误,所以这不是一个很好的解决scheme。

如果有问题,PHP正在运行APCcaching。 我已经在几个地方看到,在某些情况下,APC会导致挂起。

任何指针都会有帮助。 我真的很想不必担心这台机器。

当然可以提供更多信息。 只要让我知道你需要什么。

更新:我刚刚通过apc.php复制到一个web根目录并访问它来查看我们的统计信息。 事情看起来不错。 然后我点击链接去用户统计和BOOM服务器立即挂起。 我重新加载了php-fpm,然后重新加载用户统计页面,并通过罚款。 等了一会儿,再次重新加载,服务器再次挂起。

所以这绝对是APC相关的。 问题是 – 我们如何解决?

APCconfiguration:

[apc] apc.enabled="1" apc.stat = "1" apc.max_file_size = "2M" apc.localcache = "1" apc.localcache.size = "256" apc.shm_segments = "1" apc.ttl = "3600" apc.user_ttl = "7200" apc.gc_ttl = "3600" apc.cache_by_default = "1" apc.filters = "" apc.write_lock = "1" apc.num_files_hint= "10000" apc.user_entries_hint="10000" apc.shm_size = "1G" apc.mmap_file_mask=/tmp/apc.XXXXXX apc.include_once_override = "0" apc.file_update_protection="2" apc.canonicalize = "1" apc.report_autofilter="0" apc.stat_ctime="0" 

更新2:我们在这方面取得了一些进展。 事实certificate,WordPress的caching插件(W3总caching)是什么导致崩溃。 我们仍然不知道为什么,但是由于禁用了PHP,我们已经运行了PHP近4个小时,没有重新加载,没有减速,没有崩溃。 我们仍然在vBulletin论坛上使用APC,根本没有问题。 有什么方法可以确定为什么 APC崩溃? 我很喜欢在我们的WordPress安装中使用它,但不以脆弱的系统为代价。

你使用的是php-fpm,所以我build议php-fpm的孩子可以活到多久。 你需要find短暂的线程/孩子和稳定之间的甜蜜点。 对于任何生产系统,恕我直言,php-fpm默认是慷慨的。

我会减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秒,对主人发出的信号作出反应。

这应该保持您的PHP工作线程池漂亮,清新,干净。 工人被允许提出要求的时间越长,就会越不稳定。 内存泄漏的风险也较高。

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

希望这些提示可以帮助你! 记住调整和观察,不幸的是似乎没有一个经验法则,有太多的variables影响PHP的行为和稳定性。