这个问题已在 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(也尝试在此处更改值而没有任何结果)
谢谢!