AWS/ELB连接耗尽问题

Sli*_*lim 7 nginx amazon-web-services amazon-elb aws-ec2

此问题已在AWS论坛上提出,未作任何回复.以下是原始问题


嗨!

我们正在对ELB背后的API实例进行滚动升级,并且在等待连接耗尽完成时会看到令人震惊的很长时间.方案如下:

我们运行两个相同的系统,4个c3.large在ELB后面,一个系统用于开发,一个系统用于生产.两个系统之间的唯一区别是生产系统持续提供请求.

当没有流量时,对于所有4个实例,dev系统的滚动升级大约需要3分钟.在生产系统中,这些时间在6到17分钟之间波动.出于原因,我们需要平均每小时进行2次滚动升级,然后滚动升级的17+分钟开始成为问题.

我们所有的API调用都是<100ms,因此没有长时间运行的请求应该保持连接耗尽这么长时间.我们一直在改变ELB上的空闲时间和连接耗尽时间的值,没有很好的结果.

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

总而言之,我们想知道如何减少这些时间.由于我们的请求都是<100ms,理论上不应该花费一两秒钟来消耗实例的连接.我们在这里缺少什么?

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

附加信息:

  • 所有流量都是HTTPS
  • SSL终止发生在实例上
  • 在nginx上启用了keep-alive(试图在这里改变值而没有任何结果)

谢谢!

小智 7

这是一个包含许多变量的复杂问题,因此我可以提出一些建议.

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

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

2)您是否在终止ELB之前取消注册实例?这避免了上面#1中的问题.

3)禁用连接耗尽和启用超时值为零的连接耗尽应提供等效功能