容器实例内存管理 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

容器实例内存管理

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

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

如果你的任务占用了容器实例上的所有内存,那么你的任务可能会与关键的系统进程争夺内存,并可能导致系统故障。

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

如果您为任务指定 8192 MiB,并且所有容器实例都没有 8192 MiB 或更大的可用内存来满足此要求,则无法将该任务置于您的集群中。如果您使用的是托管计算环境,则 Amazon 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 控制台(或 DescribeContainerInstancesAPI 操作)中查看容器实例注册的内存量。如果您想通过为任务提供尽可能多的特定实例类型的内存来最大限度地提高资源利用率,则可以观察该容器实例的可用内存,然后为任务分配那么多的内存。

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

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

  3. 选择基础架构,然后在容器实例下,选择一个容器实例。

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

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