

# 优化 Amazon ECS 的负载均衡器连接耗尽参数
<a name="load-balancer-connection-draining"></a>

为了便于优化，客户端会保持与容器服务的活动连接。这样，来自该客户端的后续请求就可以重复使用现有连接。当您想停止流向容器的流量时，可以通知负载均衡器。负载均衡器会定期检查客户端是否关闭了保持活动连接。Amazon ECS 监控负载均衡器，并等待负载均衡器报告保持活动连接已关闭的情况（目标处于 `UNUSED` 状态）。

负载均衡器等待将目标移至 `UNUSED` 状态的时间为取消注册延迟。您可以配置以下负载均衡器参数来加快部署速度。
+ `deregistration_delay.timeout_seconds`：300（默认值）

当您的服务响应时间小于 1 秒时，请将参数设置为以下值，使负载均衡器在中断客户端和后端服务之间的连接之前只等待 5 秒：
+ `deregistration_delay.timeout_seconds`：5 

**注意**  
当您的服务具有长期请求（例如文件上传缓慢或流式传输连接）时，请勿将该值设置为 5 秒。

## SIGTERM 响应能力
<a name="sigterm"></a>

Amazon ECS 首先向任务发送停止信号，通知应用程序需要完成并关闭。可以使用 STOPSIGNAL 指令在容器映像中定义此信号，默认为 SIGTERM。然后，Amazon ECS 会发送一条 SIGKILL 消息。当应用程序忽略 SIGTERM 时，Amazon ECS 服务必须等待发送终止该进程的 SIGKILL 信号。

Amazon ECS 等待发送 SIGKILL 消息的时间由以下 Amazon ECS 代理选项确定：
+ `ECS_CONTAINER_STOP_TIMEOUT`：30（默认值）

  有关容器代理参数的更多信息，请参阅 GitHub 上的 [Amazon ECS 容器代理](https://github.com/aws/amazon-ecs-agent/blob/master/README.md)。

要加快等待时间，请将 Amazon ECS 代理参数设置为以下值：
+ `ECS_CONTAINER_STOP_TIMEOUT`：2

  如果您的应用程序花费的时间超过 1 秒，则请将该值乘以 2，然后将该数字用作值。

在本例中，Amazon ECS 会等待 2 秒钟让容器关闭，然后 Amazon ECS 会在应用程序未停止时发送 SIGKILL 消息。

您也可以修改应用程序代码以捕获 SIGTERM 信号，并对其做出反应。以下是 JavaScript 中的示例：

```
process.on('SIGTERM', function() { 
  server.close(); 
})
```

此代码会导致 HTTP 服务器停止侦听任何新请求，完成回答任何正在处理的请求，然后 Node.js 进程因事件循环没有可进行的操作而终止。鉴于此，如果该进程只需 500 毫秒即可完成其正在处理的请求，则它会提前终止，而不必等待停止超时并收到 SIGKILL。