即使实例运行状况良好,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。 (attachment4 和 attachment5),所以它绝对是负载均衡器。
也许我错过了负载平衡器默认具有的一些关键限制,例如 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 运行状况检查问题