9

这个问题已在 AWS 论坛上提出,但没有任何回应。以下是原问题


你好!

我们正在 ELB 后面对我们的 API 实例进行滚动升级,并且在等待连接耗尽完成时看到了惊人的长时间。场景如下:

我们正在运行两个相同的系统,一个 ELB 后面的 4x c3.large,一个用于开发的系统和一个用于生产的系统。两个系统之间的唯一区别是生产系统不断地为请求提供服务。

在没有流量的情况下,所有 4 个实例的开发系统上的滚动升级大约需要 3 分钟。在生产系统上,这些时间在 6 到 17+ 分钟之间波动。由于某些原因,我们需要平均每小时进行 2 次滚动升级,然后滚动升级需要 17 分钟以上的时间开始成为问题。

我们所有的 API 调用都小于 100 毫秒,因此没有长时间运行的请求会导致连接耗尽那么长时间。我们一直在尝试更改 ELB 上的空闲超时和连接耗尽超时的值,但没有好的结果。

当降低连接耗尽超时时,我们看到来自 API 的 502 响应,因为它强制断开连接并且降低空闲超时似乎没有效果。

总而言之,我们想知道可以做些什么来减少这些时间。由于我们的请求都小于 100 毫秒,因此理论上应该不超过一两秒来从实例中耗尽连接。我们在这里缺少什么吗?

最后一点:我们尝试一起关闭连接耗尽,这似乎比降低连接耗尽超时更好。平均而言,每次测试运行只有 1 或 2 个错误,有些运行没有错误。这是因为响应时间太快了吗?我们的响应也相对较小,因此 TCP 响应可能保存在 OS 输出缓冲区中,因此即使关闭连接耗尽它也可以响应?将连接耗尽超时设置为 0 并关闭有什么区别?

附加信息:

  • 所有流量都是 HTTPS
  • SSL 终止发生在实例上
  • 在 nginx 上启用了 keep-alive(也尝试在此处更改值而没有任何结果)

谢谢!

4

1 回答 1

11

这是一个复杂的问题,有很多变量,所以我可以提出一些建议来研究。

1) 检查您的健康检查间隔、响应超时和不健康阈值设置。如果,作为滚动升级的一部分,您在 ELB 仍在执行健康检查时终止实例,则 ELB 将等待“响应超时”的持续时间,而不管连接是否耗尽。如果将该超时设置为 1 分钟并重试 3 次(“不健康阈值”),则在 ELB 宣布实例死亡之前,每台服务器需要 3 分钟。因此,即使将连接耗尽设置为零,也不会有新请求到达该实例,但 ELB 将等待 3 分钟,直到它确定该实例实际上已死。

最坏的情况 - 乘以 4 个实例,您在 ELB 了解所有实例都已死亡之前的 12 分钟。换句话说 - ELB 正忙于等待健康检查实际上失败。

2) 您是否在终止实例之前从 ELB 注销实例?这避免了上面#1 中的问题。

3) Disabling Connection Draining 和 Enable Connection Draining with timeout value 为零应该提供等效的功能

于 2015-05-01T03:15:32.897 回答