0

下面是在 AWS EC2 实例(Linux)上配置 ECS 任务容器的 CloudFormation 模板:

  TodobackendTaskDefinition:
    Type: "AWS::ECS::TaskDefinition"
    Properties:
      ContainerDefinitions:

        - Name: todobackend
          Image: someacct/todobackend
          Memory: 450
          MountPoints:
            - ContainerPath: /var/www/todobackend
              SourceVolume: webroot


        - Name: nginx
          Image: someacct/todobackend-nginx
          Memory: 300
          PortMappings:
            - ContainerPort: "8000"
              HostPort: "8000"
          MountPoints:
            - ContainerPath: /var/www/todobackend
              SourceVolume: webroot

      Volumes:
        - Name: webroot
          Host:
            SourcePath: /ecs/webroot


  TodobackendAdhocTaskDefinition:
    Type: "AWS::ECS::TaskDefinition"
    Properties:
      ContainerDefinitions:
        - Name: todobackend
          Image: someacct/todobackend
          Memory: 245
          MountPoints:
            - ContainerPath: /var/www/todobackend
              SourcePath: webroot

      Volumes:
        - Name: webroot
          Host:
            SourcePath: /ecs/webroot

其中三个容器的内存属性平均分配(450+300+250 MB),假设这 3 个容器在t2.micro分配了 1 GB RAM(物理)的 EC2 实例类型上运行

随机更改这些值(of "Memory")会使容器 运行或失败,而不知道失败的正确原因。

失败时,我们会在 AWS 云中调试时收到此类错误:

在此处输入图像描述

容器不在 docker 上运行。容器是进程——它们在 linux 内核上运行。容器是 Linux 进程(或 Windows)

runtime·clone()Docker 容器命名空间是使用系统调用在内部创建的。

在此处输入图像描述

内存管理将每个进程的虚拟地址空间映射到物理地址空间。进程管理是指虚拟地址,而不是物理地址。

对于Memory: 300上述代码中的 MB 语法,AWS文档说:“要呈现给容器的内存量(以 MiB 为单位)。”



在 docker world 中,containerd为每个新容器创建 shim 进程。 runc实际上创建了一个容器进程。

1)将RAM Memory: 300MB大小分配给容器进程是什么意思?在上面的代码中......它是进程的物理地址空间(或进程的虚拟地址空间)的大小吗?

2)runc用户空间程序是否使用runtime·clone()系统调用Memory: 300为每个容器进程设置物理内存空间(MB)?

https://github.com/golang/go/blob/1650f1ba0b964a06a242c3318e85b3b46f010614/src/runtime/sys_linux_amd64.s#L540

4

1 回答 1

1

您不应该memory在如此小的内存中使用参数,记住这两者之间有一个很大的区别,当达到内存限制时,您的容器将被杀死

使用 memoryReservation,您的容器可以消耗更多内存,如果一个容器处于负载状态,那么它消耗的内存将超过所需的限制。

记忆保留

为容器保留的内存的软限制(以 MiB 为单位)。当系统内存处于争用状态时,Docker 会尝试将容器内存保持在此软限制;但是,您的容器会在需要时消耗更多内存

记忆

要呈现给容器的内存量(以 MiB 为单位)。如果您的容器试图超过此处指定的内存,则该容器将被杀死。

容器定义内存

其中此内存参数不受容器本身控制,而是由 ECS 代理控制。

ECS_agent

如何计算每个 docker 容器所需的内存大小?

如果您担心这个问题,这完全取决于您将在容器中运行的底层应用程序。我看到你正在使用 nginx 你可以在这里阅读nginx-plus-sizing-guide

于 2019-12-07T07:10:29.497 回答