下面是在 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: 300
MB大小分配给容器进程是什么意思?在上面的代码中......它是进程的物理地址空间(或进程的虚拟地址空间)的大小吗?
2)runc
用户空间程序是否使用runtime·clone()
系统调用Memory: 300
为每个容器进程设置物理内存空间(MB)?