用户空间程序(runc)是否调节docker容器进程的物理地址空间的大小?

问题描述 投票:0回答:1

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

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

        - Name: todobackend
          Image: someacct/todobackend
          Memory: 450
          MountPoints:
            - ContainerPath: /var/www/todobackend
              SourceVolume: webroot
          Command:
            - uwsgi
            - "--socket /var/www/todobackend/todobackend.sock"
            - "--chmod-socket=666"
            - "--module todobackend.wsgi"
            - "--master"
            - "--die-on-term"

        - 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),假设这三个容器正在分配了1 GB RAM的t2.micro EC2实例类型上运行(物理)

["Memory"的这些值的随机更改使容器运行或失败不知道失败的适当原因。

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

enter image description here

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

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

enter image description here

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

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



在docker world中,containerd为每个新容器创建填充程序。runc实际上创建了一个容器过程。

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

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

operating-system docker-container systems-programming linux-containers containerd
1个回答
1
投票

您不应该在具有最小内存的如此小的实例中使用memory参数,请记住这两者之间有一个很大的区别,达到内存限制后,您的容器将被[[killed。

有了memoryReservation,您的容器会消耗更多的内存,如果一个容器处于加载状态,那么它将消耗的内存会超过所需的限制。

memoryReservation

为容器保留的内存的软限制(在MiB中)。什么时候系统内存处于争用状态,Docker尝试保留容器内存达到此软限制; h

但是,您的容器可以需要时消耗更多的内存]]。

内存

要提供给容器的内存量(以MiB为单位)。

如果容器尝试超出此处指定的内存被杀死。

container_definition_memory

此内存参数不受容器本身控制,但受ECS代理控制。

ECS_agent

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

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

© www.soinside.com 2019 - 2024. All rights reserved.