簡體   English   中英

用戶空間程序(runc)是否規定了 docker 容器進程的物理地址空間的大小?

[英]Does user space program(runc) regulate the size of physical address space of a docker container process?

以下是在 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 EC2 實例類型上運行,分配了 1 GB RAM(物理)

隨機更改這些值( "Memory" )會使容器運行或失敗,而不知道正確的失敗原因。

在失敗時,我們會在 AWS 雲中進行調試時遇到此類錯誤:

在此處輸入圖片說明

容器不在 docker 上運行。 容器是進程——它們運行在 linux 內核上。 容器是 Linux 進程(或 Windows)

Docker 容器命名空間是使用runtime·clone()系統調用在內部創建的。

在此處輸入圖片說明

內存管理將每個進程的虛擬地址空間映射到物理地址空間。 進程管理指的是虛擬地址,而不是物理地址。

對於上述代碼中的Memory: 300 MB 語法,AWS 文檔說:“呈現給容器的內存量(以 MiB 為單位)。”



在 docker 世界中, containerd為每個新容器創建 shim 進程。 runc實際上創建了一個容器進程。

1)分配RAM Memory: 300 MB size to a container process是什么意思?在上面的代碼中......它是進程的物理地址空間(或進程的虛擬地址空間)的大小嗎?

2) runc用戶空間程序是否使用runtime·clone()系統調用為每個容器進程設置物理內存空間( Memory: 300 MB)?

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

你不應該在這么小的memory中使用memory參數,記住這兩者之間有一個很大的區別,達到內存限制你的容器將被殺死

使用 memoryReservation,您的容器可以消耗更多內存,如果一個容器處於負載狀態,那么它消耗的內存將超過所需的限制。

內存預留

為容器保留的內存的軟限制(以 MiB 為單位)。 當系統內存爭用時,Docker 會嘗試將容器內存保持在這個軟限制; 但是,您的容器可以在需要時消耗更多內存

記憶

要呈現給容器的內存量(以 MiB 為單位)。 如果您的容器試圖超過此處指定的內存,則該容器將被終止。

容器定義內存

其中這個內存參數不是由容器本身控制而是由 ECS 代理控制的。

ECS_agent

如何計算每個 docker 容器所需的內存大小?

您的這個問題是一個問題,這完全取決於您將在容器中運行的底層應用程序。 我看到你正在使用 nginx 你可以在這里閱讀nginx-plus-sizing-guide

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM