不断不得不重新加载PHP-FPM


27

我们有一台运行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来每隔10分钟重新加载php5-fpm,这可以解决崩溃问题。当然,当PHP重新加载时,nginx会抛出502网关错误,因此这并不是解决方案。

如果这很重要,PHP将运行APC缓存。我读过一些地方,在某些情况下APC可能导致挂起。

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

当然,可以提供更多信息。请让我知道您的需求。

更新:我只是通过apc.php复制到Web根目录并访问它以查看我们的统计信息。事情看起来不错。然后,我单击链接转到“用户统计”,然后BOOM服务器立即挂起。我重新加载了php-fpm,然后重新加载了用户统计信息页面,一切顺利。等待一分钟,重新加载,服务器再次挂起。

因此,这似乎与APC有关。问题是-我们该如何解决?

APC配置:

[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:我们在这里已经取得了一些进展。事实证明,WordPress缓存插件(W3 Total Cache)是导致崩溃的原因。我们仍然不知道为什么,但是禁用它后,我们已经运行PHP近4个小时,没有重新加载,没有减速,没有崩溃。我们仍在vBulletin论坛上使用APC,那里根本没有问题。有什么方法可以确定为什么 APC崩溃了?我很乐意在我们的WordPress安装中使用它,但不以脆弱的系统为代价。


您可以发布任何与APC相关的设置吗?
凯尔2014年

是的,好主意。做完了
凯文

您在这台机器上有多少只ram和swap?它开始死亡时使用了多少?
凯尔

2
APC是一场令人毛骨悚然的越野车噩梦,并且多年来一直是我其中一个网站上此类崩溃的唯一来源。我终于完全摆脱了它。并且PHP现在很稳定。如果要缓存,请尝试Zend Opcache,这也是PHP 5.5中的默认缓存。
迈克尔·汉普顿

1
是的,它最终是使PHP崩溃的APC。禁用APC时,我们不再需要不断重新启动PHP。
凯文

Answers:


27

您使用的是php-fpm,因此我建议在允许php-fpm的孩子存活多长时间时要更加积极。您需要找到线程/孩子寿命短和稳定性之间的最佳结合点。php-fpm默认值是对任何生产系统恕我直言的慷慨方法。

我会减少生产池中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秒钟,以便对主机发出的信号做出反应。

这样可以使您的PHP工作线程池保持良好,新鲜和干净。允许工人提供请求的时间越长,它将变得越不稳定。内存泄漏的风险也更高。

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

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


1
您对仅使用cron每小时重新启动php5-fpm有何看法?
CMCDragonkai 2015年

2
这是一种相当笨拙的方式,而且可能根本不起作用。PHP-FPM内置了许多调整项,因此最好使用该调整项。
鲁本2015年

1
这个答案为我指明了正确的方向。我本人也遇到了类似的问题,对我来说,解决方案是将pmfrom 更改dynamicondemand,现在所有其他默认值似乎都可以正常使用。
llanato '16

(在php-fpm.conf中)应为'='而不是'',以分隔键和值。Emergency_restart_threshold = 3 Emergency_restart_interval = 1m process_control_timeout = 5s
justyy

我得到了ERROR: [/etc/php/7.0/fpm/pool.d/www.conf:135] unknown entry 'emergency_restart_threshold'
deweydb
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.