[Docker]容器服务是如何与cgroups协同进行资源控制的?
Docker 利用 Linux 的控制组(cgroups)来进行资源控制。cgroups 是一种内核特性,它允许对资源(例如 CPU、内存、磁盘 I/O 等)进行限制、分配和优先级分配。
Docker 利用 cgroups 进行资源限制时,他会通过 cgroups 为每个容器分配特定的资源配额。这意味着每个容器只能够使用 cgroups 中指定的 CPU 时间、内存空间、网络带宽等资源。如果容器超过了配额,那么 cgroups 将会暂时停止该容器运行,从而确保它不会消耗超过配额的资源。
以下是一些 Docker 利用 cgroups 进行资源控制的典型方式:
- CPU 配额限制:使用 cgroups 中的 cpu.shares 参数来限制容器可以使用的 CPU 时间。
- 内存配额限制:使用 cgroups 中的 memory.limit_in_bytes 参数来限制容器可以使用的内存量。
- 磁盘 I/O 配额限制:使用 cgroups 中的 blkio.weight 和 blkio.throttle.
.bps 参数来限制容器可以使用的磁盘 I/O 速率。
Docker 中的资源控制器将对应的 cgroups 参数与容器关联。例如,在使用 docker run
命令创建容器时,可以使用 --memory
选项设置内存限制,并使用 --cpu-shares
选项设置 CPU 配额。然后,Docker 将在内部实际创建一个 Cgroup 映射到这些参数,并监控用户在容器中使用的资源和行为,并执行相应的操作。
总结:Docker 利用 cgroups 实现了对 CPU、内存、磁盘 I/O、网络带宽等资源的限制和控制,确保容器使用足够但不超过配额的资源,将资源协同管理、分配和优先级分配。