为什么 3 个负载平衡 EC2 服务器上的 WordPress 会耗尽内存/fpm 子进程并崩溃?

为什么 3 个负载平衡 EC2 服务器上的 WordPress 会耗尽内存/fpm 子进程并崩溃?

问题:

将 DNS 从我们的旧服务器指向我们的新服务器 30-40 分钟后,所有可用内存都被用尽,并且我们的 (3) 个负载平衡 EC2 实例崩溃。

更糟糕的是,Elastic Beanstalk 似乎没有终止崩溃的实例。我认为这是因为我们只能选择一个自动扩展触发器,而内存使用率不是可用的触发器之一。

根据 Chartbeat,我们的网站似乎有 200-400 个并发用户(Google Analytics 实时报告显示有 60-80 个用户)。

我还应该指出,我已经“解决”了这个问题,但在 EC2 实例上安装了 Varnish。使用 Varnish,服务器不会崩溃,前端速度非常快。但是,我想知道这是否是 3 个负载平衡服务器上 200 个用户的正常行为。我担心有什么地方出了问题,或者有什么地方可以调整。

规格概述:

在 AWS 上我们使用

  • 3 到 6 个负载平衡且自动扩展的 t2.large EC2 服务器(2 个 vCPU 和 8GB 内存)
  • 由 Elastic Beanstalk 管理(用于 Github 集成)
  • 经典负载均衡器
  • Cloudflare 用于 DNS 和 SSL 终止。
  • Apache 2.4
  • PHP 5.6
  • PHP FPM
  • 64 位 Amazon Linux/2.7.1 AMI

PHP 和 FPM 的配置如下:

我发现了什么

我会在美国东部时间晚上 10 点左右切换 ​​DNS,此时流量较低(Chartbeat 统计为 200 个用户,GA 统计为 60 个用户),以测试并收集信息。

大约 30-40 分钟后,所有内存都用完了。不幸的是,我没有密切关注,没有注意到内存使用量是稳步增加还是突然增加。从图中可以看出,延迟时间也激增了。

在此处输入图片描述

此时我检查了日志,发现服务器已达到其 max_children 设置:

[19-Sep-2018 22:50:40] NOTICE: fpm is running, pid 6842
[19-Sep-2018 22:50:40] NOTICE: ready to handle connections
[19-Sep-2018 23:03:21] NOTICE: Reloading in progress ...
[19-Sep-2018 23:03:21] NOTICE: reloading: execvp("php-fpm-5.6", {"php-fpm-5.6"})
[19-Sep-2018 23:03:21] NOTICE: using inherited socket fd=9, "/var/run/php-fpm/php5-fpm.sock"
[19-Sep-2018 23:03:21] NOTICE: using inherited socket fd=9, "/var/run/php-fpm/php5-fpm.sock"
[19-Sep-2018 23:03:21] NOTICE: fpm is running, pid 8293
[19-Sep-2018 23:03:21] NOTICE: ready to handle connections
[19-Sep-2018 23:33:01] WARNING: [pool www] server reached max_children setting (200), consider raising it

我可能应该将 max_children 从 200 增加回 420。但我想我没有意识到 max_children 的作用(它处理每个请求,对吗?并且每个页面视图可以请求多个图像、css、php 文件、JS 调用等?)。

但我希望 3 台 EC2 服务器能够处理此负载。特别是考虑到当前较旧的基础设施 (Rackspace) 基本上是 2 台服务器:1 台 varnish 缓存和 1 台为网站前端提供服务的服务器。这两台服务器似乎都不比新的 AWS 服务器更强大,它们只有 4 GB 内存。该服务器上的 PHPFPM 配置也低得多:

pm = dynamic
pm.max_children      = 20
pm.start_servers     = 8
pm.min_spare_servers = 5
pm.max_spare_servers = 10

这对我来说很疯狂。为什么规格较低、fpm 设置较低的旧服务器(加上 varnish 缓存)可以处理所有这些流量,而我的 3 到 6 个负载平衡 EC2 服务器却不能?

下一步

  1. 也许与旧的 Rackspace 服务器相比,EC2 服务器真的很差劲,我需要选择更大的实例?
  2. RDS 数据库是一个很大的瓶颈,在我调整它的设置之前,它不允许超过 40 个连接。也许我需要使用运行 mysql 的 EC2 服务器?(关于此问题我还有另外一个单独但相关的问题)
  3. 只要我能确保它不会干扰管理部分,通过 elasticache 的 Memcache 或 Redis 可能会有帮助。
  4. Opcache 在 php5.6 中默认启用,但我还需要做什么吗使用它?
  5. 向 elastic beanstalk 添加内存监控和额外的自动缩放触发器

答案1

这对我来说很疯狂。为什么规格较低、fpm 设置较低的旧服务器(加上 varnish 缓存)可以处理所有这些流量,而我的 3 到 6 个负载平衡 EC2 服务器却不能?

缓存命中速度极快,可能比生成动态内容快 100 倍。命中可从后端删除不必要的重复工作。

要比较托管服务提供商,您需要比较类似的设计。有缓存和没有缓存的托管服务提供商的性能特征会有很大差异。


该健康监视器屏幕截图显示 CPU 使用率和运行队列(平均负载)相对较低,但请求延迟较高。查看以/proc/meminfo确认它是否受到内存压力。如果内存是限制因素,那么增加工作线程只会带来伤害而不是帮助。

关于扩展触发器,请使用内存以外的其他方法来限制每个实例的连接数。可能是网络流量,也可能是请求数。

相关内容