Kev*_*vin 30 mysql nginx 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 复制到一个网络根目录并访问它以查看我们的统计信息。事情看起来不错。然后我单击链接转到用户统计数据,然后 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"
Run Code Online (Sandbox Code Playgroud)
更新 2:我们在这里取得了一些进展。事实证明,WordPress 缓存插件(W3 Total Cache)是导致崩溃的原因。我们仍然不知道为什么,但是在禁用它之后,我们已经运行 PHP 近 4 个小时了,没有重新加载、没有减速、没有崩溃。我们仍在 vBulletin 论坛上使用 APC,完全没有问题。有没有什么办法,我们可以确定为什么APC崩溃?我很想在我们的 WordPress 安装中使用它,但不会以脆弱的系统为代价。
Rou*_*ben 32
您正在使用 php-fpm,所以我建议对 php-fpm 的孩子可以活多长时间更加积极。您需要找到短期线程/子项和稳定性之间的最佳位置。对于任何生产系统,恕我直言,php-fpm 的默认设置是慷慨的方式。
我会减少生产池的pm.max_requests数量。我认为默认值是 200。我会从 50 开始,看看它会带你去哪里。
失败/补充,您还可以尝试这些全局选项(AFAIK默认情况下它们都被禁用):
emergency_restart_threshold=3
emergency_restart_interval=1m
process_control_timeout=5s
Run Code Online (Sandbox Code Playgroud)
这是什么意思?如果 3 个 PHP-FPM 子进程在 1 分钟内以 SIGSEGV 或 SIGBUS 退出(即崩溃),则 PHP-FPM 应该自动重新启动。子进程等待 5 秒对来自主进程的信号作出反应。
这应该使您的 PHP 工作线程池保持良好、新鲜和干净。一个工人被允许提供请求的时间越长,它就会变得越不稳定。内存泄漏的风险也更高。
这是我在这里提到的所有配置选项以及其他配置选项的一个很好的概述:http : //myjeeva.com/php-fpm-configuration-101.html
希望这些技巧能帮到你!记住要调整和观察,不幸的是,这一切似乎没有经验法则,影响 PHP 行为和稳定性的变量太多了。
| 归档时间: |
|
| 查看次数: |
34107 次 |
| 最近记录: |