

# 管理 Amazon ECS 上的容器交换内存空间
<a name="container-swap"></a>

使用 Amazon ECS，您可以在容器级别控制基于 Linux 的 Amazon EC2 实例上的交换内存空间使用量。使用每个容器的交换配置，任务定义中的每个容器都可以启用或禁用交换。对于启用此功能的用户，可以对所用的最大交换空间量进行限制。例如，延迟关键型容器可以禁用交换。相比之下，具有高暂时内存需求的容器可以打开交换，以减少容器负载时出现内存不足错误的机率。

容器的交换配置由以下容器定义参数管理。

`maxSwap`  
容器可以使用的交换内存总量（以 MiB 为单位）。此参数会转换为 docker run 命令的 `--memory-swap` 选项，值为容器内存与 `maxSwap` 值之和。  
如果指定`maxSwap`值为`0`，则该容器不使用交换。接受的值为`0`或任何正整数。如果省略 `maxSwap` 参数，该容器将为其运行所在的容器实例使用交换配置。必须为要使用的`swappiness`参数设置`maxSwap`值。

`swappiness`  
您可以使用此功能调整容器的内存 swappiness 行为。`swappiness` 值为 `0` 不会导致交换，除非有需要。`swappiness` 值为 `100` 将导致页面被积极地交换。接受的值为`0`到`100`之间的整数。如果未指定`swappiness`参数，则使用默认值`60`。如果未指定 `maxSwap` 的值，则此参数将被忽略。此参数对应于 docker run 命令的 `--memory-swappiness` 选项。

在以下示例中，提供了 JSON 语法。

```
"containerDefinitions": [{
        ...
        "linuxParameters": {
            "maxSwap": integer,
            "swappiness": integer
        },
        ...
}]
```

## 注意事项
<a name="container-swap-considerations"></a>

在使用每个容器交换配置时，请考虑以下事项。
+ 必须在托管任务的 Amazon EC2 实例上启用和分配交换空间，以供容器使用。预设情况下，经 Amazon ECS 优化的 AMI 没有启用交换功能。必须在实例上启用交换才能使用此功能。有关更多信息，请参阅《Amazon EC2 用户指南》的中的[实例存储交换卷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-store-swap-volumes.html)**或[如何分配内存以便在 Amazon EC2 实例中用作交换空间？](https://repost.aws/knowledge-center/ec2-memory-swap-file)。
+ 仅指定 EC2 的任务定义支持交换空间容器定义参数。仅供 Fargate 上的 Amazon ECS 使用的任务定义不支持这些参数。
+ 仅 Linux 容器支持此功能。目前不支持 Windows 容器。
+ 如果任务定义中忽略了 `maxSwap` 和 `swappiness` 任务定义参数，每个容器都有默认的 `swappiness` 值 `60`。此外，总交换使用量限制为容器内存的两倍。
+ 如果您在 Amazon Linux 2023 上使用任务，则不支持 `swappiness` 参数。