预留 Amazon ECS Linux 容器实例内存 - Amazon Elastic Container Service

预留 Amazon ECS Linux 容器实例内存

当 Amazon ECS 容器代理将容器实例注册到集群中时,代理必须确定容器实例可为任务预留的内存量。由于平台内存开销和系统内核占用的内存,此数量不同于 Amazon EC2 实例所标示的已安装内存量。例如,m4.large 实例具有 8GiB 的已安装内存。但是,当容器实例注册时,这并不总是转换为可用于任务的 8192MiB 内存。

Amazon ECS 容器代理提供配置变量调用的 ECS_RESERVED_MEMORY,您可以使用该变量从分配给您任务的池中移除指定 MiB 数的内存。这可以有效地为关键系统进程预留该内存。

如果您的任务占用容器实例上的所有内存,则您的任务可能会与关键系统进程争夺内存,并可能引起系统故障。

例如,如果您在容器代理配置文件中指定 ECS_RESERVED_MEMORY=256,则代理会为该实例注册总内存减去 256 MiB 后得到的内存量,这 256 MiB 内存无法由 ECS 任务分配。有关代理配置变量以及如何设置这些变量的更多信息,请参阅Amazon ECS 容器代理配置引导启动 Amazon ECS Linux 容器实例以传递数据

如果为任务指定 8192 MiB,并且没有任何容器实例具有 8192 MiB 或以上的可用内存来满足此要求,则任务无法放置在您的集群中。如果使用托管计算环境,则 AWS Batch 必须启动更大的实例类型来满足该要求。

您还应该为 Amazon ECS 容器代理以及容器实例上的其他关键系统进程预留一些内存,这样您的任务容器不会争用相同的内存从而可能引起系统故障。

Amazon ECS 容器代理使用 Docker ReadMemInfo() 函数来查询可用于操作系统的总内存。Linux 和 Windows 都提供了用来确定总内存的命令行实用程序。

例 - 确定 Linux 总内存

free 命令可返回操作系统识别的总内存。

$ free -b

运行经 Amazon ECS 优化的 Amazon Linux AMI 的 m4.large 实例的示例输出。

total used free shared buffers cached Mem: 8373026816 348180480 8024846336 90112 25534464 205418496 -/+ buffers/cache: 117227520 8255799296

此实例具有 8373026816 字节的总内存,这表示有 7985MiB 内存可用于任务。

例 - 确定 Windows 总内存

wmic 命令可返回操作系统识别的总内存。

C:\> wmic ComputerSystem get TotalPhysicalMemory

运行经 Amazon ECS 优化的 Windows Server AMI 的 m4.large 实例的示例输出。

TotalPhysicalMemory 8589524992

此实例具有 8589524992 字节的总内存,这表示有 8191MiB 内存可用于任务。

查看容器实例内存

您可以在 Amazon ECS 控制台中(或使用 DescribeContainerInstances API 操作)查看容器实例注册的内存量。如果您试图通过为特定实例类型的任务提供尽可能多的内存来最大限度地提高资源利用率,则可以观察容器实例的可用内存,然后为您的任务分配足够的内存。

查看容器实例内存
  1. https://console.aws.amazon.com/ecs/v2 打开控制台。

  2. 在导航窗格中,选择集群,然后选择托管您的容器实例的集群。

  3. 选择基础设施,然后在容器实例下选择容器实例。

  4. 资源部分显示了容器实例的已注册内存和可用内存。

    注册的内存值是容器实例首次启动时向 Amazon ECS 注册的值,可用内存值是尚未分配给任务的值。