必须不断重新加载 PHP-FPM

必须不断重新加载 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,每 10 分钟重新加载一次 php5-fpm 服务,这样就可以解决崩溃问题。当然,当 PHP 重新加载时,nginx 会抛出 502 网关错误,因此这不是很好的解决方案。

如果这很重要的话,PHP 正在运行 APC 缓存。我读到过一些文章说 APC 在某些情况下会导致挂起。

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

当然可以提供更多信息。只需告诉我您需要什么即可。

更新:我刚刚将 apc.php 复制到 Web 根目录并访问它来查看我们的统计数据。一切看起来都很好。然后我点击链接转到用户统计数据,然后服务器立即挂起。我重新加载了 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 安装上使用它,但不想以脆弱的系统为代价。

答案1

您使用的是 php-fpm,因此我建议对 php-fpm 子进程的存活时间进行更严格的限制。您需要在短暂存活的线程/子进程和稳定性之间找到最佳平衡点。在我看来,php-fpm 的默认值对于任何生产系统来说都过于宽松了。

我会减少pm.max_requests适用于您的生产池。我认为默认值是 200。我会从 50 开始,看看这会带你到哪里。

如果失败/补充这一点,您还可以尝试这些全局选项(据我所知,它们默认情况下都是禁用的):

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 的行为和稳定性。

相关内容