[Docker]容器服务是如何与cgroups协同进行资源控制的?

发布时间 2023-04-14 17:00:25作者: SkyBiuBiu

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、网络带宽等资源的限制和控制,确保容器使用足够但不超过配额的资源,将资源协同管理、分配和优先级分配。