即使实例运行状况良好,Elastic Beanstalk 也会报告 5xx 错误

Posted

技术标签:

【中文标题】即使实例运行状况良好,Elastic Beanstalk 也会报告 5xx 错误【英文标题】:Elastic Beanstalk reports 5xx errors even though instances are in perfect health 【发布时间】:2016-09-06 13:34:47 【问题描述】:

我需要设置一个 api 应用程序来收集要在推荐引擎中使用的事件数据。这是我的设置:

具有负载均衡器和自动缩放组的 Elastic Beanstalk 环境。 我有 2 个 t2.medium 实例在负载均衡器后面运行。 EBS 配置是运行 Tomcat 8 Java 8 的 64 位 Amazon Linux 2016.03 v2.1.1 此外,我还有 8 个 t2.micro 实例用于高负载测试 api,每秒发送数千个请求以由 api 处理。 我使用 Locust (http://locust.io/) 作为我的负载测试工具。 由 Locust 运行的每个 t2.micro 实例最多可以发送大约 500 个请求/秒

当 reqs/sec 低于 1000,也许是 1200 时,一切正常。一旦超过了,我的负载均衡器报告它背后的一些实例正在报告 5xx 错误(附加)。我还尝试使用负载均衡器后面的 4 个实例,尽管以高达 3000req/秒的速度开始运行良好,但不久之后,ebs 运行状况工具和 Locust 都报告 503 和 504,而所有实例都处于完美运行状态根据 ebs Health Overview 中的实际数字,显示 CPU 利用率仅为 10%-20%。

在配置环境时我是否缺少某些东西?似乎无论负载均衡器后面有多少台机器,env 每秒处理的请求都不超过 1000-2000 个。


编辑: 现在我确定是 ELB 导致了问题,而不是实例。

我对 10 个模拟用户进行了负载测试。每个用户发送约 1 个请求/秒,负载增加 10 个用户/秒到 4000 个用户,这应该等于大约 4000 个请求/秒。它似乎仍然不喜欢任何超过 3.5k 请求/秒的请求率(attachment1)。

attachment2 中可以看出,负载均衡器后面的 4 个实例运行状况良好,但我仍然不断收到 503 错误。这只是负载平衡器本身造成的问题。看看 SurgeQueueLength 和 SpilloverCount 如何在某个时候迅速增加。 (attachment3)我正试图找出原因。

我还完全移除了负载均衡器,仅使用一个实例进行了测试。它最多可以处理大约 3k req/sec。 (attachment4attachment5),所以它绝对是负载均衡器。

也许我错过了负载平衡器默认具有的一些关键限制,例如 1024 的队列大小? 1 个负载均衡器的正常处理速率是多少?我应该添加更多负载均衡器吗?它可能与可用区有关吗?来自一个区域的 ELB 侦听器正在尝试路由到来自不同区域的实例?

附件1:

附件2:

附件3:

附件4:

附件5:


更新: 启用跨区域负载均衡


更新: 也许这有更多帮助:

【问题讨论】:

【参考方案1】:

消息显示“9.8% 的 ELB 请求因 HTTP 5xx(6 分钟前)失败”。这并不意味着您的实例没有返回 HTTP 5xx 响应。请求在 ELB 本身失败。当您的后端实例满负荷时(例如,连接已饱和并且它们拒绝与 ELB 的连接),可能会发生这种情况。

您的请求在 ELB 溢出。他们永远不会到达实例。如果它们在 EC2 实例上失败,则原因会有所不同,并且环境数据将与实例数据匹配。

另请注意,原因表明这是“6 分钟前”的状态。 Elastic Beanstalk 多个数据源 - 一个是来自实例的数据,它在所示表中显示每秒请求数和 HTTP 状态代码。另一个数据源是 ELB 的 cloudwatch 指标。由于 ELB 的 cloudwatch 指标是 1 分钟,因此此数据会略有延迟,原因会告诉您信息的历史时间。

【讨论】:

嗨罗希特。谢谢你的回答。我添加到我的帖子中。看看吧。 您能否尝试为您的环境启用 CrossZone 负载平衡? docs.aws.amazon.com/elasticbeanstalk/latest/dg/… hmm ...浪涌队列长度很长,这导致了尖峰。根据浪涌队列指标的定义,您的后端实例拒绝与负载均衡器的连接。 aws.amazon.com/about-aws/whats-new/2013/10/28/… "Surge Queue Length:负载均衡器排队等待后端实例接受连接并处理请求的请求数。" 对于单实例情况,您是仍然通过负载均衡器路由还是直接连接到实例?您能看到使用 netstat 在后端实例上打开了多少连接吗? 我还没有在实例本身中设置 ssh。接下来我会这样做。但是当只使用 1 个实例时,它没有负载均衡器。就其本身而言,该实例允许高达 3000k req/sec。之后,它的健康状况开始下降,CPU 利用率很高。

以上是关于即使实例运行状况良好,Elastic Beanstalk 也会报告 5xx 错误的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Web Service(Elastic Beanstalk) 实例类型 t2.large 中的多个请求运行状况下降

AWS Elastic Beanstalk 运行状况检查偶尔失败

如何确保所有实例在 Elastic Beanstalk 应用程序中运行相同的版本?

如何解决 AWS Elastic Beanstalk Django 运行状况检查问题

如何在 Elastic Beanstalk 实例上运行任意 npm 脚本

如何在Elastic Load Balancer运行状况检查中获取302重定向的URL?