请问一下docker是怎么实现cpu隔离的?

描述

docker是怎么实现cpu隔离的?

Docker 使用 cgroups(控制组)来实现 CPU 隔离。cgroups 是 Linux 内核的一个功能,用于限制、统计和隔离一个进程组的系统资源。对于 CPU 隔离,cgroups 提供了 CPU 子系统,Docker 利用这个子系统来限制容器的 CPU 使用。

具体来说,Docker 使用以下步骤来实现 CPU 隔离:

Cgroups 资源分配: 在启动容器时,Docker 使用 cgroups 来为容器分配 CPU 资源。这涉及将容器的进程组添加到 cgroups 中,以便内核可以对其进行资源管理。

设置 CPU 限制: Docker 允许用户通过参数(如 --cpus)指定容器可以使用的 CPU 核心数量。这通过 cgroups 的 CPU 子系统来实现,限制容器进程组对 CPU 的访问。

CPU 调度: Docker 利用 cgroups 中的 CPU 调度机制,确保容器只能在其分配的 CPU 范围内运行。这有助于防止容器占用主机上的所有 CPU 资源。

通过这些步骤,Docker 利用 Linux 内核的 cgroups 功能,实现了对容器的 CPU 隔离,使得容器能够在受限的资源环境中运行。

被分配给docker的cpu,其他进程还能使用这些cpu吗?

Docker 使用 cgroups 来进行 CPU 隔离,而 cgroups 允许将系统中的 CPU 资源划分为不同的组。当你为 Docker 容器分配 CPU 时,Docker 将创建一个 cgroup,并将容器的进程组添加到该 cgroup 中。这意味着该 cgroup 内的进程,即 Docker 容器内的进程,受到 CPU 限制。

其他未被 Docker 分配的进程,仍然在默认的 cgroup 中,可以使用系统中的所有 CPU 资源。因此,Docker 分配给容器的 CPU 并不会影响系统上运行的其他进程,它们仍然可以使用未被 Docker 占用的 CPU 资源。

总的来说,Docker 的 CPU 分配是一种限制容器内进程对 CPU 资源的访问,而不会影响系统上其他进程对未被分配的 CPU 资源的使用。

不同的docker,只能专用自己的cpu,是吗?

是的,每个 Docker 容器都可以被配置为专用自己的 CPU 资源,这是通过 Docker 的 CPU 隔离功能实现的。当你为 Docker 容器分配 CPU 时,你可以使用 --cpus 参数来指定容器可以使用的 CPU 核心数量。这样,容器内的进程将受到这一限制,只能在指定数量的 CPU 核心上运行。

例如,你可以运行以下命令来启动一个名为 "my_container" 的 Docker 容器,并限制它只能使用 2 个 CPU 核心:

 

docker run --cpus=2 --name my_container my_image

 

这就意味着 "my_container" 中的进程只能在两个 CPU 核心上运行,而不会占用系统上的所有可用 CPU 资源。其他未被分配的 CPU 资源仍然可供系统上的其他进程使用。

被分配的2个cpu,是固定被该docker容器使用,还是说上限是只能使用2个cpu,但是这2个cpu不是固定绑死的?

当你使用 --cpus 参数为 Docker 容器分配 CPU 核心时,这是设置容器的 CPU 上限,而不是具体固定的 CPU。具体来说:

上限限制: 使用 --cpus 参数,你指定了容器可以使用的最大 CPU 核心数量。在你的例子中,--cpus=2 表示容器的上限是 2 个 CPU 核心。

动态调度: 这两个 CPU 核心并不是固定绑定给容器的,而是可以在这个范围内进行动态调度。容器的进程可以在这两个核心之间进行切换,但总体而言,它们不会超过指定的上限。

这种动态调度的方式使得容器可以根据系统负载和资源可用性动态分配和释放 CPU 资源,以更好地适应变化的工作负载。总之,--cpus 参数提供了一个上限限制,容器内的进程可以在这个范围内灵活调度。

问题:我的意思是,假设现在有8个cpu,分别是cpu1到cpu8,然后分配2个cpu给某个docker进程,这2个cpu是固定的某2个cpu,还是说数量上限是2个cpu,但是具体是哪2个cpu,这个是动态变化的,是这样吗?

我明白了你的意思。当你使用 --cpus 参数为 Docker 容器分配 CPU 核心时,这是设置容器的 CPU 上限,而不是指定具体的 CPU 核心。具体来说:

上限限制: 使用 --cpus 参数,你指定了容器可以使用的最大 CPU 核心数量。在你的例子中,--cpus=2 表示容器的上限是 2 个 CPU 核心。

动态分配: 具体使用哪两个 CPU 核心是动态变化的。Docker 和 Linux 的 cgroups 机制会在可用的 CPU 核心中动态调度容器内的进程。这意味着容器内的进程可以在指定的上限内,根据系统负载和资源可用性在可用的 CPU 核心之间动态分配。

所以,虽然你设置了容器的 CPU 上限为 2 个核心,但具体是哪两个核心是由 Docker 和 Linux 内核根据系统条件动态确定的。这种动态分配的方式可以更好地适应系统的变化和负载情况。

总结

cpu隔离指的是,数量有限制。

一个docker进程,只能使用指定上限的cpu数量。

但是一个cpu,不是和某一个docker进程绑定死的。

也就是说,具体使用了哪几个cpu,这个不是固定的。但是能使用的cpu数量上限,是固定的。

为什么要有上限?就是不能让某个docker进程,把所有cpu资源都给全部霸占了。

这也是cpu隔离的意义所在。







审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分